From 3b978d9d16e52062555b255c1d750428ec3b5cc8 Mon Sep 17 00:00:00 2001 From: "zhaode.wzd" Date: Wed, 27 Dec 2023 17:26:44 +0800 Subject: [PATCH] [MNN:Sync] Sync Internal 2.8.1 --- CMakeLists.txt | 2 + MNN_Render.podspec | 82 + docs/compile/tools.md | 6 +- docs/pymnn/expr.md | 19 + docs/tools/test.md | 11 + express/Executor.cpp | 2 +- express/Expr.cpp | 11 + express/NeuralNetWorkOp.cpp | 31 +- express/module/PipelineModule.cpp | 29 + include/MNN/MNNDefine.h | 2 +- include/MNN/MNNSharedContext.h | 12 + include/MNN/Tensor.hpp | 6 + include/MNN/expr/Expr.hpp | 1 + include/MNN/expr/NeuralNetWorkOp.hpp | 1 + llm/cli_demo.cpp | 64 - llm/include/llm.hpp | 23 +- llm/include/tokenizer.hpp | 3 +- llm/src/llm.cpp | 17 +- llm/src/tokenizer.cpp | 85 +- project/android/updateTest.sh | 1 + project/ios/MNN.xcodeproj/project.pbxproj | 40 +- project/ios/demo/ViewController.mm | 2 +- pymnn/pip_package/build_deps.py | 6 +- pymnn/pip_package/setup.py | 7 +- pymnn/src/expr.h | 8 + schema/current/CaffeOp_generated.h | 323 +--- schema/current/MNN_generated.h | 126 +- schema/default/CaffeOp.fbs | 15 +- schema/default/MNN.fbs | 4 - source/backend/arm82/asm/arm32/MNNGeluFP16.S | 6 +- source/backend/arm82/asm/arm64/MNNGeluFP16.S | 6 +- source/backend/cpu/CPUCast.cpp | 3 + source/backend/cpu/CPUDequantizeLinear.cpp | 87 - source/backend/cpu/CPUDequantizeLinear.hpp | 81 - source/backend/cpu/CPUOPRegister.cpp | 5 - source/backend/cpu/CPUQuantizeLinear.cpp | 85 - source/backend/cpu/CPUQuantizeLinear.hpp | 31 - source/backend/cpu/CPURaster.cpp | 10 +- source/backend/cpu/CPURuntime.cpp | 2 + source/backend/cpu/CPUUnary.cpp | 312 ++-- source/backend/cpu/arm/arm32/MNNGelu.S | 6 +- .../backend/cpu/arm/arm32/bf16/MNNGelu_BF16.S | 6 +- .../backend/cpu/compute/CommonOptFunction.cpp | 114 +- .../cpu/compute/ConvInt8TiledExecutor.cpp | 10 +- .../cpu/compute/Convolution1x1Strassen.cpp | 11 +- .../backend/cpu/compute/Int8FunctionsOpt.cpp | 2 + source/backend/cuda/CMakeLists.txt | 2 +- .../backend/cuda/execution/BinaryExecution.cu | 5 +- .../cuda/execution/ConvCutlassExecution.cu | 89 +- .../cuda/execution/ConvWinogradExecution.cu | 148 +- .../cuda/execution/ConvWinogradExecution.hpp | 1 + .../backend/cuda/execution/MatMulExecution.cu | 417 +++-- .../cuda/execution/MatMulExecution.hpp | 1 + source/backend/cuda/execution/Raster.cu | 10 +- .../CutlassConvCommonExecution.cu | 55 +- .../CutlassConvCommonExecution.hpp | 1 + source/backend/metal/AllShader.cpp | 103 +- source/backend/metal/AllShader.hpp | 1 - source/backend/metal/CMakeLists.txt | 4 + source/backend/metal/MNNMetalContext.h | 35 +- source/backend/metal/MNNMetalContext.mm | 210 +-- source/backend/metal/MetalBackend.hpp | 38 +- source/backend/metal/MetalBackend.mm | 263 ++- source/backend/metal/MetalBinary.hpp | 7 +- source/backend/metal/MetalBinary.mm | 38 +- source/backend/metal/MetalCast.hpp | 15 +- source/backend/metal/MetalCast.mm | 162 +- source/backend/metal/MetalCodeGen.py | 50 +- source/backend/metal/MetalConvolution.hpp | 2 +- source/backend/metal/MetalConvolution.mm | 56 +- source/backend/metal/MetalConvolution1x1.hpp | 2 +- source/backend/metal/MetalConvolution1x1.mm | 49 +- .../backend/metal/MetalConvolutionCommon.hpp | 7 +- .../backend/metal/MetalConvolutionCommon.mm | 37 +- .../metal/MetalConvolutionDepthwise.hpp | 2 +- .../metal/MetalConvolutionDepthwise.mm | 43 +- source/backend/metal/MetalConvolutionGEMM.hpp | 43 - source/backend/metal/MetalConvolutionGEMM.mm | 214 --- .../metal/MetalConvolutionWinograd.hpp | 2 +- .../backend/metal/MetalConvolutionWinograd.mm | 96 +- source/backend/metal/MetalDeconvolution.hpp | 10 +- source/backend/metal/MetalDeconvolution.mm | 85 +- source/backend/metal/MetalDefine.h | 13 - source/backend/metal/MetalEltwise.hpp | 10 +- source/backend/metal/MetalEltwise.mm | 36 +- source/backend/metal/MetalExecution.hpp | 21 + source/backend/metal/MetalExecution.mm | 32 + source/backend/metal/MetalFuse.hpp | 7 +- source/backend/metal/MetalFuse.mm | 221 ++- source/backend/metal/MetalGridSample.hpp | 6 +- source/backend/metal/MetalGridSample.mm | 37 +- source/backend/metal/MetalInterp.hpp | 7 +- source/backend/metal/MetalInterp.mm | 47 +- source/backend/metal/MetalLayerNorm.hpp | 7 +- source/backend/metal/MetalLayerNorm.mm | 48 +- source/backend/metal/MetalMatMul.hpp | 6 +- source/backend/metal/MetalMatMul.mm | 69 +- source/backend/metal/MetalPReLU.hpp | 8 +- source/backend/metal/MetalPReLU.mm | 42 +- source/backend/metal/MetalPooling.hpp | 7 +- source/backend/metal/MetalPooling.mm | 36 +- source/backend/metal/MetalROIPooling.hpp | 9 +- source/backend/metal/MetalROIPooling.mm | 26 +- source/backend/metal/MetalRaster.hpp | 9 +- source/backend/metal/MetalRaster.mm | 114 +- source/backend/metal/MetalReLU.hpp | 8 +- source/backend/metal/MetalReLU.mm | 44 +- source/backend/metal/MetalReLU6.hpp | 7 +- source/backend/metal/MetalReLU6.mm | 40 +- source/backend/metal/MetalReduction.hpp | 7 +- source/backend/metal/MetalReduction.mm | 36 +- source/backend/metal/MetalScale.hpp | 7 +- source/backend/metal/MetalScale.mm | 41 +- source/backend/metal/MetalSoftmax.hpp | 7 +- source/backend/metal/MetalSoftmax.mm | 42 +- source/backend/metal/MetalUnary.hpp | 7 +- source/backend/metal/MetalUnary.mm | 36 +- source/backend/metal/ShaderMap.cpp | 1 - source/backend/metal/makeshader.py | 13 +- .../backend/metal/shader/MetalBackend.metal | 11 + source/backend/metal/shader/MetalCast.metal | 30 - .../metal/shader/MetalConvolutionGEMM.metal | 64 - source/backend/metal/shader/MetalDefine.metal | 3 - source/backend/opencl/CMakeLists.txt | 5 + .../backend/opencl/core/BufferConvertor.cpp | 31 +- .../backend/opencl/core/BufferConvertor.hpp | 2 +- source/backend/opencl/core/BufferPool.cpp | 2 + source/backend/opencl/core/BufferPool.hpp | 2 + .../opencl/core/ImageBufferConvertor.cpp | 10 +- source/backend/opencl/core/OpenCLBackend.cpp | 282 ++- source/backend/opencl/core/OpenCLBackend.hpp | 45 +- .../backend/opencl/core/OpenCLOPRegister.cpp | 123 ++ .../opencl/core/OpenCLRunningUtils.cpp | 140 -- .../opencl/core/OpenCLRunningUtils.hpp | 10 - .../opencl/core/runtime/OpenCLRuntime.cpp | 58 +- .../opencl/core/runtime/OpenCLRuntime.hpp | 20 +- .../execution/buffer/ArgMaxBufExecution.cpp | 16 +- .../execution/buffer/ArgMaxBufExecution.hpp | 3 +- .../execution/buffer/BinaryBufExecution.cpp | 15 +- .../execution/buffer/CastBufExecution.cpp | 14 +- .../execution/buffer/CastBufExecution.hpp | 3 +- .../execution/buffer/ConvBufExecution.cpp | 56 +- .../execution/buffer/ConvBufExecution.hpp | 9 +- .../buffer/ConvBufLowMemoryExecution.cpp | 670 +++++++ .../buffer/ConvBufLowMemoryExecution.hpp | 68 + .../execution/buffer/ConvBufWinograd.cpp | 18 +- .../execution/buffer/ConvBufWinograd.hpp | 3 +- .../buffer/ConvSubgroupBufExecution.cpp | 18 + .../buffer/ConvSubgroupBufExecution.hpp | 3 +- .../execution/buffer/DeconvBufExecution.cpp | 17 +- .../buffer/DepthwiseConvBufExecution.cpp | 14 +- .../DepthwiseConvSubgroupBufExecution.cpp | 18 +- .../buffer/GridSampleBufExecution.cpp | 12 +- .../buffer/GridSampleBufExecution.hpp | 3 +- .../execution/buffer/Interp3DBufExecution.cpp | 13 +- .../execution/buffer/Interp3DBufExecution.hpp | 3 +- .../execution/buffer/InterpBufExecution.cpp | 13 +- .../execution/buffer/InterpBufExecution.hpp | 3 +- .../buffer/LayerNormBufExecution.cpp | 23 +- .../buffer/LayerNormBufExecution.hpp | 4 +- .../execution/buffer/LoopBufExecution.cpp | 32 +- .../execution/buffer/MatmulBufExecution.cpp | 13 +- .../execution/buffer/MatmulBufExecution.hpp | 3 +- .../execution/buffer/PoolBufExecution.cpp | 23 +- .../execution/buffer/PoolBufExecution.hpp | 3 +- .../execution/buffer/RangeBufExecution.cpp | 14 +- .../execution/buffer/RangeBufExecution.hpp | 3 +- .../execution/buffer/RasterBufExecution.cpp | 25 +- .../buffer/ReductionBufExecution.cpp | 30 +- .../buffer/ReductionBufExecution.hpp | 1 + .../execution/buffer/ReluBufExecution.cpp | 29 +- .../execution/buffer/ScaleBufExecution.cpp | 14 +- .../execution/buffer/ScaleBufExecution.hpp | 3 +- .../execution/buffer/SelectBufExecution.cpp | 14 +- .../execution/buffer/SelectBufExecution.hpp | 3 +- .../execution/buffer/SoftmaxBufExecution.cpp | 23 +- .../execution/buffer/SoftmaxBufExecution.hpp | 3 +- .../execution/buffer/UnaryBufExecution.cpp | 21 +- .../execution/buffer/UnaryBufExecution.hpp | 3 +- .../execution/cl/binary_subgroup_buf.cl | 1 + .../opencl/execution/cl/buffer_convert_buf.cl | 121 ++ source/backend/opencl/execution/cl/cast.cl | 39 + source/backend/opencl/execution/cl/conv_2d.cl | 518 +++++- .../opencl/execution/cl/conv_2d_buf.cl | 1648 +++++++++++++---- source/backend/opencl/execution/cl/gemm.cl | 209 +++ .../backend/opencl/execution/cl/gemm_buf.cl | 201 ++ .../opencl/execution/cl/opencl_program.cc | 28 +- source/backend/opencl/execution/cl/range.cl | 42 + source/backend/opencl/execution/cl/select.cl | 40 + .../opencl/execution/image/CastExecution.cpp | 158 ++ .../opencl/execution/image/CastExecution.hpp | 41 + .../execution/image/CommonExecution.cpp | 9 +- .../opencl/execution/image/ConvExecution.cpp | 149 +- .../opencl/execution/image/ConvExecution.hpp | 5 +- .../image/ConvLowMemoryExecution.cpp | 615 ++++++ .../image/ConvLowMemoryExecution.hpp | 66 + .../opencl/execution/image/ConvWinograd.cpp | 16 +- .../execution/image/DeconvExecution.cpp | 18 +- .../image/DepthwiseConvExecution.cpp | 14 +- .../image/DepthwiseDeconvExecution.cpp | 14 +- .../execution/image/EltwiseExecution.cpp | 14 +- .../opencl/execution/image/FuseExecution.cpp | 14 +- .../execution/image/GridSampleExecution.cpp | 18 +- .../execution/image/Interp3DExecution.cpp | 18 +- .../execution/image/InterpExecution.cpp | 16 +- .../execution/image/LayerNormExecution.cpp | 24 +- .../execution/image/LayerNormExecution.hpp | 1 + .../opencl/execution/image/LoopExecution.cpp | 52 +- .../execution/image/MatmulExecution.cpp | 14 +- .../image/MultiInputDWConvExecution.cpp | 10 +- .../image/MultiInputDWDeconvExecution.cpp | 14 +- .../opencl/execution/image/PoolExecution.cpp | 16 +- .../opencl/execution/image/RangeExecution.cpp | 112 ++ .../opencl/execution/image/RangeExecution.hpp | 41 + .../execution/image/RasterExecution.cpp | 25 +- .../execution/image/ReductionExecution.cpp | 30 +- .../execution/image/ReductionExecution.hpp | 1 + .../opencl/execution/image/ReluExecution.cpp | 19 +- .../execution/image/RoiPoolingExecution.cpp | 16 +- .../opencl/execution/image/ScaleExecution.cpp | 15 +- .../execution/image/SelectExecution.cpp | 104 ++ .../execution/image/SelectExecution.hpp | 41 + .../execution/image/SoftmaxExecution.cpp | 22 +- .../image/TrainableParamExecution.cpp | 4 +- .../opencl/execution/image/UnaryExecution.cpp | 19 +- .../vulkan/buffer/backend/VulkanBackend.cpp | 130 +- .../vulkan/buffer/backend/VulkanBackend.hpp | 16 + .../execution/VulkanConvolutionImpl.cpp | 5 +- .../buffer/execution/VulkanDeconvolution.cpp | 4 +- .../vulkan/buffer/execution/VulkanFuse.cpp | 41 +- .../buffer/execution/VulkanLayernorm.cpp | 8 +- .../vulkan/buffer/execution/VulkanMatMul.cpp | 9 +- .../vulkan/buffer/execution/VulkanMatMul.hpp | 4 +- .../vulkan/component/VulkanCommandPool.cpp | 4 + .../vulkan/component/VulkanCommandPool.hpp | 1 + .../backend/vulkan/component/VulkanDevice.cpp | 4 + .../backend/vulkan/component/VulkanDevice.hpp | 16 + .../vulkan/component/VulkanPipeline.cpp | 49 +- .../vulkan/component/VulkanPipeline.hpp | 9 +- .../vulkan/component/VulkanQueryPool.cpp | 41 + .../vulkan/component/VulkanQueryPool.hpp | 33 + .../vulkan/image/backend/VulkanBackend.cpp | 2 +- .../backend/vulkan/runtime/VulkanRuntime.cpp | 4 +- .../backend/vulkan/runtime/VulkanRuntime.hpp | 2 + source/core/Backend.hpp | 9 + source/core/BackendRegister.cpp | 8 + source/core/OpCommonUtils.cpp | 22 +- source/core/OpCommonUtils.hpp | 2 +- source/core/Pipeline.cpp | 4 +- source/core/Schedule.cpp | 1 + source/core/Tensor.cpp | 10 + source/geometry/GeometryBinary.cpp | 8 +- source/geometry/GeometryComputerUtils.cpp | 4 +- source/geometry/GeometryReverseSequence.cpp | 28 +- source/shape/ShapeCast.cpp | 11 - source/shape/ShapeConvolution.cpp | 4 + source/shape/ShapeRegister.cpp | 4 - source/shape/SizeComputer.cpp | 21 + test.sh | 27 +- test/op/BinaryOPTest.cpp | 14 +- test/op/MatMulTest.cpp | 11 + test/op/ReverseTest.cpp | 144 +- test/op/UnaryTest.cpp | 14 +- .../source/optimizer/PostConverter.cpp | 4 +- ...BinaryDeQuantizeLinearFuseToBinaryInt8.cpp | 120 -- .../merge/CastFuseToQuantizeLinear.cpp | 81 - .../ConvDeQuantizeLinearFuseToConvInt8.cpp | 459 ++++- .../optimizer/merge/ConvertMatMulToConv2D.cpp | 272 ++- .../ReluDequantizeLinearFuseToConvInt8.cpp | 109 -- .../optimizer/onnxextra/MatMulInteger.cpp | 19 +- .../onnxextra/OnnxConvolutionMerge.cpp | 57 +- .../onnxextra/OnnxDeQuantizeLinear.cpp | 63 +- .../source/optimizer/onnxextra/OnnxGemm.cpp | 35 + .../onnxextra/OnnxQuantizeLinear.cpp | 58 +- tools/cpp/CMakeLists.txt | 3 + tools/cpp/ExprDebug.hpp | 3 + tools/cpp/ModuleBasic.cpp | 6 + tools/cpp/fuseTest.cpp | 255 +++ tools/cpp/resfusetest/cumsum.comp | 53 + tools/cpp/resfusetest/point.txt | 20 + tools/cpp/resfusetest/vulkanTest.json | 35 + tools/script/testMNNFromOnnx.py | 2 +- 282 files changed, 9504 insertions(+), 4740 deletions(-) create mode 100644 MNN_Render.podspec delete mode 100644 llm/cli_demo.cpp delete mode 100644 source/backend/cpu/CPUDequantizeLinear.cpp delete mode 100644 source/backend/cpu/CPUDequantizeLinear.hpp delete mode 100644 source/backend/cpu/CPUQuantizeLinear.cpp delete mode 100644 source/backend/cpu/CPUQuantizeLinear.hpp delete mode 100644 source/backend/metal/MetalConvolutionGEMM.hpp delete mode 100644 source/backend/metal/MetalConvolutionGEMM.mm create mode 100644 source/backend/metal/MetalExecution.hpp create mode 100644 source/backend/metal/MetalExecution.mm delete mode 100644 source/backend/metal/shader/MetalCast.metal create mode 100644 source/backend/opencl/core/OpenCLOPRegister.cpp create mode 100644 source/backend/opencl/execution/buffer/ConvBufLowMemoryExecution.cpp create mode 100644 source/backend/opencl/execution/buffer/ConvBufLowMemoryExecution.hpp create mode 100644 source/backend/opencl/execution/cl/cast.cl create mode 100644 source/backend/opencl/execution/cl/range.cl create mode 100644 source/backend/opencl/execution/cl/select.cl create mode 100644 source/backend/opencl/execution/image/CastExecution.cpp create mode 100644 source/backend/opencl/execution/image/CastExecution.hpp create mode 100644 source/backend/opencl/execution/image/ConvLowMemoryExecution.cpp create mode 100644 source/backend/opencl/execution/image/ConvLowMemoryExecution.hpp create mode 100644 source/backend/opencl/execution/image/RangeExecution.cpp create mode 100644 source/backend/opencl/execution/image/RangeExecution.hpp create mode 100644 source/backend/opencl/execution/image/SelectExecution.cpp create mode 100644 source/backend/opencl/execution/image/SelectExecution.hpp create mode 100644 source/backend/vulkan/component/VulkanQueryPool.cpp create mode 100644 source/backend/vulkan/component/VulkanQueryPool.hpp delete mode 100644 tools/converter/source/optimizer/merge/BinaryDeQuantizeLinearFuseToBinaryInt8.cpp delete mode 100644 tools/converter/source/optimizer/merge/CastFuseToQuantizeLinear.cpp delete mode 100644 tools/converter/source/optimizer/merge/ReluDequantizeLinearFuseToConvInt8.cpp create mode 100644 tools/cpp/fuseTest.cpp create mode 100644 tools/cpp/resfusetest/cumsum.comp create mode 100644 tools/cpp/resfusetest/point.txt create mode 100644 tools/cpp/resfusetest/vulkanTest.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 11a4d3a6a..1bd799183 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -489,6 +489,7 @@ IF(MNN_COREML) IF(MNN_SEP_BUILD) list(APPEND MNN_DEPS MNNCoreML) + list(APPEND MNN_EXTRA_DEPENDS MNNCoreML) ELSE() list(APPEND MNN_OBJECTS_TO_LINK $) ENDIF() @@ -552,6 +553,7 @@ IF(MNN_OPENCL) IF(MNN_SEP_BUILD) list(APPEND MNN_DEPS MNN_CL) ELSE() + add_definitions(-DMNN_OPENCL_ENABLED=1) list(APPEND MNN_TARGETS MNN_CL) list(APPEND MNN_OBJECTS_TO_LINK $) list(APPEND MNN_EXTRA_DEPENDS ${MNN_OCL_LIBS}) diff --git a/MNN_Render.podspec b/MNN_Render.podspec new file mode 100644 index 000000000..75b05f4d8 --- /dev/null +++ b/MNN_Render.podspec @@ -0,0 +1,82 @@ +Pod::Spec.new do |s| + s.name = "MNN" + s.version = "2.2.0" + s.summary = "MNN" + + s.description = <<-DESC + MNN is a lightweight deep neural network inference framework. It loads models and do inference on devices. + DESC + + s.homepage = "https://github.com/alibaba/MNN" + s.license = { + :type => 'Apache License, Version 2.0', + :text => <<-LICENSE + Copyright © 2018, Alibaba Group Holding Limited + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + LICENSE + } + + s.author = { "MNN" => "MNN@alibaba-inc.com" } + s.platform = :ios + s.ios.deployment_target = '8.0' + s.requires_arc = true + + #s.source = { :git => "git@github.com:alibaba/MNN.git", :branch => 'master' } + s.source = {:git => "/Users/zhang/Development/AliNNPrivate/",:branch=> 'head'} + s.frameworks = 'Metal', 'Accelerate', 'CoreML' + s.library = 'c++' + s.source_files = \ + 'include/MNN/*.{h,hpp}',\ + 'include/MNN/expr/*.{h,hpp}',\ + 'schema/current/*.{h}',\ + '3rd_party/flatbuffers/include/flatbuffers/*.{h}',\ + 'source/internal/logging/*.{hpp,cpp}',\ + 'source/internal/logging/ios/*.{h,c,m,mm,cc,hpp,cpp}',\ + 'source/internal/logging/aliyun-log-c-sdk/src/*.{h,c,m,mm,cc,hpp,cpp}',\ + 'source/core/**/*.{h,c,m,mm,cc,hpp,cpp}',\ + 'source/common/**/*.{h,c,m,mm,cc,hpp,cpp}',\ + 'source/utils/**/*.{h,c,m,mm,cc,hpp,cpp}',\ + 'source/geometry/**/*.{h,c,m,mm,cc,hpp,cpp}',\ + 'source/cv/**/*.{h,c,m,mm,cc,hpp,cpp}',\ + 'source/math/**/*.{h,c,m,mm,cc,hpp,cpp,metal}',\ + 'source/shape/*.{h,c,m,mm,cc,hpp,cpp}',\ + 'source/shape/render/*.{h,c,m,mm,cc,hpp,cpp}',\ + #'source/backend/arm82/*.{h,c,m,mm,cc,S,hpp,cpp}',\ + #'source/backend/arm82/asm/**/*.{h,c,m,mm,cc,S,hpp,cpp}',\ + 'source/backend/cpu/*.{h,c,m,mm,cc,S,hpp,cpp}',\ + 'source/backend/cpu/render/*.{h,c,m,mm,cc,S,hpp,cpp}',\ + 'source/backend/cpu/bf16/*.{h,c,m,mm,cc,S,hpp,cpp}',\ + 'source/backend/cpu/arm/**/*.{h,c,m,mm,cc,S,hpp,cpp}',\ + 'source/backend/cpu/compute/*.{h,c,m,mm,cc,S,hpp,cpp}',\ + 'source/backend/metal/*.{h,c,m,mm,cc,hpp,cpp,metal}',\ + 'source/backend/metal/render/*.{h,c,m,mm,cc,hpp,cpp,metal}',\ + 'source/backend/coreml/backend/*.{h,c,m,mm,cc,hpp,cpp,metal}',\ + 'source/backend/coreml/execution/*.{h,c,m,mm,cc,hpp,cpp,metal}',\ + 'source/backend/coreml/mlmodel/src/*.{h,c,m,mm,cc,hpp,cpp,metal}',\ + 'express/**/*.{hpp,cpp}',\ + 'tools/cv/include/**/*.{h,c,m,mm,cc,hpp,cpp,metal}',\ + 'tools/cv/source/imgproc/*.{h,c,m,mm,cc,hpp,cpp,metal}',\ + 'tools/cv/source/calib3d/*.{h,c,m,mm,cc,hpp,cpp,metal}' + + s.header_mappings_dir = 'include' + s.subspec 'cv' do |sp| + sp.source_files = 'tools/cv/include/**/*.hpp' + sp.header_mappings_dir = 'tools/cv/include' + sp.xcconfig = { 'ALWAYS_SEARCH_USER_PATHS' => 'NO' } + end + + s.compiler_flags = '-arch arm64 -march=armv8.2-a+simd+fp16' + s.pod_target_xcconfig = {'METAL_LIBRARY_FILE_BASE' => 'mnn', 'HEADER_SEARCH_PATHS' => '"$(PODS_TARGET_SRCROOT)/include" "$(PODS_TARGET_SRCROOT)/3rd_party/flatbuffers/include" "$(PODS_TARGET_SRCROOT)/source" "$(PODS_TARGET_SRCROOT)/3rd_party/half" "$(PODS_TARGET_SRCROOT)/source/backend/coreml/mlmodel/include" "$(PODS_TARGET_SRCROOT)/tools/cv/include"', 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) MNN_CODEGEN_REGISTER=1 MNN_SUPPORT_TFLITE_QUAN=1 MNN_METAL_ENABLED=1 MNN_METAL_FULL_PRECISION=1 MNN_SUPPORT_RENDER=1 MNN_SUPPORT_BF16=1 MNN_COREML_ENABLED=1 USE_LZ4_FLAG=1 MNN_INTERNAL_ENABLED=1 MNN_USE_SPARSE_COMPUTE=1'} + s.user_target_xcconfig = { 'OTHER_LDFLAGS' => '-force_load $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/MNN/libMNN.a', 'HEADER_SEARCH_PATHS' => '"$(PODS_TARGET_SRCROOT)/include"' } +end diff --git a/docs/compile/tools.md b/docs/compile/tools.md index 4364d0775..b05a2db04 100644 --- a/docs/compile/tools.md +++ b/docs/compile/tools.md @@ -55,14 +55,10 @@ - `checkInvalidValue.out` 检测输出目录里的数据 - `timeProfile.out` 测试模型在指定后端上执行的时间,并获取每层的执行时间占比 - `testTrain.out` 测试训练功能 - - `aoa_nlu_encoder.out` 测试NLU编码 - - `aoa_nlu_decoder1.out` 测试NLU解码1 - - `aoa_nlu_decoder2.out` 测试NLU解码2 - `checkDir.out` 测试两个文件夹是否一致 - `checkFile.out` 测试两个文件是否一致 - `winogradExample.out` winograd示例 - - `winogradGenerateGLSL.out` winograd生成GLSL - - `winogradGenerateCL.out` winograd生成CL + - `fuseTest` 测试 GPU 自定义算子的功能,目前仅支持 Vulkan Buffer 模式 ## Benchmark工具 - 相关编译选项 - `MNN_BUILD_BENCHMARK` 是否编译Benchmark工具 diff --git a/docs/pymnn/expr.md b/docs/pymnn/expr.md index f6c34a2fc..e03e78f24 100644 --- a/docs/pymnn/expr.md +++ b/docs/pymnn/expr.md @@ -2195,6 +2195,25 @@ array([[[[0., 1.]], [[6., 7.]]]], dtype=float32) ``` +--- +### `reverse(x, axis)` +在输入x变量在axis[0]维度进行翻转 + +参数: +- `x : var_like` 输入变量 +- `axis : var_like` 输入变量 + +返回:反转序列的值 + +返回类型:`Var` + +示例: + +```python +>>> expr.reverse(expr.range(-4., 4., 1.), [0]) +array([ 3., 2., 1., 0., -1., -2., -3., -4.], dtype=float32) +``` + --- ### `reverse_sequence(x, y, batch_dim, seq_dim)` 沿着batch_dim维度对x进行切片并反转维度seq_dim上的y[i]元素 diff --git a/docs/tools/test.md b/docs/tools/test.md index d775f529d..cb47d61e7 100644 --- a/docs/tools/test.md +++ b/docs/tools/test.md @@ -457,3 +457,14 @@ Matrix: 0.0000000 0.0000000 1.0000000 ``` +## fuseTest +### 功能 +测试 GPU 自定义算子的功能,目前仅支持 Vulkan Buffer 模式 + +### 参数 +`Usage: ./fuseTest user.spirv config.json` +- `user.spirv:str`:SPIRV文件路径,可以用 glslangValidator -V user.comp -o user.spirv 编译获得 +- `config.json:str`: 配置文件路径 +### 示例 +```bash +$ ./fuseTest user.spirv user.json diff --git a/express/Executor.cpp b/express/Executor.cpp index 6388ce6ab..815b09640 100644 --- a/express/Executor.cpp +++ b/express/Executor.cpp @@ -120,7 +120,7 @@ Executor::Requirement Executor::getRequirement(Expr* expr) const { return req; } for (int i = 0; i < inputSize; ++i) { - req.contentNeedContent[i] = OpCommonUtils::opNeedContent(op->type(), i); + req.contentNeedContent[i] = OpCommonUtils::opNeedContent(op, i); req.shapeNeedContent[i] = false; } auto needIndexId = SizeComputer::needInputContent(op, inputSize); diff --git a/express/Expr.cpp b/express/Expr.cpp index 7297a0617..768acdd0b 100644 --- a/express/Expr.cpp +++ b/express/Expr.cpp @@ -192,6 +192,17 @@ EXPRP Expr::create(std::shared_ptr extra, std::vector&& inp EXPRP expr(new Expr(outputSize)); expr->mStorage = extra; expr->mOp = flatbuffers::GetRoot(extra->buffer()); + switch (expr->mOp->type()) { + case OpType_Const: + expr->mType = VARP::CONSTANT; + break; + case OpType_TrainableParam: + expr->mType = VARP::TRAINABLE; + break; + default: + expr->mType = VARP::INPUT; + break; + } expr->mInputs = std::move(inputs); auto exe = ExecutorScope::Current(); expr->mInside->mReq = exe->getRequirement(expr.get()); diff --git a/express/NeuralNetWorkOp.cpp b/express/NeuralNetWorkOp.cpp index 09715e17b..38a636977 100644 --- a/express/NeuralNetWorkOp.cpp +++ b/express/NeuralNetWorkOp.cpp @@ -626,6 +626,13 @@ VARP _ChannelShuffle(VARP x, int group) { x = _Convert(x, NC4HW4); return x; } + +VARP _Reverse(VARP x, VARP axis) { + std::unique_ptr op(new MNN::OpT); + op->type = MNN::OpType_Reverse; + return (Variable::create(Expr::create(op.get(), {x, axis}))); +} + VARP _ReverseSequence(VARP x, VARP y, int batchDim, int seqDim) { std::unique_ptr op(new OpT); op->type = OpType_ReverseSequence; @@ -1710,19 +1717,10 @@ VARP _GridSample(VARP input, VARP grid, InterpolationMethod mode, GridSamplePadd } VARP _FloatToInt8(VARP x, VARP scale, char minValue/*For future*/, char maxValue/*For future*/) { - auto xInfo = x->getInfo(); auto scaleInfo = scale->getInfo(); auto scalePtr = scale->readMap(); - if (nullptr == scalePtr || nullptr == xInfo || nullptr == scaleInfo) { - MNN_ERROR("Error for FloatToInt8 because var not ready\n"); - return nullptr; - } - if (xInfo->order != NC4HW4 || xInfo->type.code != halide_type_float) { - MNN_ERROR("Not Support Input for FloatToInt8 because var not NC4HW4 or not float\n"); - return nullptr; - } - if ((scaleInfo->size != xInfo->dim[1]) && (scaleInfo->size != 1)) { - MNN_ERROR("Scale's size not match input's channel: %d - %d\n", scaleInfo->size, xInfo->dim[1]); + if (nullptr == scalePtr || nullptr == scaleInfo) { + MNN_ERROR("Error for FloatToInt8 because scale not ready\n"); return nullptr; } std::unique_ptr op(new OpT); @@ -1735,21 +1733,12 @@ VARP _FloatToInt8(VARP x, VARP scale, char minValue/*For future*/, char maxValue } VARP _FloatToInt8(VARP x, VARP scale, int8_t minValue, int8_t maxValue, int8_t zeroPoint) { - auto xInfo = x->getInfo(); auto scaleInfo = scale->getInfo(); auto scalePtr = scale->readMap(); - if (nullptr == scalePtr || nullptr == xInfo || nullptr == scaleInfo) { + if (nullptr == scalePtr || nullptr == scaleInfo) { MNN_ERROR("Error for FloatToInt8 because var not ready\n"); return nullptr; } - if (xInfo->order != NC4HW4 || xInfo->type.code != halide_type_float) { - MNN_ERROR("Not Support Input for FloatToInt8 because var not NC4HW4 or not float\n"); - return nullptr; - } - if ((scaleInfo->size != xInfo->dim[1]) && (scaleInfo->size != 1)) { - MNN_ERROR("Scale's size not match input's channel: %d - %d\n", scaleInfo->size, xInfo->dim[1]); - return nullptr; - } std::unique_ptr op(new OpT); op->type = OpType_FloatToInt8; op->main.type = OpParameter_QuantizedFloatParam; diff --git a/express/module/PipelineModule.cpp b/express/module/PipelineModule.cpp index ad1f7c1d3..fbca33e78 100644 --- a/express/module/PipelineModule.cpp +++ b/express/module/PipelineModule.cpp @@ -58,6 +58,10 @@ ExprModule::ExprModule(EXPRP expr) { break; } } + // TODO: Optimize the logic + if (!mExpr->mCanDecompose) { + ExecutorScope::Current()->setLazyComputeMode(Executor::LAZY_CONTENT); + } } std::vector ExprModule::onForward(const std::vector& inputs) { @@ -72,6 +76,14 @@ std::vector ExprModule::onForward(const std::vector& inputs) { std::vector outputVars; auto newExpr = Expr::create(mExpr->extra(), std::move(tempInputs), mExpr->outputSize()); newExpr->setName(mExpr->name()); + if (!mExpr->mCanDecompose) { + // Set tensor shape from net + newExpr->mCanDecompose = false; + for (int index = 0; index < mExpr->outputSize(); ++index) { + TensorUtils::copyShape(mExpr->inside()->mOutputTensors[index], newExpr->inside()->mOutputTensors[index], true, true); + Utils::copyTensorToInfo(newExpr->inside()->mOutputInfos.data() + index, newExpr->inside()->mOutputTensors[index]); + } + } for (int i = 0; i < mExpr->outputSize(); ++i) { outputVars.emplace_back(Variable::create(newExpr, i)); } @@ -562,6 +574,23 @@ Module* PipelineModule::load(const std::vector& inputs, const std:: config = &defaultConfig; } auto subGraphs = net->subgraphs(); + if (config->dynamic) { + // TODO: Support subgraph + if (nullptr == subGraphs) { + auto varMap = MNN::Express::Variable::loadMap(buffer, length); + std::vector inputsVar(inputs.size()); + for (int i=0; i outputsVar(outputs.size()); + for (int i=0; i subGraphMap; _createSubGraph(net, rtMgr, config, subGraphMap); std::shared_ptr bufferStorage(new BufferStorage); diff --git a/include/MNN/MNNDefine.h b/include/MNN/MNNDefine.h index b64ae41f9..26a7e3752 100644 --- a/include/MNN/MNNDefine.h +++ b/include/MNN/MNNDefine.h @@ -69,6 +69,6 @@ MNN_ERROR("Check failed: %s ==> %s\n", #success, #log); \ #define STR(x) STR_IMP(x) #define MNN_VERSION_MAJOR 2 #define MNN_VERSION_MINOR 8 -#define MNN_VERSION_PATCH 0 +#define MNN_VERSION_PATCH 1 #define MNN_VERSION STR(MNN_VERSION_MAJOR) "." STR(MNN_VERSION_MINOR) "." STR(MNN_VERSION_PATCH) #endif /* MNNDefine_h */ diff --git a/include/MNN/MNNSharedContext.h b/include/MNN/MNNSharedContext.h index 166e8a556..fc13e99ad 100644 --- a/include/MNN/MNNSharedContext.h +++ b/include/MNN/MNNSharedContext.h @@ -24,6 +24,15 @@ struct MNNVulkanContext { uint32_t iQueueFamilyIndex; }; +struct MNNVulkanTensorContent { + VkBuffer buffer; + VkDeviceSize size; + VkDeviceSize offset; + + halide_type_t realType; + int32_t mask; // For future usage +}; + #endif #ifdef MNN_METAL @@ -36,6 +45,9 @@ struct MNNMetalTensorContent { id buffer; int32_t offset; id texture; + + halide_type_t type; + int32_t mask; int32_t forFuture[8]; }; diff --git a/include/MNN/Tensor.hpp b/include/MNN/Tensor.hpp index e4431097b..671b9b9f5 100644 --- a/include/MNN/Tensor.hpp +++ b/include/MNN/Tensor.hpp @@ -275,6 +275,12 @@ class MNN_PUBLIC Tensor { mBuffer.dim[index].extent = length; } + /** + * @brief For GPU and Other Device, get memory directly, see MNNSharedContext for detail + * @return Success or not. If type != tensor's backend's type or type is cpu , return false + */ + bool getDeviceInfo(void* dst, int forwardType) const; + public: /** * @brief print tensor data. for DEBUG use only. diff --git a/include/MNN/expr/Expr.hpp b/include/MNN/expr/Expr.hpp index 973d46f83..129196966 100644 --- a/include/MNN/expr/Expr.hpp +++ b/include/MNN/expr/Expr.hpp @@ -267,6 +267,7 @@ class MNN_PUBLIC Expr { bool mVisited = false; std::vector mTo; bool mCanDecompose = true; + friend class ExprModule; }; } // namespace Express diff --git a/include/MNN/expr/NeuralNetWorkOp.hpp b/include/MNN/expr/NeuralNetWorkOp.hpp index a9b78d6e4..2a6bdfd61 100644 --- a/include/MNN/expr/NeuralNetWorkOp.hpp +++ b/include/MNN/expr/NeuralNetWorkOp.hpp @@ -77,6 +77,7 @@ MNN_PUBLIC VARP _ChangeInputFormat(VARP input, Dimensionformat format); MNN_PUBLIC VARP _Conv2DBackPropFilter(VARP input, VARP inputGrad, INTS kernelSize, PaddingMode pad = VALID, INTS stride = {1, 1}, INTS dilate = {1, 1}, int group = 1, INTS pads = {0, 0}); MNN_PUBLIC VARP _PoolGrad(VARP originInput, VARP originOutput, VARP inputGrad, INTS kernel, INTS stride, PoolingMode type, PaddingMode pad = VALID, INTS pads= {0, 0}); // FIXME: move the api to Array Ops +MNN_PUBLIC VARP _Reverse(VARP x, VARP axis); MNN_PUBLIC VARP _ReverseSequence(VARP x, VARP y, int batchDim, int seqDim); // FIXME: move the api to Image Ops MNN_PUBLIC VARP _Crop(VARP images, VARP size, int axis, INTS offset); diff --git a/llm/cli_demo.cpp b/llm/cli_demo.cpp deleted file mode 100644 index 06c489ec3..000000000 --- a/llm/cli_demo.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// -// cli_demo.cpp -// -// Created by MNN on 2023/03/24. -// ZhaodeWang -// - -#include "llm.hpp" -#include -#include - -void benchmark(Llm* llm, std::string prompt_file) { - std::cout << "prompt file is " << prompt_file << std::endl; - std::ifstream prompt_fs(prompt_file); - std::vector prompts; - std::string prompt; - while (std::getline(prompt_fs, prompt)) { - // prompt start with '#' will be ignored - if (prompt.substr(0, 1) == "#") { - continue; - } - prompts.push_back(prompt); - } - int prompt_len = 0; - int decode_len = 0; - int64_t prefill_time = 0; - int64_t decode_time = 0; - // llm->warmup(); - for (int i = 0; i < prompts.size(); i++) { - llm->response(prompts[i]); - prompt_len += llm->prompt_len_; - decode_len += llm->gen_seq_len_; - prefill_time += llm->prefill_us_; - decode_time += llm->decode_us_; - llm->reset(); - } - float prefill_s = prefill_time / 1e6; - float decode_s = decode_time / 1e6; - printf("\n#################################\n"); - printf("prompt tokens num = %d\n", prompt_len); - printf("decode tokens num = %d\n", decode_len); - printf("prefill time = %.2f s\n", prefill_s); - printf(" decode time = %.2f s\n", decode_s); - printf("prefill speed = %.2f tok/s\n", prompt_len / prefill_s); - printf(" decode speed = %.2f tok/s\n", decode_len / decode_s); - printf("##################################\n"); -} - -int main(int argc, const char* argv[]) { - if (argc < 2) { - std::cout << "Usage: " << argv[0] << " model_dir " << std::endl; - return 0; - } - std::string model_dir = argv[1]; - std::cout << "model path is " << model_dir << std::endl; - std::unique_ptr llm(Llm::createLLM(model_dir)); - llm->load(model_dir); - if (argc < 3) { - llm->chat(); - } - std::string prompt_file = argv[2]; - benchmark(llm.get(), prompt_file); - return 0; -} diff --git a/llm/include/llm.hpp b/llm/include/llm.hpp index 7b7689f79..125e32e09 100644 --- a/llm/include/llm.hpp +++ b/llm/include/llm.hpp @@ -11,8 +11,10 @@ #include #include #include -#include #include +#include +#include +#include #include #include @@ -25,6 +27,25 @@ using namespace MNN; using namespace Express; class Tokenizer; +// llm stream buffer with callback + +class LlmStreamBuffer : public std::streambuf { +public: + using CallBack = std::function;; + LlmStreamBuffer(CallBack callback) : callback_(callback) {} + +protected: + virtual std::streamsize xsputn(const char* s, std::streamsize n) override { + if (callback_) { + callback_(s, n); + } + return n; + } + +private: + CallBack callback_ = nullptr; +}; + class MNN_PUBLIC Llm { public: Llm() { diff --git a/llm/include/tokenizer.hpp b/llm/include/tokenizer.hpp index 8dabd1894..bc3a59915 100644 --- a/llm/include/tokenizer.hpp +++ b/llm/include/tokenizer.hpp @@ -80,9 +80,8 @@ class Tiktoken : public Tokenizer { virtual std::vector encode(const std::string& str) override; virtual std::string decode(int id) override; private: + std::unordered_map encoder_; std::vector decoder_; - std::vector tokens_; - std::vector token_ids_; }; #endif // TOKENIZER_hpp \ No newline at end of file diff --git a/llm/src/llm.cpp b/llm/src/llm.cpp index 8e690d3ab..ec7d73636 100644 --- a/llm/src/llm.cpp +++ b/llm/src/llm.cpp @@ -106,8 +106,7 @@ std::string Llm::response(const std::string& query, std::ostream* os, const char history_ = input_ids; } - prompt_len_ = input_ids.size(); - // printf("token_num : %lu\n", input_ids.size()); + prompt_len_ = static_cast(input_ids.size()); auto st = std::chrono::system_clock::now(); int token = forward(input_ids); auto et = std::chrono::system_clock::now(); @@ -168,20 +167,22 @@ void Llm::load(const std::string& model_dir) { config.type = MNN_FORWARD_CPU; // config.type = MNN_FORWARD_OPENCL; config.numThread = 4; - // cpuBackendConfig.precision = BackendConfig::Precision_Low; + cpuBackendConfig.precision = BackendConfig::Precision_Low; cpuBackendConfig.memory = BackendConfig::Memory_Low; config.backendConfig = &cpuBackendConfig; runtime_manager_.reset(Executor::RuntimeManager::createRuntimeManager(config)); if (config.type == MNN_FORWARD_OPENCL) { const char* cacheFileName = ".tempcache"; - runtime_manager_->setCache(cacheFileName); + // runtime_manager_->setCache(cacheFileName); } load_progress_ = 0.f; + printf("load tokenizer\n"); // 1. load vocab std::string tokenizer_path = model_dir + "/tokenizer.txt"; load_progress_ += 5.f; tokenizer_->load(tokenizer_path); load_progress_ += 5.f; + printf("load tokenizer Done\n"); // 2. load model Module::Config module_config; module_config.shapeMutable = true; @@ -228,7 +229,7 @@ void Llm::load(const std::string& model_dir) { } } if (config.type == MNN_FORWARD_OPENCL) { - warmup(); + // warmup(); } } @@ -369,8 +370,10 @@ bool Chatglm_6b::is_stop(int token_id) { std::vector Chatglm2_6b::tokenizer(const std::string& query) { auto prompt = "问:" + query + "\n答:"; auto ids = tokenizer_encode(prompt); - ids.insert(ids.begin(), 64792); - ids.insert(ids.begin(), 64790); + if (history_.empty()) { + ids.insert(ids.begin(), 64792); + ids.insert(ids.begin(), 64790); + } return ids; } diff --git a/llm/src/tokenizer.cpp b/llm/src/tokenizer.cpp index 9aa4439d4..9534899ab 100644 --- a/llm/src/tokenizer.cpp +++ b/llm/src/tokenizer.cpp @@ -307,81 +307,48 @@ const int CHARACTER_VOCABULARY_SIZE = 256; bool Tiktoken::load(const std::string& filename) { std::ifstream tok_file(filename); - int index = -1, start = 0, rough_count = 0; std::string token; while (tok_file >> token) { token = base64_decode(token); + encoder_[token] = static_cast(decoder_.size()); decoder_.push_back(token); - rough_count += token.size(); } tok_file.close(); - tokens_.resize(rough_count * CHARACTER_VOCABULARY_SIZE, -1); - token_ids_.resize(rough_count * CHARACTER_VOCABULARY_SIZE, -1); - for (int n = 0; n < decoder_.size(); n++) { - token = decoder_[n]; - int root = 0; - for (int i = 0; i < token.size(); i++) { - unsigned char x = token[i]; - // record the token id at the parent of leaf node - if (i == token.size() - 1) { - token_ids_[root + x] = n; - } - // trace down a tree node. - // insert a subtree when needed. - if (tokens_[root + x] == -1) { - start += CHARACTER_VOCABULARY_SIZE; - tokens_[root + x] = start; - root = start; - } else { - root = tokens_[root + x]; - } - } - } - tokens_.resize(start + CHARACTER_VOCABULARY_SIZE); - token_ids_.resize(start + CHARACTER_VOCABULARY_SIZE); - tokens_.shrink_to_fit(); - token_ids_.shrink_to_fit(); return true; } -// ref: https://github.com/youkaichao/fast_bpe_tokenizer std::vector Tiktoken::encode(const std::string& str) { std::vector ids; if (str.empty()) { return ids; } - int i = 0; - int root = 0; - int root_token_id = -1; - int last_found_position = -1; - int last_found_token_id = -1; + size_t i = 0; while (i < str.size()) { - unsigned char x = str[i]; - bool should_fall_back = false; - if (tokens_[root + x] != -1) { - root_token_id = token_ids_[root + x]; - root = tokens_[root + x]; - if (root_token_id != -1) { - // a token ends at position i - last_found_position = i; - last_found_token_id = root_token_id; - } - i++; - if (i == str.size()) { - should_fall_back = true; + bool found_pair = false; + // Attempt to match the longest possible symbol + size_t longest_match_len = 0; + std::string longest_match; + + // Check substrings of decreasing length + for (size_t len = str.size() - i; len > 0; --len) { + std::string token = str.substr(i, len); + auto it = encoder_.find(token); + if (it != encoder_.end()) { + if (len > longest_match_len) { + longest_match_len = len; + longest_match = it->first; + } } - } else { - // assert(last_found_position != -1); - should_fall_back = true; } - if (should_fall_back) { - i = last_found_position + 1; - ids.push_back(last_found_token_id); - // start searching from the root again - root = 0; - root_token_id = -1; - last_found_position = -1; - last_found_token_id = -1; + + if (!longest_match.empty()) { + ids.push_back(encoder_.at(longest_match)); + i += longest_match_len; + } else { + // If no matching symbol is found, this typically means an error in the encoding + // or the input text contains characters that the encoder doesn't know how to handle + std::cerr << "Error: No encoding found for the sequence starting at position " << i << std::endl; + return {}; } } return ids; @@ -392,4 +359,4 @@ std::string Tiktoken::decode(int id) { return ""; } return decoder_[id]; -} \ No newline at end of file +} diff --git a/project/android/updateTest.sh b/project/android/updateTest.sh index 471a444db..ebb879533 100755 --- a/project/android/updateTest.sh +++ b/project/android/updateTest.sh @@ -8,6 +8,7 @@ adb push ./libMNN_Vulkan.so /data/local/tmp/$DIR/libMNN_Vulkan.so adb push ./libMNN_GL.so /data/local/tmp/$DIR/libMNN_GL.so adb push ./libMNN_Express.so /data/local/tmp/$DIR/libMNN_Express.so adb push ./MNNV2Basic.out /data/local/tmp/$DIR/MNNV2Basic.out +adb push ./ModuleBasic.out /data/local/tmp/$DIR/ModuleBasic.out adb shell "cd /data/local/tmp/$DIR && rm -r output" adb shell "cd /data/local/tmp/$DIR && mkdir output" adb push ./unitTest.out /data/local/tmp/$DIR/unitTest.out diff --git a/project/ios/MNN.xcodeproj/project.pbxproj b/project/ios/MNN.xcodeproj/project.pbxproj index 872fe50e2..5bf3405f4 100644 --- a/project/ios/MNN.xcodeproj/project.pbxproj +++ b/project/ios/MNN.xcodeproj/project.pbxproj @@ -163,14 +163,12 @@ 4896D37E25FE2A6B00717702 /* Arm82MNNPackForMatMul_A.S in Sources */ = {isa = PBXBuildFile; fileRef = 4896D37625FE2A6B00717702 /* Arm82MNNPackForMatMul_A.S */; settings = {COMPILER_FLAGS = "-march=armv8.2-a+fp16"; }; }; 4896D37F25FE2A6B00717702 /* MNNConvRunForLineDepthwiseFP16.S in Sources */ = {isa = PBXBuildFile; fileRef = 4896D37725FE2A6B00717702 /* MNNConvRunForLineDepthwiseFP16.S */; settings = {COMPILER_FLAGS = "-march=armv8.2-a+fp16"; }; }; 489D7A682550FDC800AD896A /* MetalReduction.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A172550FDC800AD896A /* MetalReduction.hpp */; }; - 489D7A6A2550FDC800AD896A /* MetalConvolutionGEMM.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A192550FDC800AD896A /* MetalConvolutionGEMM.hpp */; }; 489D7A6E2550FDC800AD896A /* MetalROIPooling.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A1D2550FDC800AD896A /* MetalROIPooling.hpp */; }; 489D7A6F2550FDC800AD896A /* MetalCast.mm in Sources */ = {isa = PBXBuildFile; fileRef = 489D7A1E2550FDC800AD896A /* MetalCast.mm */; }; 489D7A702550FDC800AD896A /* MetalRaster.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A1F2550FDC800AD896A /* MetalRaster.hpp */; }; 489D7A722550FDC800AD896A /* MetalReLU6.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A212550FDC800AD896A /* MetalReLU6.hpp */; }; 489D7A732550FDC800AD896A /* MetalBackend.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A222550FDC800AD896A /* MetalBackend.hpp */; }; 489D7A762550FDC800AD896A /* MetalReduction.mm in Sources */ = {isa = PBXBuildFile; fileRef = 489D7A252550FDC800AD896A /* MetalReduction.mm */; }; - 489D7A772550FDC800AD896A /* MetalConvolutionGEMM.mm in Sources */ = {isa = PBXBuildFile; fileRef = 489D7A262550FDC800AD896A /* MetalConvolutionGEMM.mm */; }; 489D7A782550FDC800AD896A /* MetalEltwise.mm in Sources */ = {isa = PBXBuildFile; fileRef = 489D7A272550FDC800AD896A /* MetalEltwise.mm */; }; 489D7A792550FDC800AD896A /* MetalConvolution1x1.mm in Sources */ = {isa = PBXBuildFile; fileRef = 489D7A282550FDC800AD896A /* MetalConvolution1x1.mm */; }; 489D7A7B2550FDC800AD896A /* MetalUnary.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A2A2550FDC800AD896A /* MetalUnary.hpp */; }; @@ -206,7 +204,6 @@ 489D7AA72550FDC900AD896A /* MetalScale.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A562550FDC800AD896A /* MetalScale.hpp */; }; 489D7AA82550FDC900AD896A /* MetalCast.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A572550FDC800AD896A /* MetalCast.hpp */; }; 489D7AAF2550FDC900AD896A /* MetalConvolutionWinograd.mm in Sources */ = {isa = PBXBuildFile; fileRef = 489D7A5E2550FDC800AD896A /* MetalConvolutionWinograd.mm */; }; - 489D7AB02550FDC900AD896A /* MetalDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A5F2550FDC800AD896A /* MetalDefine.h */; }; 489D7AB32550FDC900AD896A /* MetalPReLU.mm in Sources */ = {isa = PBXBuildFile; fileRef = 489D7A622550FDC800AD896A /* MetalPReLU.mm */; }; 489D7AB42550FDC900AD896A /* MetalBinary.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A632550FDC800AD896A /* MetalBinary.hpp */; }; 489D7AB62550FDC900AD896A /* MetalReLU6.mm in Sources */ = {isa = PBXBuildFile; fileRef = 489D7A652550FDC800AD896A /* MetalReLU6.mm */; }; @@ -283,7 +280,6 @@ 4AF4FB2D269ED24C005BA97B /* MNNPackedSparseQuantMatMulEpx1.S in Sources */ = {isa = PBXBuildFile; fileRef = 4AF4FB2B269ED24C005BA97B /* MNNPackedSparseQuantMatMulEpx1.S */; }; 4AF4FB2E269ED24C005BA97B /* MNNPackedSparseQuantMatMulEpx4.S in Sources */ = {isa = PBXBuildFile; fileRef = 4AF4FB2C269ED24C005BA97B /* MNNPackedSparseQuantMatMulEpx4.S */; }; 4D0C80E32862FC4100C7CAD6 /* CoreMLOPRegister.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D0C80E22862FC4100C7CAD6 /* CoreMLOPRegister.cpp */; }; - 4D0C80E52862FC4700C7CAD6 /* CoreMLRaster.metal in Sources */ = {isa = PBXBuildFile; fileRef = 4D0C80E42862FC4700C7CAD6 /* CoreMLRaster.metal */; }; 4D4CF4672760946500A36D9F /* miscellaneous.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D4CF4622760946500A36D9F /* miscellaneous.cpp */; }; 4D4CF4682760946500A36D9F /* geometric.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D4CF4632760946500A36D9F /* geometric.cpp */; }; 4D4CF4692760946500A36D9F /* filter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D4CF4642760946500A36D9F /* filter.cpp */; }; @@ -771,8 +767,11 @@ CE125CC82A52BF6B003698C9 /* MNNBilinearSampleC8.S in Sources */ = {isa = PBXBuildFile; fileRef = CE125CC62A52BF6B003698C9 /* MNNBilinearSampleC8.S */; }; CE125CC92A52BF6B003698C9 /* MNNBilinearLineC8.S in Sources */ = {isa = PBXBuildFile; fileRef = CE125CC72A52BF6B003698C9 /* MNNBilinearLineC8.S */; }; CE7DC00028E2DE6B00797689 /* ShapeConvTranspose3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CE7DBFFF28E2DE6B00797689 /* ShapeConvTranspose3D.cpp */; }; + CE8049AC2B31C65B009B422C /* CPULayerNorm.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CE8049A92B31C65B009B422C /* CPULayerNorm.hpp */; }; CE9AFED628E54E3300566949 /* CPUInterp3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CE9AFED428E54E3300566949 /* CPUInterp3D.cpp */; }; CE9AFED728E54E3300566949 /* CPUInterp3D.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CE9AFED528E54E3300566949 /* CPUInterp3D.hpp */; }; + CEA49AA82AFD010900971CB7 /* MetalExecution.mm in Sources */ = {isa = PBXBuildFile; fileRef = CEA49AA62AFD010900971CB7 /* MetalExecution.mm */; }; + CEA49AA92AFD010900971CB7 /* MetalExecution.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CEA49AA72AFD010900971CB7 /* MetalExecution.hpp */; }; CEA82BDB2A15F8AD002CBC95 /* IdstConvolutionInt8.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CEA82BD92A15F8AD002CBC95 /* IdstConvolutionInt8.cpp */; }; CEA82BDC2A15F8AD002CBC95 /* IdstConvolutionInt8.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CEA82BDA2A15F8AD002CBC95 /* IdstConvolutionInt8.hpp */; }; CEDB20EB2846D07100AE9DC4 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CEDB20EA2846D07100AE9DC4 /* AppDelegate.m */; }; @@ -984,14 +983,12 @@ 4896D37625FE2A6B00717702 /* Arm82MNNPackForMatMul_A.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = Arm82MNNPackForMatMul_A.S; path = ../../../arm82/asm/arm64/Arm82MNNPackForMatMul_A.S; sourceTree = ""; }; 4896D37725FE2A6B00717702 /* MNNConvRunForLineDepthwiseFP16.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = MNNConvRunForLineDepthwiseFP16.S; path = ../../../arm82/asm/arm64/MNNConvRunForLineDepthwiseFP16.S; sourceTree = ""; }; 489D7A172550FDC800AD896A /* MetalReduction.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalReduction.hpp; sourceTree = ""; }; - 489D7A192550FDC800AD896A /* MetalConvolutionGEMM.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalConvolutionGEMM.hpp; sourceTree = ""; }; 489D7A1D2550FDC800AD896A /* MetalROIPooling.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalROIPooling.hpp; sourceTree = ""; }; 489D7A1E2550FDC800AD896A /* MetalCast.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalCast.mm; sourceTree = ""; }; 489D7A1F2550FDC800AD896A /* MetalRaster.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalRaster.hpp; sourceTree = ""; }; 489D7A212550FDC800AD896A /* MetalReLU6.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalReLU6.hpp; sourceTree = ""; }; 489D7A222550FDC800AD896A /* MetalBackend.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalBackend.hpp; sourceTree = ""; }; 489D7A252550FDC800AD896A /* MetalReduction.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalReduction.mm; sourceTree = ""; }; - 489D7A262550FDC800AD896A /* MetalConvolutionGEMM.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalConvolutionGEMM.mm; sourceTree = ""; }; 489D7A272550FDC800AD896A /* MetalEltwise.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalEltwise.mm; sourceTree = ""; }; 489D7A282550FDC800AD896A /* MetalConvolution1x1.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalConvolution1x1.mm; sourceTree = ""; }; 489D7A2A2550FDC800AD896A /* MetalUnary.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalUnary.hpp; sourceTree = ""; }; @@ -1027,7 +1024,6 @@ 489D7A562550FDC800AD896A /* MetalScale.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalScale.hpp; sourceTree = ""; }; 489D7A572550FDC800AD896A /* MetalCast.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalCast.hpp; sourceTree = ""; }; 489D7A5E2550FDC800AD896A /* MetalConvolutionWinograd.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalConvolutionWinograd.mm; sourceTree = ""; }; - 489D7A5F2550FDC800AD896A /* MetalDefine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MetalDefine.h; sourceTree = ""; }; 489D7A622550FDC800AD896A /* MetalPReLU.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalPReLU.mm; sourceTree = ""; }; 489D7A632550FDC800AD896A /* MetalBinary.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalBinary.hpp; sourceTree = ""; }; 489D7A652550FDC800AD896A /* MetalReLU6.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalReLU6.mm; sourceTree = ""; }; @@ -1104,7 +1100,6 @@ 4AF4FB2B269ED24C005BA97B /* MNNPackedSparseQuantMatMulEpx1.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = MNNPackedSparseQuantMatMulEpx1.S; sourceTree = ""; }; 4AF4FB2C269ED24C005BA97B /* MNNPackedSparseQuantMatMulEpx4.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = MNNPackedSparseQuantMatMulEpx4.S; sourceTree = ""; }; 4D0C80E22862FC4100C7CAD6 /* CoreMLOPRegister.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CoreMLOPRegister.cpp; sourceTree = ""; }; - 4D0C80E42862FC4700C7CAD6 /* CoreMLRaster.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; path = CoreMLRaster.metal; sourceTree = ""; }; 4D4CF4622760946500A36D9F /* miscellaneous.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = miscellaneous.cpp; sourceTree = ""; }; 4D4CF4632760946500A36D9F /* geometric.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = geometric.cpp; sourceTree = ""; }; 4D4CF4642760946500A36D9F /* filter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = filter.cpp; sourceTree = ""; }; @@ -1603,8 +1598,11 @@ CE125CC62A52BF6B003698C9 /* MNNBilinearSampleC8.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = MNNBilinearSampleC8.S; sourceTree = ""; }; CE125CC72A52BF6B003698C9 /* MNNBilinearLineC8.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = MNNBilinearLineC8.S; sourceTree = ""; }; CE7DBFFF28E2DE6B00797689 /* ShapeConvTranspose3D.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ShapeConvTranspose3D.cpp; sourceTree = ""; }; + CE8049A92B31C65B009B422C /* CPULayerNorm.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CPULayerNorm.hpp; sourceTree = ""; }; CE9AFED428E54E3300566949 /* CPUInterp3D.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CPUInterp3D.cpp; sourceTree = ""; }; CE9AFED528E54E3300566949 /* CPUInterp3D.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CPUInterp3D.hpp; sourceTree = ""; }; + CEA49AA62AFD010900971CB7 /* MetalExecution.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalExecution.mm; sourceTree = ""; }; + CEA49AA72AFD010900971CB7 /* MetalExecution.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalExecution.hpp; sourceTree = ""; }; CEA82BD92A15F8AD002CBC95 /* IdstConvolutionInt8.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IdstConvolutionInt8.cpp; sourceTree = ""; }; CEA82BDA2A15F8AD002CBC95 /* IdstConvolutionInt8.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = IdstConvolutionInt8.hpp; sourceTree = ""; }; CEDB20E72846D07100AE9DC4 /* demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = demo.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1913,6 +1911,7 @@ 48887410215B639D0079B12E /* cpu */ = { isa = PBXGroup; children = ( + CE8049A92B31C65B009B422C /* CPULayerNorm.hpp */, 958375342A496E5C007C0A3E /* MNNLineDepthWiseInt8AddBiasScale_ARMV82_Unit3X3.S */, CEE9B95F2A3AA4EF006438F2 /* CPUSoftMaxInt8.cpp */, CEE9B95E2A3AA4EF006438F2 /* CPUSoftMaxInt8.hpp */, @@ -2096,6 +2095,8 @@ 489D7A152550FDC800AD896A /* metal */ = { isa = PBXGroup; children = ( + CEA49AA72AFD010900971CB7 /* MetalExecution.hpp */, + CEA49AA62AFD010900971CB7 /* MetalExecution.mm */, 4D566298299341270031C1A1 /* MetalFuse.hpp */, 4D566299299341270031C1A1 /* MetalFuse.mm */, 19D0FE73285C66F200B74B1A /* MetalLayerNorm.hpp */, @@ -2110,14 +2111,12 @@ 4838EA802611C00B0027232C /* MetalGridSample.hpp */, 4838EA822611C00B0027232C /* MetalGridSample.mm */, 489D7A172550FDC800AD896A /* MetalReduction.hpp */, - 489D7A192550FDC800AD896A /* MetalConvolutionGEMM.hpp */, 489D7A1D2550FDC800AD896A /* MetalROIPooling.hpp */, 489D7A1E2550FDC800AD896A /* MetalCast.mm */, 489D7A1F2550FDC800AD896A /* MetalRaster.hpp */, 489D7A212550FDC800AD896A /* MetalReLU6.hpp */, 489D7A222550FDC800AD896A /* MetalBackend.hpp */, 489D7A252550FDC800AD896A /* MetalReduction.mm */, - 489D7A262550FDC800AD896A /* MetalConvolutionGEMM.mm */, 489D7A272550FDC800AD896A /* MetalEltwise.mm */, 489D7A282550FDC800AD896A /* MetalConvolution1x1.mm */, 489D7A2A2550FDC800AD896A /* MetalUnary.hpp */, @@ -2153,7 +2152,6 @@ 489D7A562550FDC800AD896A /* MetalScale.hpp */, 489D7A572550FDC800AD896A /* MetalCast.hpp */, 489D7A5E2550FDC800AD896A /* MetalConvolutionWinograd.mm */, - 489D7A5F2550FDC800AD896A /* MetalDefine.h */, 489D7A622550FDC800AD896A /* MetalPReLU.mm */, 489D7A632550FDC800AD896A /* MetalBinary.hpp */, 489D7A652550FDC800AD896A /* MetalReLU6.mm */, @@ -2293,7 +2291,6 @@ 4D9A933526255BDA00F9B43C /* backend */ = { isa = PBXGroup; children = ( - 4D0C80E42862FC4700C7CAD6 /* CoreMLRaster.metal */, 4D0C80E22862FC4100C7CAD6 /* CoreMLOPRegister.cpp */, 4D4DAE67263905390060D37E /* CoreMLDefine.h */, 4DDE2018263809920085AC8F /* CoreMLExecutorWrapper.h */, @@ -2891,6 +2888,7 @@ C4F906B327688C3A0026B847 /* NMSModule.hpp in Headers */, 1F501F882397BA5B004E8721 /* Tensor.hpp in Headers */, 1F501F872397BA5B004E8721 /* Matrix.h in Headers */, + CE8049AC2B31C65B009B422C /* CPULayerNorm.hpp in Headers */, CECF8C5A299CACFD00D3875B /* WorkerThread.hpp in Headers */, 48C84B85250F711700EE7666 /* IfModule.hpp in Headers */, 4D9A937326255BDA00F9B43C /* CoreMLUnary.hpp in Headers */, @@ -2913,7 +2911,6 @@ 92FF029623AA0B5A00AC97F6 /* CPUCast.hpp in Headers */, 4D9A937826255BDA00F9B43C /* CoreMLBinary.hpp in Headers */, CECF8C85299CAD9400D3875B /* log_util.h in Headers */, - 489D7AB02550FDC900AD896A /* MetalDefine.h in Headers */, 4D6D7FD52656896600F80814 /* DenseConvolutionTiledExecutor.hpp in Headers */, 4D9A936626255BDA00F9B43C /* CoreMLExecutor.h in Headers */, 92FF027A23AA0B5A00AC97F6 /* CPUPool.hpp in Headers */, @@ -2972,6 +2969,7 @@ 4D9A937226255BDA00F9B43C /* CoreMLConvolution.hpp in Headers */, 92FF038B23AA0B5A00AC97F6 /* CPUUnravelIndex.hpp in Headers */, 4AF4FB26269ED235005BA97B /* SparseConvInt8TiledExecutor.hpp in Headers */, + CEA49AA92AFD010900971CB7 /* MetalExecution.hpp in Headers */, 92FF03BC23AA0B5A00AC97F6 /* OptimizedComputer.hpp in Headers */, 48C84BA0250F725600EE7666 /* InitNet.hpp in Headers */, 92FF03C623AA0B5A00AC97F6 /* CPUNonMaxSuppressionV2.hpp in Headers */, @@ -3091,7 +3089,6 @@ 481C2DF125FE2CD6001ED6DF /* Arm82OptFunc.hpp in Headers */, 4A5BEC6026AAB3B30032F6BD /* CommonCompute.hpp in Headers */, C43C8225251894F400A0FF84 /* WingoradGenerater.hpp in Headers */, - 489D7A6A2550FDC800AD896A /* MetalConvolutionGEMM.hpp in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3404,7 +3401,6 @@ 92FF041E23AA0B7100AC97F6 /* ShapeRange.cpp in Sources */, 489D7AA42550FDC900AD896A /* MetalROIPooling.mm in Sources */, 92FF03B423AA0B5A00AC97F6 /* Convolution1x1Strassen.cpp in Sources */, - 489D7A772550FDC800AD896A /* MetalConvolutionGEMM.mm in Sources */, 92FF031623AA0B5A00AC97F6 /* MNNMatrixMax.S in Sources */, 92FF043A23AA0B7100AC97F6 /* ShapePermute.cpp in Sources */, 489D7A8E2550FDC900AD896A /* MetalPooling.mm in Sources */, @@ -3502,6 +3498,7 @@ 489D7A9A2550FDC900AD896A /* MetalConvolutionCommon.mm in Sources */, 92FF044623AA0B7100AC97F6 /* ShapeInnerProduct.cpp in Sources */, 48123007269EA84800EB7ABA /* CPUUnique.cpp in Sources */, + CEA49AA82AFD010900971CB7 /* MetalExecution.mm in Sources */, 92FF036F23AA0B5A00AC97F6 /* CPURuntime.cpp in Sources */, 92FF039D23AA0B5A00AC97F6 /* StrassenMatmulComputor.cpp in Sources */, 92FF030B23AA0B5A00AC97F6 /* MNNUnPackC4.S in Sources */, @@ -3594,7 +3591,6 @@ 950B28E229F627E00002F454 /* MNNBinarySubInt8.S in Sources */, 950B28F029F627F70002F454 /* MNNBinarySubInt8.S in Sources */, 4A224A0C27D0C2D9000A9260 /* ConvolutionPackWinograd.cpp in Sources */, - 4D0C80E52862FC4700C7CAD6 /* CoreMLRaster.metal in Sources */, 92FF044123AA0B7100AC97F6 /* ShapeMoments.cpp in Sources */, 950B28FA2A0C9AC20002F454 /* CPUScaleInt8.cpp in Sources */, 4D9A936026255BDA00F9B43C /* Model.pb-c.c in Sources */, @@ -4164,7 +4160,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; - PRODUCT_BUNDLE_IDENTIFIER = com.taobao.mnn.playground.v3; + PRODUCT_BUNDLE_IDENTIFIER = com.taobao.mnn.9999ve; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -4189,7 +4185,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; - PRODUCT_BUNDLE_IDENTIFIER = com.taobao.mnn.playground.v3; + PRODUCT_BUNDLE_IDENTIFIER = com.taobao.mnn.9999ve; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -4205,7 +4201,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = Q48UX93J22; + DEVELOPMENT_TEAM = 6G7464HHUS; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = demo/Info.plist; INFOPLIST_KEY_NSCameraUsageDescription = "use camera to capture photo for demo"; @@ -4221,7 +4217,7 @@ MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.taobao.mnn.playground.abcd111; + PRODUCT_BUNDLE_IDENTIFIER = com.taobao.mnn.9999; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -4238,7 +4234,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = Q48UX93J22; + DEVELOPMENT_TEAM = 6G7464HHUS; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = demo/Info.plist; INFOPLIST_KEY_NSCameraUsageDescription = "use camera to capture photo for demo"; @@ -4253,7 +4249,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MARKETING_VERSION = 1.0; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.taobao.mnn.playground.abcd111; + PRODUCT_BUNDLE_IDENTIFIER = com.taobao.mnn.9999; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/project/ios/demo/ViewController.mm b/project/ios/demo/ViewController.mm index e8dc32b16..865f6b021 100644 --- a/project/ios/demo/ViewController.mm +++ b/project/ios/demo/ViewController.mm @@ -255,7 +255,7 @@ - (NSString *)inferBuffer:(CMSampleBufferRef)sampleBuffer { [enc setTexture:inputTexture atIndex:0]; [enc setBuffer:_cache->_constant offset:0 atIndex:1]; MNNMetalTensorContent sharedContent; - MNNMetalGetTensorContent(&sharedContent, _input); + _input->getDeviceInfo(&sharedContent, MNN_FORWARD_METAL); // For Metal Context to write, don't need finish, just use flush _input->wait(MNN::Tensor::MAP_TENSOR_WRITE, false); [enc setBuffer:sharedContent.buffer offset:sharedContent.offset atIndex:0]; diff --git a/pymnn/pip_package/build_deps.py b/pymnn/pip_package/build_deps.py index 3341201c8..5d8ab63ee 100644 --- a/pymnn/pip_package/build_deps.py +++ b/pymnn/pip_package/build_deps.py @@ -78,7 +78,7 @@ def build_deps(): if IS_WINDOWS: os.system('cmake -G "Ninja" ' + extra_opts +' -DMNN_BUILD_TRAIN=ON -DMNN_BUILD_CONVERTER=on -DMNN_BUILD_TORCH=OFF\ -DMNN_BUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DMNN_WIN_RUNTIME_MT=ON\ - -DMNN_BUILD_OPENCV=ON -DMNN_IMGCODECS=ON -DMNN_AAPL_FMWK=OFF -DMNN_SEP_BUILD=OFF .. && ninja MNN MNNTrain MNNConvertDeps') + -DMNN_BUILD_OPENCV=ON -DMNN_IMGCODECS=ON -DMNN_AAPL_FMWK=OFF -DMNN_SEP_BUILD=OFF .. && ninja MNN MNNConvertDeps') elif IS_LINUX: extra_opts += '-DMNN_TENSORRT=ON \ -DCMAKE_LIBRARY_PATH=/usr/local/cuda/lib64/stubs/ ' if USE_TRT else ' ' @@ -98,9 +98,9 @@ def build_deps(): extra_opts += ' -DMNN_BUILD_TORCH=ON ' if USE_TORCH else ' ' print(extra_opts) os.system('cmake ' + extra_opts + '-DMNN_BUILD_CONVERTER=on -DMNN_BUILD_TRAIN=ON -DCMAKE_BUILD_TYPE=Release \ - -DMNN_BUILD_SHARED_LIBS=OFF -DMNN_AAPL_FMWK=OFF -DMNN_SEP_BUILD=OFF\ + -DMNN_BUILD_SHARED_LIBS=ON -DMNN_AAPL_FMWK=OFF -DMNN_SEP_BUILD=OFF\ -DMNN_BUILD_OPENCV=ON -DMNN_IMGCODECS=ON \ - .. && make MNN MNNTrain MNNConvertDeps -j32') + .. && make MNN MNNConvertDeps -j4') ################################################################################ # Building dependent libraries ################################################################################ diff --git a/pymnn/pip_package/setup.py b/pymnn/pip_package/setup.py index 67e357fe2..e4817aa9b 100644 --- a/pymnn/pip_package/setup.py +++ b/pymnn/pip_package/setup.py @@ -224,6 +224,9 @@ def configure_extension_build(): if USE_TRT: engine_depend += trt_depend + if IS_DARWIN: + lib_files += [('lib', [os.path.join(root_dir, BUILD_DIR, "libMNN.dylib")])] + lib_files += [('lib', [os.path.join(root_dir, BUILD_DIR, "tools","converter", "libMNNConvertDeps.dylib")])] if USE_CUDA: engine_depend += cuda_depend @@ -307,9 +310,7 @@ def configure_extension_build(): if IS_DARWIN: engine_link_args += ['-stdlib=libc++'] - engine_link_args += ['-Wl,-all_load'] engine_link_args += engine_depend - engine_link_args += ['-Wl,-noall_load'] if IS_LINUX: engine_link_args += ['-Wl,--whole-archive'] engine_link_args += engine_depend @@ -318,9 +319,7 @@ def configure_extension_build(): if IS_WINDOWS: engine_link_args += ['/WHOLEARCHIVE:MNN.lib'] if IS_DARWIN: - tools_link_args += ['-Wl,-all_load'] tools_link_args += tools_depend - tools_link_args += ['-Wl,-noall_load'] if IS_LINUX: tools_link_args += ['-Wl,--whole-archive'] tools_link_args += tools_depend diff --git a/pymnn/src/expr.h b/pymnn/src/expr.h index 3cca6b648..f8188c3e6 100644 --- a/pymnn/src/expr.h +++ b/pymnn/src/expr.h @@ -1499,6 +1499,13 @@ static PyObject* PyMNNExpr_transpose(PyObject *self, PyObject *args) { } PyMNN_ERROR("transpose require args: (Var, [int]|Var)"); } +static PyObject* PyMNNExpr_reverse(PyObject *self, PyObject *args) { + PyObject *x, *y; + if (PyArg_ParseTuple(args, "OO", &x, &y) && isVar(x) && isVar(y)) { + return toPyObj(Express::_Reverse(toVar(x), toVar(y))); + } + PyMNN_ERROR("reverse require args: (Var, Var)"); +} static PyObject* PyMNNExpr_reverse_sequence(PyObject *self, PyObject *args) { PyObject *x, *y; int batchDim, seqDim; @@ -1839,6 +1846,7 @@ static PyMethodDef PyMNNExpr_methods[] = { {"transpose", PyMNNExpr_transpose, METH_VARARGS, "build transpose: (Var, [int]/Var)"}, register_methods(Expr, channel_shuffle, "build channel_shuffle expr", + reverse, "build reverse expr", reverse_sequence, "build reverse_sequence expr", crop, "build crop expr", resize, "build resize expr", diff --git a/schema/current/CaffeOp_generated.h b/schema/current/CaffeOp_generated.h index 6a4637b75..715e96fc2 100644 --- a/schema/current/CaffeOp_generated.h +++ b/schema/current/CaffeOp_generated.h @@ -76,12 +76,6 @@ struct BatchNormT; struct Scale; struct ScaleT; -struct QuantizeLinear; -struct QuantizeLinearT; - -struct DequantizeLinear; -struct DequantizeLinearT; - struct Eltwise; struct EltwiseT; @@ -165,10 +159,6 @@ inline const flatbuffers::TypeTable *BatchNormTypeTable(); inline const flatbuffers::TypeTable *ScaleTypeTable(); -inline const flatbuffers::TypeTable *QuantizeLinearTypeTable(); - -inline const flatbuffers::TypeTable *DequantizeLinearTypeTable(); - inline const flatbuffers::TypeTable *EltwiseTypeTable(); inline const flatbuffers::TypeTable *FlattenTypeTable(); @@ -1149,13 +1139,15 @@ struct QuantizedFloatParamT : public flatbuffers::NativeTable { int8_t clampMin; int8_t clampMax; std::vector winogradAttr; + DataType outputDataType; QuantizedFloatParamT() : method(QuantizeAlgo_DEFAULT), nbits(8), zeroPoint(0), outputZeroPoint(0), clampMin(-128), - clampMax(127) { + clampMax(127), + outputDataType(DataType_DT_INT8) { } }; @@ -1197,6 +1189,9 @@ struct QuantizedFloatParam FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table const flatbuffers::Vector *winogradAttr() const { return GetPointer *>(24); } + DataType outputDataType() const { + return static_cast(GetField(26, 6)); + } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffset(verifier, 4) && @@ -1215,6 +1210,7 @@ struct QuantizedFloatParam FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table VerifyField(verifier, 22) && VerifyOffset(verifier, 24) && verifier.VerifyVector(winogradAttr()) && + VerifyField(verifier, 26) && verifier.EndTable(); } QuantizedFloatParamT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; @@ -1258,6 +1254,9 @@ struct QuantizedFloatParamBuilder { void add_winogradAttr(flatbuffers::Offset> winogradAttr) { fbb_.AddOffset(24, winogradAttr); } + void add_outputDataType(DataType outputDataType) { + fbb_.AddElement(26, static_cast(outputDataType), 6); + } explicit QuantizedFloatParamBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); @@ -1282,8 +1281,10 @@ inline flatbuffers::Offset CreateQuantizedFloatParam( int8_t outputZeroPoint = 0, int8_t clampMin = -128, int8_t clampMax = 127, - flatbuffers::Offset> winogradAttr = 0) { + flatbuffers::Offset> winogradAttr = 0, + DataType outputDataType = DataType_DT_INT8) { QuantizedFloatParamBuilder builder_(_fbb); + builder_.add_outputDataType(outputDataType); builder_.add_winogradAttr(winogradAttr); builder_.add_nbits(nbits); builder_.add_tensorScale(tensorScale); @@ -2922,180 +2923,6 @@ inline flatbuffers::Offset CreateScale( flatbuffers::Offset CreateScale(flatbuffers::FlatBufferBuilder &_fbb, const ScaleT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -struct QuantizeLinearT : public flatbuffers::NativeTable { - typedef QuantizeLinear TableType; - int32_t scaleSize; - int32_t scaleAxis; - std::vector scaleData; - std::vector zeroPointData; - QuantizeLinearT() - : scaleSize(0), - scaleAxis(0) { - } -}; - -struct QuantizeLinear FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef QuantizeLinearT NativeTableType; - static const flatbuffers::TypeTable *MiniReflectTypeTable() { - return QuantizeLinearTypeTable(); - } - int32_t scaleSize() const { - return GetField(4, 0); - } - int32_t scaleAxis() const { - return GetField(6, 0); - } - const flatbuffers::Vector *scaleData() const { - return GetPointer *>(8); - } - const flatbuffers::Vector *zeroPointData() const { - return GetPointer *>(10); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, 4) && - VerifyField(verifier, 6) && - VerifyOffset(verifier, 8) && - verifier.VerifyVector(scaleData()) && - VerifyOffset(verifier, 10) && - verifier.VerifyVector(zeroPointData()) && - verifier.EndTable(); - } - QuantizeLinearT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(QuantizeLinearT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const QuantizeLinearT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct QuantizeLinearBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_scaleSize(int32_t scaleSize) { - fbb_.AddElement(4, scaleSize, 0); - } - void add_scaleAxis(int32_t scaleAxis) { - fbb_.AddElement(6, scaleAxis, 0); - } - void add_scaleData(flatbuffers::Offset> scaleData) { - fbb_.AddOffset(8, scaleData); - } - void add_zeroPointData(flatbuffers::Offset> zeroPointData) { - fbb_.AddOffset(10, zeroPointData); - } - explicit QuantizeLinearBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - QuantizeLinearBuilder &operator=(const QuantizeLinearBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateQuantizeLinear( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t scaleSize = 0, - int32_t scaleAxis = 0, - flatbuffers::Offset> scaleData = 0, - flatbuffers::Offset> zeroPointData = 0) { - QuantizeLinearBuilder builder_(_fbb); - builder_.add_zeroPointData(zeroPointData); - builder_.add_scaleData(scaleData); - builder_.add_scaleAxis(scaleAxis); - builder_.add_scaleSize(scaleSize); - return builder_.Finish(); -} - -flatbuffers::Offset CreateQuantizeLinear(flatbuffers::FlatBufferBuilder &_fbb, const QuantizeLinearT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct DequantizeLinearT : public flatbuffers::NativeTable { - typedef DequantizeLinear TableType; - int32_t scaleSize; - int32_t scaleAxis; - std::vector scaleData; - std::vector zeroPointData; - DequantizeLinearT() - : scaleSize(0), - scaleAxis(0) { - } -}; - -struct DequantizeLinear FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef DequantizeLinearT NativeTableType; - static const flatbuffers::TypeTable *MiniReflectTypeTable() { - return DequantizeLinearTypeTable(); - } - int32_t scaleSize() const { - return GetField(4, 0); - } - int32_t scaleAxis() const { - return GetField(6, 0); - } - const flatbuffers::Vector *scaleData() const { - return GetPointer *>(8); - } - const flatbuffers::Vector *zeroPointData() const { - return GetPointer *>(10); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, 4) && - VerifyField(verifier, 6) && - VerifyOffset(verifier, 8) && - verifier.VerifyVector(scaleData()) && - VerifyOffset(verifier, 10) && - verifier.VerifyVector(zeroPointData()) && - verifier.EndTable(); - } - DequantizeLinearT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(DequantizeLinearT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const DequantizeLinearT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct DequantizeLinearBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_scaleSize(int32_t scaleSize) { - fbb_.AddElement(4, scaleSize, 0); - } - void add_scaleAxis(int32_t scaleAxis) { - fbb_.AddElement(6, scaleAxis, 0); - } - void add_scaleData(flatbuffers::Offset> scaleData) { - fbb_.AddOffset(8, scaleData); - } - void add_zeroPointData(flatbuffers::Offset> zeroPointData) { - fbb_.AddOffset(10, zeroPointData); - } - explicit DequantizeLinearBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - DequantizeLinearBuilder &operator=(const DequantizeLinearBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateDequantizeLinear( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t scaleSize = 0, - int32_t scaleAxis = 0, - flatbuffers::Offset> scaleData = 0, - flatbuffers::Offset> zeroPointData = 0) { - DequantizeLinearBuilder builder_(_fbb); - builder_.add_zeroPointData(zeroPointData); - builder_.add_scaleData(scaleData); - builder_.add_scaleAxis(scaleAxis); - builder_.add_scaleSize(scaleSize); - return builder_.Finish(); -} - -flatbuffers::Offset CreateDequantizeLinear(flatbuffers::FlatBufferBuilder &_fbb, const DequantizeLinearT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - struct EltwiseT : public flatbuffers::NativeTable { typedef Eltwise TableType; EltwiseType type; @@ -4672,6 +4499,7 @@ inline void QuantizedFloatParam::UnPackTo(QuantizedFloatParamT *_o, const flatbu { auto _e = clampMin(); _o->clampMin = _e; }; { auto _e = clampMax(); _o->clampMax = _e; }; { auto _e = winogradAttr(); if (_e) { _o->winogradAttr.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->winogradAttr[_i] = _e->Get(_i); } } }; + { auto _e = outputDataType(); _o->outputDataType = _e; }; } inline flatbuffers::Offset QuantizedFloatParam::Pack(flatbuffers::FlatBufferBuilder &_fbb, const QuantizedFloatParamT* _o, const flatbuffers::rehasher_function_t *_rehasher) { @@ -4693,6 +4521,7 @@ inline flatbuffers::Offset CreateQuantizedFloatParam(flatbu auto _clampMin = _o->clampMin; auto _clampMax = _o->clampMax; auto _winogradAttr = _o->winogradAttr.size() ? _fbb.CreateVector(_o->winogradAttr) : 0; + auto _outputDataType = _o->outputDataType; return MNN::CreateQuantizedFloatParam( _fbb, _weight, @@ -4705,7 +4534,8 @@ inline flatbuffers::Offset CreateQuantizedFloatParam(flatbu _outputZeroPoint, _clampMin, _clampMax, - _winogradAttr); + _winogradAttr, + _outputDataType); } inline Convolution2DT *Convolution2D::UnPack(const flatbuffers::resolver_function_t *_resolver) const { @@ -5342,76 +5172,6 @@ inline flatbuffers::Offset CreateScale(flatbuffers::FlatBufferBuilder &_f _external); } -inline QuantizeLinearT *QuantizeLinear::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new QuantizeLinearT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void QuantizeLinear::UnPackTo(QuantizeLinearT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = scaleSize(); _o->scaleSize = _e; }; - { auto _e = scaleAxis(); _o->scaleAxis = _e; }; - { auto _e = scaleData(); if (_e) { _o->scaleData.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->scaleData[_i] = _e->Get(_i); } } }; - { auto _e = zeroPointData(); if (_e) { _o->zeroPointData.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->zeroPointData[_i] = _e->Get(_i); } } }; -} - -inline flatbuffers::Offset QuantizeLinear::Pack(flatbuffers::FlatBufferBuilder &_fbb, const QuantizeLinearT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateQuantizeLinear(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateQuantizeLinear(flatbuffers::FlatBufferBuilder &_fbb, const QuantizeLinearT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const QuantizeLinearT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _scaleSize = _o->scaleSize; - auto _scaleAxis = _o->scaleAxis; - auto _scaleData = _o->scaleData.size() ? _fbb.CreateVector(_o->scaleData) : 0; - auto _zeroPointData = _o->zeroPointData.size() ? _fbb.CreateVector(_o->zeroPointData) : 0; - return MNN::CreateQuantizeLinear( - _fbb, - _scaleSize, - _scaleAxis, - _scaleData, - _zeroPointData); -} - -inline DequantizeLinearT *DequantizeLinear::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new DequantizeLinearT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void DequantizeLinear::UnPackTo(DequantizeLinearT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = scaleSize(); _o->scaleSize = _e; }; - { auto _e = scaleAxis(); _o->scaleAxis = _e; }; - { auto _e = scaleData(); if (_e) { _o->scaleData.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->scaleData[_i] = _e->Get(_i); } } }; - { auto _e = zeroPointData(); if (_e) { _o->zeroPointData.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->zeroPointData[_i] = _e->Get(_i); } } }; -} - -inline flatbuffers::Offset DequantizeLinear::Pack(flatbuffers::FlatBufferBuilder &_fbb, const DequantizeLinearT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateDequantizeLinear(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateDequantizeLinear(flatbuffers::FlatBufferBuilder &_fbb, const DequantizeLinearT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const DequantizeLinearT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _scaleSize = _o->scaleSize; - auto _scaleAxis = _o->scaleAxis; - auto _scaleData = _o->scaleData.size() ? _fbb.CreateVector(_o->scaleData) : 0; - auto _zeroPointData = _o->zeroPointData.size() ? _fbb.CreateVector(_o->zeroPointData) : 0; - return MNN::CreateDequantizeLinear( - _fbb, - _scaleSize, - _scaleAxis, - _scaleData, - _zeroPointData); -} - inline EltwiseT *Eltwise::UnPack(const flatbuffers::resolver_function_t *_resolver) const { auto _o = new EltwiseT(); UnPackTo(_o, _resolver); @@ -6243,10 +6003,12 @@ inline const flatbuffers::TypeTable *QuantizedFloatParamTypeTable() { { flatbuffers::ET_CHAR, 0, -1 }, { flatbuffers::ET_CHAR, 0, -1 }, { flatbuffers::ET_CHAR, 0, -1 }, - { flatbuffers::ET_INT, 1, -1 } + { flatbuffers::ET_INT, 1, -1 }, + { flatbuffers::ET_INT, 0, 1 } }; static const flatbuffers::TypeFunction type_refs[] = { - QuantizeAlgoTypeTable + QuantizeAlgoTypeTable, + DataTypeTypeTable }; static const char * const names[] = { "weight", @@ -6259,10 +6021,11 @@ inline const flatbuffers::TypeTable *QuantizedFloatParamTypeTable() { "outputZeroPoint", "clampMin", "clampMax", - "winogradAttr" + "winogradAttr", + "outputDataType" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 11, type_codes, type_refs, nullptr, names + flatbuffers::ST_TABLE, 12, type_codes, type_refs, nullptr, names }; return &tt; } @@ -6648,44 +6411,6 @@ inline const flatbuffers::TypeTable *ScaleTypeTable() { return &tt; } -inline const flatbuffers::TypeTable *QuantizeLinearTypeTable() { - static const flatbuffers::TypeCode type_codes[] = { - { flatbuffers::ET_INT, 0, -1 }, - { flatbuffers::ET_INT, 0, -1 }, - { flatbuffers::ET_FLOAT, 1, -1 }, - { flatbuffers::ET_CHAR, 1, -1 } - }; - static const char * const names[] = { - "scaleSize", - "scaleAxis", - "scaleData", - "zeroPointData" - }; - static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 4, type_codes, nullptr, nullptr, names - }; - return &tt; -} - -inline const flatbuffers::TypeTable *DequantizeLinearTypeTable() { - static const flatbuffers::TypeCode type_codes[] = { - { flatbuffers::ET_INT, 0, -1 }, - { flatbuffers::ET_INT, 0, -1 }, - { flatbuffers::ET_FLOAT, 1, -1 }, - { flatbuffers::ET_CHAR, 1, -1 } - }; - static const char * const names[] = { - "scaleSize", - "scaleAxis", - "scaleData", - "zeroPointData" - }; - static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 4, type_codes, nullptr, nullptr, names - }; - return &tt; -} - inline const flatbuffers::TypeTable *EltwiseTypeTable() { static const flatbuffers::TypeCode type_codes[] = { { flatbuffers::ET_CHAR, 0, 0 }, diff --git a/schema/current/MNN_generated.h b/schema/current/MNN_generated.h index fdb1bd4c6..15b5abe67 100644 --- a/schema/current/MNN_generated.h +++ b/schema/current/MNN_generated.h @@ -236,8 +236,6 @@ enum OpType { OpType_GatherElements = 152, OpType_Svd = 153, OpType_Histogram = 154, - OpType_QuantizeLinear = 155, - OpType_DequantizeLinear = 156, OpType_Plugin = 256, OpType_Select = 257, OpType_ZerosLike = 258, @@ -267,7 +265,7 @@ enum OpType { OpType_MAX = OpType_GridSample }; -inline const OpType (&EnumValuesOpType())[177] { +inline const OpType (&EnumValuesOpType())[175] { static const OpType values[] = { OpType_AbsVal, OpType_QuantizedAdd, @@ -419,8 +417,6 @@ inline const OpType (&EnumValuesOpType())[177] { OpType_GatherElements, OpType_Svd, OpType_Histogram, - OpType_QuantizeLinear, - OpType_DequantizeLinear, OpType_Plugin, OpType_Select, OpType_ZerosLike, @@ -607,8 +603,8 @@ inline const char * const *EnumNamesOpType() { "GatherElements", "Svd", "Histogram", - "QuantizeLinear", - "DequantizeLinear", + "", + "", "", "", "", @@ -1164,13 +1160,11 @@ enum OpParameter { OpParameter_LoopParam = 92, OpParameter_ImageProcessParam = 93, OpParameter_CumSum = 94, - OpParameter_QuantizeLinear = 95, - OpParameter_DequantizeLinear = 96, OpParameter_MIN = OpParameter_NONE, - OpParameter_MAX = OpParameter_DequantizeLinear + OpParameter_MAX = OpParameter_CumSum }; -inline const OpParameter (&EnumValuesOpParameter())[97] { +inline const OpParameter (&EnumValuesOpParameter())[95] { static const OpParameter values[] = { OpParameter_NONE, OpParameter_QuantizedAdd, @@ -1266,9 +1260,7 @@ inline const OpParameter (&EnumValuesOpParameter())[97] { OpParameter_GridSample, OpParameter_LoopParam, OpParameter_ImageProcessParam, - OpParameter_CumSum, - OpParameter_QuantizeLinear, - OpParameter_DequantizeLinear + OpParameter_CumSum }; return values; } @@ -1370,15 +1362,13 @@ inline const char * const *EnumNamesOpParameter() { "LoopParam", "ImageProcessParam", "CumSum", - "QuantizeLinear", - "DequantizeLinear", nullptr }; return names; } inline const char *EnumNameOpParameter(OpParameter e) { - if (e < OpParameter_NONE || e > OpParameter_DequantizeLinear) return ""; + if (e < OpParameter_NONE || e > OpParameter_CumSum) return ""; const size_t index = static_cast(e); return EnumNamesOpParameter()[index]; } @@ -1763,14 +1753,6 @@ template<> struct OpParameterTraits { static const OpParameter enum_value = OpParameter_CumSum; }; -template<> struct OpParameterTraits { - static const OpParameter enum_value = OpParameter_QuantizeLinear; -}; - -template<> struct OpParameterTraits { - static const OpParameter enum_value = OpParameter_DequantizeLinear; -}; - struct OpParameterUnion { OpParameter type; void *value; @@ -2554,22 +2536,6 @@ struct OpParameterUnion { return type == OpParameter_CumSum ? reinterpret_cast(value) : nullptr; } - QuantizeLinearT *AsQuantizeLinear() { - return type == OpParameter_QuantizeLinear ? - reinterpret_cast(value) : nullptr; - } - const QuantizeLinearT *AsQuantizeLinear() const { - return type == OpParameter_QuantizeLinear ? - reinterpret_cast(value) : nullptr; - } - DequantizeLinearT *AsDequantizeLinear() { - return type == OpParameter_DequantizeLinear ? - reinterpret_cast(value) : nullptr; - } - const DequantizeLinearT *AsDequantizeLinear() const { - return type == OpParameter_DequantizeLinear ? - reinterpret_cast(value) : nullptr; - } }; bool VerifyOpParameter(flatbuffers::Verifier &verifier, const void *obj, OpParameter type); @@ -3633,12 +3599,6 @@ struct Op FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { const CumSum *main_as_CumSum() const { return main_type() == OpParameter_CumSum ? static_cast(main()) : nullptr; } - const QuantizeLinear *main_as_QuantizeLinear() const { - return main_type() == OpParameter_QuantizeLinear ? static_cast(main()) : nullptr; - } - const DequantizeLinear *main_as_DequantizeLinear() const { - return main_type() == OpParameter_DequantizeLinear ? static_cast(main()) : nullptr; - } const flatbuffers::String *name() const { return GetPointer(10); } @@ -4047,14 +4007,6 @@ template<> inline const CumSum *Op::main_as() const { return main_as_CumSum(); } -template<> inline const QuantizeLinear *Op::main_as() const { - return main_as_QuantizeLinear(); -} - -template<> inline const DequantizeLinear *Op::main_as() const { - return main_as_DequantizeLinear(); -} - struct OpBuilder { flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; @@ -5676,14 +5628,6 @@ inline bool VerifyOpParameter(flatbuffers::Verifier &verifier, const void *obj, auto ptr = reinterpret_cast(obj); return verifier.VerifyTable(ptr); } - case OpParameter_QuantizeLinear: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case OpParameter_DequantizeLinear: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } default: return false; } } @@ -6078,14 +6022,6 @@ inline void *OpParameterUnion::UnPack(const void *obj, OpParameter type, const f auto ptr = reinterpret_cast(obj); return ptr->UnPack(resolver); } - case OpParameter_QuantizeLinear: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case OpParameter_DequantizeLinear: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } default: return nullptr; } } @@ -6468,14 +6404,6 @@ inline flatbuffers::Offset OpParameterUnion::Pack(flatbuffers::FlatBufferB auto ptr = reinterpret_cast(value); return CreateCumSum(_fbb, ptr, _rehasher).Union(); } - case OpParameter_QuantizeLinear: { - auto ptr = reinterpret_cast(value); - return CreateQuantizeLinear(_fbb, ptr, _rehasher).Union(); - } - case OpParameter_DequantizeLinear: { - auto ptr = reinterpret_cast(value); - return CreateDequantizeLinear(_fbb, ptr, _rehasher).Union(); - } default: return 0; } } @@ -6858,14 +6786,6 @@ inline OpParameterUnion::OpParameterUnion(const OpParameterUnion &u) FLATBUFFERS value = new CumSumT(*reinterpret_cast(u.value)); break; } - case OpParameter_QuantizeLinear: { - value = new QuantizeLinearT(*reinterpret_cast(u.value)); - break; - } - case OpParameter_DequantizeLinear: { - value = new DequantizeLinearT(*reinterpret_cast(u.value)); - break; - } default: break; } @@ -7343,16 +7263,6 @@ inline void OpParameterUnion::Reset() { delete ptr; break; } - case OpParameter_QuantizeLinear: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case OpParameter_DequantizeLinear: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } default: break; } value = nullptr; @@ -7535,14 +7445,12 @@ inline const flatbuffers::TypeTable *OpTypeTypeTable() { { flatbuffers::ET_INT, 0, 0 }, { flatbuffers::ET_INT, 0, 0 }, { flatbuffers::ET_INT, 0, 0 }, - { flatbuffers::ET_INT, 0, 0 }, - { flatbuffers::ET_INT, 0, 0 }, { flatbuffers::ET_INT, 0, 0 } }; static const flatbuffers::TypeFunction type_refs[] = { OpTypeTypeTable }; - static const int64_t values[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 512, 513, 514, 515, 516, 517, 518, 600, 601, 603, 604 }; + static const int64_t values[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 512, 513, 514, 515, 516, 517, 518, 600, 601, 603, 604 }; static const char * const names[] = { "AbsVal", "QuantizedAdd", @@ -7694,8 +7602,6 @@ inline const flatbuffers::TypeTable *OpTypeTypeTable() { "GatherElements", "Svd", "Histogram", - "QuantizeLinear", - "DequantizeLinear", "Plugin", "Select", "ZerosLike", @@ -7723,7 +7629,7 @@ inline const flatbuffers::TypeTable *OpTypeTypeTable() { "GridSample" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_ENUM, 177, type_codes, type_refs, values, names + flatbuffers::ST_ENUM, 175, type_codes, type_refs, values, names }; return &tt; } @@ -7824,9 +7730,7 @@ inline const flatbuffers::TypeTable *OpParameterTypeTable() { { flatbuffers::ET_SEQUENCE, 0, 90 }, { flatbuffers::ET_SEQUENCE, 0, 91 }, { flatbuffers::ET_SEQUENCE, 0, 92 }, - { flatbuffers::ET_SEQUENCE, 0, 93 }, - { flatbuffers::ET_SEQUENCE, 0, 94 }, - { flatbuffers::ET_SEQUENCE, 0, 95 } + { flatbuffers::ET_SEQUENCE, 0, 93 } }; static const flatbuffers::TypeFunction type_refs[] = { QuantizedAddTypeTable, @@ -7922,9 +7826,7 @@ inline const flatbuffers::TypeTable *OpParameterTypeTable() { GridSampleTypeTable, LoopParamTypeTable, ImageProcessParamTypeTable, - CumSumTypeTable, - QuantizeLinearTypeTable, - DequantizeLinearTypeTable + CumSumTypeTable }; static const char * const names[] = { "NONE", @@ -8021,12 +7923,10 @@ inline const flatbuffers::TypeTable *OpParameterTypeTable() { "GridSample", "LoopParam", "ImageProcessParam", - "CumSum", - "QuantizeLinear", - "DequantizeLinear" + "CumSum" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_UNION, 97, type_codes, type_refs, nullptr, names + flatbuffers::ST_UNION, 95, type_codes, type_refs, nullptr, names }; return &tt; } diff --git a/schema/default/CaffeOp.fbs b/schema/default/CaffeOp.fbs index b9a4f48cd..dfa45bb0e 100644 --- a/schema/default/CaffeOp.fbs +++ b/schema/default/CaffeOp.fbs @@ -95,6 +95,7 @@ table QuantizedFloatParam{ clampMax: byte = 127; // binary proto: [originKySize, originKxSize, transKySize, transKxSize, {kyStart, kxStart, unitY, unitX}, {...} ...] winogradAttr:[int]; + outputDataType:DataType=DT_INT8; } table Convolution2D { @@ -247,20 +248,6 @@ table Scale { external:[int64]; // [offset, scaleData_bytes_size, biasData_bytes_size] } -table QuantizeLinear { - scaleSize: int; - scaleAxis: int; - scaleData:[float]; - zeroPointData:[byte]; -} - -table DequantizeLinear { - scaleSize: int; - scaleAxis: int; - scaleData:[float]; - zeroPointData:[byte]; -} - enum EltwiseType : byte { PROD = 0, SUM = 1, diff --git a/schema/default/MNN.fbs b/schema/default/MNN.fbs index 2feb1e987..393a484e7 100644 --- a/schema/default/MNN.fbs +++ b/schema/default/MNN.fbs @@ -167,8 +167,6 @@ enum OpType : int { GatherElements = 152, Svd = 153, Histogram = 154, - QuantizeLinear = 155, - DequantizeLinear = 156, Plugin = 256, //The Type load from plugin //Training Op Start from 257 @@ -392,8 +390,6 @@ union OpParameter { LoopParam, ImageProcessParam, CumSum, - QuantizeLinear, - DequantizeLinear, } table Op { diff --git a/source/backend/arm82/asm/arm32/MNNGeluFP16.S b/source/backend/arm82/asm/arm32/MNNGeluFP16.S index 84f7d0d69..f77f2ace1 100644 --- a/source/backend/arm82/asm/arm32/MNNGeluFP16.S +++ b/source/backend/arm82/asm/arm32/MNNGeluFP16.S @@ -62,10 +62,12 @@ vadd.f16 q3, q3, q1 vmul.f16 q2, q2, q14 vmul.f16 q3, q3, q14 -mov lr, #5.0 +mov lr, #5 vdup.16 q4, lr -mov lr, #-5.0 +vcvt.f32.s32 q4, q4 +mov lr, #-5 vdup.16 q5, lr +vcvt.f32.s32 q5, q5 vmax.f16 q2, q2, q5 vmin.f16 q2, q2, q4 vmax.f16 q3, q3, q5 diff --git a/source/backend/arm82/asm/arm64/MNNGeluFP16.S b/source/backend/arm82/asm/arm64/MNNGeluFP16.S index 5e24ceb5c..ef9d3a2ed 100644 --- a/source/backend/arm82/asm/arm64/MNNGeluFP16.S +++ b/source/backend/arm82/asm/arm64/MNNGeluFP16.S @@ -45,8 +45,8 @@ dup v10.8h, w9 // v10: [28.f]x4 dup v9.8h, w10 // v9: [3150.f]x4 dup v8.8h, w11 // v8: [62370.f]x4 -mov w4, #5.0 -mov w5, #-5.0 +mov w4, #5 +mov w5, #-5 GeluZLoop: @@ -67,6 +67,8 @@ fmul v3.8h, v3.8h, v14.8h dup v6.8h, w5 dup v7.8h, w4 +scvtf v6.8h, v6.8h +scvtf v7.8h, v7.8h fmin v2.8h, v2.8h, v7.8h fmin v3.8h, v3.8h, v7.8h fmax v2.8h, v2.8h, v6.8h diff --git a/source/backend/cpu/CPUCast.cpp b/source/backend/cpu/CPUCast.cpp index 7c52c60c8..d85cb2425 100644 --- a/source/backend/cpu/CPUCast.cpp +++ b/source/backend/cpu/CPUCast.cpp @@ -195,6 +195,9 @@ Execution *CPUCastCreator::onCreate(const std::vector &inputs, const s if (dstT == MNN::DataType_DT_INT8 && halide_type_of() == inputDataType) { return new CastDataType(backend); } + if (dstT == MNN::DataType_DT_INT8 && halide_type_of() == inputDataType) { + return new CastDataType(backend); + } if (dstT == MNN::DataType_DT_UINT8 && halide_type_of() == inputDataType) { return new CastDataType(backend); } diff --git a/source/backend/cpu/CPUDequantizeLinear.cpp b/source/backend/cpu/CPUDequantizeLinear.cpp deleted file mode 100644 index c167eadc4..000000000 --- a/source/backend/cpu/CPUDequantizeLinear.cpp +++ /dev/null @@ -1,87 +0,0 @@ -// -// CPUDequantizeLinear.cpp -// MNN -// -// Created by MNN on 2018/07/15. -// Copyright © 2018, Alibaba Group Holding Limited -// -#include "backend/cpu/CPUBackend.hpp" -#include "core/Concurrency.h" -#include "backend/cpu/CPUDequantizeLinear.hpp" -#include "core/TensorUtils.hpp" -#include "compute/CommonOptFunction.h" - -namespace MNN { - -CPUDequantizeLinear::CPUDequantizeLinear(Backend *b, float* scale, int8_t* zeroPoints, int size, int axis, int inputBits) : MNN::Execution(b){ - mSize = size; - mAxis = axis; - mInputBits = inputBits; -} -ErrorCode CPUDequantizeLinear::onResize(const std::vector &inputs, const std::vector &outputs) { - if (mInputBits == 8) { - mFunc = dequantizeFunc; - } else if (mInputBits == 16) { - mFunc = dequantizeFunc; - } else { - mFunc = dequantizeFunc; - } - float *scale = inputs[1]->host(); - int8_t *zero = nullptr; - if (inputs.size() > 2) { - zero = inputs[2]->host();; - } - if (mSize == 1) { - mQuantScales.resize(4, *scale); - if (nullptr != zero) { - mQuantZeroPoints.resize(4, *zero); - } else { - mQuantZeroPoints.resize(4, 0); - } - } else { - mQuantScales.resize(mSize); - ::memcpy(mQuantScales.data(), scale, sizeof(float) * mSize); - if (nullptr != zero) { - mQuantZeroPoints.resize(mSize); - ::memcpy(mQuantZeroPoints.data(), zero, mSize); - } else { - mQuantZeroPoints.resize(mSize); - } - } - return NO_ERROR; -} -ErrorCode CPUDequantizeLinear::onExecute(const std::vector &inputs, const std::vector &outputs) { - auto input = inputs[0]; - int N = input->length(0); - ssize_t size = N; - auto core = static_cast(backend())->int8Functions(); - int UNIT, SRC_UNIT, DST_XUNIT; - core->MNNGetGemmUnit(&UNIT, &SRC_UNIT, &DST_XUNIT); - auto dst = outputs[0]->host(); - auto src = input->host(); - mFunc(dst, src, input->dimensions(), input->size(), mSize, UNIT, mQuantScales.data(), mQuantZeroPoints.data(), core); - return NO_ERROR; -} - -class CPUDequantizeLinearCreator : public CPUBackend::Creator { -public: - virtual Execution *onCreate(const std::vector &inputs, const std::vector &outputs, - const MNN::Op *op, Backend *backend) const override { - auto dataType = inputs[0]->getType(); - if (dataType.bits != 8 && dataType.bits != 16 && dataType.bits != 32) { - MNN_ERROR("Input of Dequantize must be int8/uint8/fp16/int32\n"); - return nullptr; - } - int inputBits = dataType.bits; - int size = op->main_as_DequantizeLinear()->scaleSize(); - int axis = op->main_as_DequantizeLinear()->scaleAxis(); - if (inputs.size() > 2) { - return new CPUDequantizeLinear(backend, inputs[1]->host(), inputs[2]->host(), size, axis, inputBits); - } - return new CPUDequantizeLinear(backend, inputs[1]->host(), nullptr, size, axis, inputBits); - } -}; - -REGISTER_CPU_OP_CREATOR(CPUDequantizeLinearCreator, OpType_DequantizeLinear); - -} // namespace MNN diff --git a/source/backend/cpu/CPUDequantizeLinear.hpp b/source/backend/cpu/CPUDequantizeLinear.hpp deleted file mode 100644 index ae0fcdb2c..000000000 --- a/source/backend/cpu/CPUDequantizeLinear.hpp +++ /dev/null @@ -1,81 +0,0 @@ -// -// CPUDequantizeLinear.hpp -// MNN -// -// Created by MNN on 2018/07/15. -// Copyright © 2018, Alibaba Group Holding Limited -// - -#ifndef CPUDequantizeLinear_hpp -#define CPUDequantizeLinear_hpp - -#include "core/AutoStorage.h" -#include "core/Execution.hpp" -#include "compute/Int8FunctionsOpt.h" - -namespace MNN { -typedef void(*dequantFunc)(float* dst, const int8_t* source, int inputDim, int inputSize, int size, int UNIT, float* scales, int8_t* zeros, const CoreInt8Functions* core); -class CPUDequantizeLinear : public Execution { -public: - CPUDequantizeLinear(Backend *b, float* scales, int8_t* zeroPoints, int size = 1, int axis = 0, int inputBits = 8); - virtual ~CPUDequantizeLinear() = default; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; - virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; -private: - std::vector mQuantScales; - std::vector mQuantZeroPoints; - int mSize = 1; - int mAxis = 0; - int mInputBits = 8; - dequantFunc mFunc; -}; - -template -void dequantizeFunc(float* dst, const int8_t* source, int inputDim, int inputSize, int size, int UNIT, float* scales, int8_t* zeros, const CoreInt8Functions* core) { -#ifdef MNN_USE_SSE - auto src = (uint8_t*)source; - int offset = 128; -#else - auto src = (int8_t*)source; - int offset = 0; -#endif -// auto src = (T*)source; - if (inputDim == 1) { - for (int i = 0; i < size; ++i) { - dst[i] = static_cast(src[i] - zeros[i] - offset) * scales[i]; - } - return; - } - int chw = 1; - if (inputDim > 1) { - chw = inputSize / (size * sizeof(T)); - } - - if (size == 1) { - if (sizeof(T) == 1) { - core->MNNInt8ScaleToFloat(dst, (int8_t*)src, scales, chw / UNIT, zeros[0]); - int sizeDiv = (int)chw / UNIT; - for (int k = sizeDiv * UNIT; k < chw; ++k) { - dst[k] = static_cast(src[k] - zeros[0] - offset) * scales[0]; - } - } else { - for (int k = 0; k < chw; ++k) { - dst[k] = static_cast(src[k] - zeros[0] - offset) * scales[0]; - } - } - - } else { - for (int i = 0; i < size; ++i) { - std::vector tmp(4, scales[i]); - //core->MNNInt8ScaleToFloat(dst, src, tmp.data(), sizeDiv, mQuantZeroPoints[i]); - for (int k = 0; k < chw; ++k) { - dst[k] = static_cast(src[k] - zeros[i] - offset) * scales[i]; - } - src += chw; - dst += chw; - } - } -} -} // namespace MNN - -#endif /* CPUDequantizeLinear_hpp */ diff --git a/source/backend/cpu/CPUOPRegister.cpp b/source/backend/cpu/CPUOPRegister.cpp index 70d5a028f..d08e1dc9e 100644 --- a/source/backend/cpu/CPUOPRegister.cpp +++ b/source/backend/cpu/CPUOPRegister.cpp @@ -66,8 +66,6 @@ extern void ___CPUSetDiff1DCreator__OpType_SetDiff1D__(); extern void ___CPUEltwiseInt8Creator__OpType_EltwiseInt8__(); extern void ___CPUSvdCreator__OpType_Svd__(); extern void ___CPULayerNormCreator__OpType_LayerNorm__(); -extern void ___CPUQuantizeLinearCreator__OpType_QuantizeLinear__(); -extern void ___CPUDequantizeLinearCreator__OpType_DequantizeLinear__(); #ifdef MNN_SUPPORT_RENDER extern void ___CPURasterAndInterpolateCreator__OpType_RasterAndInterpolate__(); @@ -146,8 +144,5 @@ ___CPURasterAndInterpolateCreator__OpType_RasterAndInterpolate__(); ___CPURasterDiffCreator__OpType_RasterDiff__(); ___CPUTextureCreator__OpType_Texture__(); #endif -___CPUQuantizeLinearCreator__OpType_QuantizeLinear__(); -___CPUDequantizeLinearCreator__OpType_DequantizeLinear__(); -//CPUQuantizeLinearCreator } } diff --git a/source/backend/cpu/CPUQuantizeLinear.cpp b/source/backend/cpu/CPUQuantizeLinear.cpp deleted file mode 100644 index f0a7efe6c..000000000 --- a/source/backend/cpu/CPUQuantizeLinear.cpp +++ /dev/null @@ -1,85 +0,0 @@ -// -// CPUQuantizeLinear.cpp -// MNN -// -// Created by MNN on 2018/07/15. -// Copyright © 2018, Alibaba Group Holding Limited -// -#include "backend/cpu/CPUBackend.hpp" -#include "core/Concurrency.h" -#include "backend/cpu/CPUQuantizeLinear.hpp" -#include "compute/CommonOptFunction.h" -#include "core/TensorUtils.hpp" - -namespace MNN { - -CPUQuantizeLinear::CPUQuantizeLinear(Backend *b, int size, int axis) : MNN::Execution(b){ - mSize = size; - mAxis = axis; -} - -ErrorCode CPUQuantizeLinear::onResize(const std::vector &inputs, const std::vector &outputs) { - int size = mSize; - float* scale = inputs[1]->host(); - int8_t* zero = nullptr; - if (inputs.size() > 2) { - zero = inputs[2]->host(); - } - if (mSize == 1) { - float s = scale[0] == 0?0: 1/ scale[0]; - mQuantScales.resize(4, s); - if (nullptr != zero) { - int8_t z = *zero; - mQuantZeroPoints.resize(4, z); - } else { - mQuantZeroPoints.resize(4); - } - } else { // TODO scale: (1,D) - - } - return NO_ERROR; -} -ErrorCode CPUQuantizeLinear::onExecute(const std::vector &inputs, const std::vector &outputs) { - auto input = inputs[0]; - int N = input->length(0), C = input->length(1), H = input->length(2), W = input->length(3); - ssize_t size = N * C * H * W; - auto core = static_cast(backend())->int8Functions(); - int UNIT, SRC_UNIT, DST_XUNIT; - core->MNNGetGemmUnit(&UNIT, &SRC_UNIT, &DST_XUNIT); - int maxValue = 127; - int minValue = -128; -#ifdef MNN_USE_SSE - auto dst = outputs[0]->host(); - int offset = 128; -#else - auto dst = outputs[0]->host(); - int offset = 0; -#endif - if (mSize == 1) { - auto src = input->host(); - int sizeDiv = (int)size / UNIT; - core->MNNFloat2Int8(src, (int8_t*)dst, size / UNIT, mQuantScales.data(), -128, 127, mQuantZeroPoints[0]); - for (int i = sizeDiv * UNIT; i < size; ++i) { - int v = (int)roundf(src[i] * mQuantScales[0]) + mQuantZeroPoints[0] + offset; - v = std::max(minValue + offset, std::min(maxValue + offset, v)); - dst[i] = v; - } - } else { - - } - return NO_ERROR; -} - -class CPUQuantizeLinearCreator : public CPUBackend::Creator { -public: - virtual Execution *onCreate(const std::vector &inputs, const std::vector &outputs, - const MNN::Op *op, Backend *backend) const override { - int size = op->main_as_QuantizeLinear()->scaleSize(); - int axis = op->main_as_QuantizeLinear()->scaleAxis(); - return new CPUQuantizeLinear(backend, size, axis); - } -}; - -REGISTER_CPU_OP_CREATOR(CPUQuantizeLinearCreator, OpType_QuantizeLinear); - -} // namespace MNN diff --git a/source/backend/cpu/CPUQuantizeLinear.hpp b/source/backend/cpu/CPUQuantizeLinear.hpp deleted file mode 100644 index 60abebaab..000000000 --- a/source/backend/cpu/CPUQuantizeLinear.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// -// CPUQuantizeLinear.hpp -// MNN -// -// Created by MNN on 2018/07/15. -// Copyright © 2018, Alibaba Group Holding Limited -// - -#ifndef CPUQuantizeLinear_hpp -#define CPUQuantizeLinear_hpp - -#include "core/AutoStorage.h" -#include "core/Execution.hpp" - -namespace MNN { -class CPUQuantizeLinear : public Execution { -public: - CPUQuantizeLinear(Backend *b, int size = 1, int axis = 0); - virtual ~CPUQuantizeLinear() = default; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; - virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; -private: - std::vector mQuantScales; - std::vector mQuantZeroPoints; - int mSize = 1; - int mAxis = 0; -}; - -} // namespace MNN - -#endif /* CPUQuantizeLinear_hpp */ diff --git a/source/backend/cpu/CPURaster.cpp b/source/backend/cpu/CPURaster.cpp index dbd2b4ac1..f5895b83e 100644 --- a/source/backend/cpu/CPURaster.cpp +++ b/source/backend/cpu/CPURaster.cpp @@ -884,14 +884,14 @@ class CPULoop : public Execution { // Loop Op's command's first index must be output outputStride = cmd->view()->GetAs(0)->stride()->data(); } - halide_type_t outputType; + halide_type_t inputType; for (int v=0; vindexes()->data()[v]; auto tensor = mStack[tensorIndex]; auto iterIndex = cmd->iterIndexes()->data()[v]; auto offset = iter; - if (0 == v) { - outputType = tensor->getType(); + if (1 == v) { + inputType = tensor->getType(); } if (iterIndex >= 0) { offset = mStack[iterIndex]->host()[iter]; @@ -969,10 +969,10 @@ class CPULoop : public Execution { if (OpType_BinaryOp == op->type()) { auto src0 = mContainer[tId].stackPtr[cmd->indexes()->data()[1]]; MNNBinaryExecute proc; - if (outputType.code == halide_type_float) { + if (inputType.code == halide_type_float) { proc = static_cast(backend())->functions()->MNNSelectBinaryFunctionForFloat(op->main_as_BinaryOp()->opType()); } else { - MNN_ASSERT(outputType.code == halide_type_int); + MNN_ASSERT(inputType.code == halide_type_int); proc = CPUBinary::selectForInt(op->main_as_BinaryOp()->opType()); } auto lastS = cmd->size()->data()[2]; diff --git a/source/backend/cpu/CPURuntime.cpp b/source/backend/cpu/CPURuntime.cpp index 06d3604f1..0cf9a336d 100644 --- a/source/backend/cpu/CPURuntime.cpp +++ b/source/backend/cpu/CPURuntime.cpp @@ -1531,6 +1531,8 @@ void cpuinfo_arm_init(struct cpuinfo_arm_isa* cpuinfo_isa) { cpu_family == CPUFAMILY_ARM_EVEREST_SAWTOOTH || cpu_family == CPUFAMILY_ARM_PCORE_ECORE_COLL; + cpuinfo_isa->i8mm = cpu_family == CPUFAMILY_ARM_EVEREST_SAWTOOTH || + cpu_family == CPUFAMILY_ARM_PCORE_ECORE_COLL; #endif // iOS // arm64-osx diff --git a/source/backend/cpu/CPUUnary.cpp b/source/backend/cpu/CPUUnary.cpp index f0b10f794..9c5feaa70 100644 --- a/source/backend/cpu/CPUUnary.cpp +++ b/source/backend/cpu/CPUUnary.cpp @@ -45,10 +45,59 @@ ErrorCode CPUUnary::onResize(const std::vector &inputs, const std::vec static void _Neg(void* out, const void* inp, int realSize) { MNNScaleAndAddBiasScalar((float*)out, (const float*)inp, 0.0f, -1.0f, realSize); } +#ifdef MNN_USE_NEON +static inline void exeNegInt8 (int8_t* out, const int8_t* inp, int sizeQuad, int8x8_t inZeroPoint, int8x8_t outZeroPoint, float32x4_t inpScale, float32x4_t outScale) { + for (int i = 0;i < sizeQuad; ++i) { + int8x16_t negValue = vld1q_s8(inp); + int16x8_t val16_0 = vmovl_s8(vget_low_s8(negValue)); + int16x8_t val16_1 = vmovl_s8(vget_high_s8(negValue)); + val16_0 = vsubw_s8(val16_0, inZeroPoint); + val16_1 = vsubw_s8(val16_1, inZeroPoint); + int32x4_t val32_00 = vmovl_s16(vget_low_s16(val16_0)); + int32x4_t val32_01 = vmovl_s16(vget_high_s16(val16_0)); + int32x4_t val32_10 = vmovl_s16(vget_low_s16(val16_1)); + int32x4_t val32_11 = vmovl_s16(vget_high_s16(val16_1)); + float32x4_t valF_00 = vcvtq_f32_s32(val32_00); + float32x4_t valF_01 = vcvtq_f32_s32(val32_01); + float32x4_t valF_10 = vcvtq_f32_s32(val32_10); + float32x4_t valF_11 = vcvtq_f32_s32(val32_11); + valF_00 = vmulq_f32(valF_00, inpScale); + valF_01 = vmulq_f32(valF_01, inpScale); + valF_10 = vmulq_f32(valF_10, inpScale); + valF_11 = vmulq_f32(valF_11, inpScale); + valF_00 = vnegq_f32(valF_00); + valF_01 = vnegq_f32(valF_01); + valF_10 = vnegq_f32(valF_10); + valF_11 = vnegq_f32(valF_11); + valF_00 = vmulq_f32(valF_00, outScale); + valF_01 = vmulq_f32(valF_01, outScale); + valF_10 = vmulq_f32(valF_10, outScale); + valF_11 = vmulq_f32(valF_11, outScale); + int32x4_t val_00 = vcvtq_s32_f32(valF_00); + int32x4_t val_01 = vcvtq_s32_f32(valF_01); + int32x4_t val_10 = vcvtq_s32_f32(valF_10); + int32x4_t val_11 = vcvtq_s32_f32(valF_11); + int16x4_t v16_0 = vqmovn_s32(val_00); + int16x4_t v16_1 = vqmovn_s32(val_01); + int16x4_t v16_2 = vqmovn_s32(val_10); + int16x4_t v16_3 = vqmovn_s32(val_11); + int16x8_t v16_4 = vcombine_s16(v16_0, v16_1); + int16x8_t v16_5 = vcombine_s16(v16_2, v16_3); + v16_4 = vaddw_s8(v16_4, outZeroPoint); + v16_5 = vaddw_s8(v16_5, outZeroPoint); + int8x8_t v8_0 = vqmovn_s16(v16_4); + int8x8_t v8_1 = vqmovn_s16(v16_5); + vst1_s8(out, v8_0); + vst1_s8(out + 8, v8_1); + inp += 16; + out += 16; + } +} +#endif static void _NegInt8(void* out, const void* inp, int realSize, QuanPrePostParameters* params) { int sizeDiv16 = realSize / 16; - int start = 0; + int remain = realSize % 16; #ifdef MNN_USE_NEON int8_t* outPtr = (int8_t*)out; int8_t* inPtr = (int8_t*)inp; @@ -57,55 +106,16 @@ static void _NegInt8(void* out, const void* inp, int realSize, QuanPrePostParame float32x4_t inpScale = vdupq_n_f32(params->inputScale[0]); float32x4_t outScale = vdupq_n_f32(params->outputScale[0]); if (sizeDiv16 > 0) { - for (int i = 0;i < sizeDiv16; ++i) { - int8x16_t negValue = vld1q_s8(inPtr); - int16x8_t val16_0 = vmovl_s8(vget_low_s8(negValue)); - int16x8_t val16_1 = vmovl_s8(vget_high_s8(negValue)); - val16_0 = vsubw_s8(val16_0, inZeroPoint); - val16_1 = vsubw_s8(val16_1, inZeroPoint); - int32x4_t val32_00 = vmovl_s16(vget_low_s16(val16_0)); - int32x4_t val32_01 = vmovl_s16(vget_high_s16(val16_0)); - int32x4_t val32_10 = vmovl_s16(vget_low_s16(val16_1)); - int32x4_t val32_11 = vmovl_s16(vget_high_s16(val16_1)); - float32x4_t valF_00 = vcvtq_f32_s32(val32_00); - float32x4_t valF_01 = vcvtq_f32_s32(val32_01); - float32x4_t valF_10 = vcvtq_f32_s32(val32_10); - float32x4_t valF_11 = vcvtq_f32_s32(val32_11); - valF_00 = vmulq_f32(valF_00, inpScale); - valF_01 = vmulq_f32(valF_01, inpScale); - valF_10 = vmulq_f32(valF_10, inpScale); - valF_11 = vmulq_f32(valF_11, inpScale); - valF_00 = vnegq_f32(valF_00); - valF_01 = vnegq_f32(valF_01); - valF_10 = vnegq_f32(valF_10); - valF_11 = vnegq_f32(valF_11); - valF_00 = vmulq_f32(valF_00, outScale); - valF_01 = vmulq_f32(valF_01, outScale); - valF_10 = vmulq_f32(valF_10, outScale); - valF_11 = vmulq_f32(valF_11, outScale); - int32x4_t val_00 = vcvtq_s32_f32(valF_00); - int32x4_t val_01 = vcvtq_s32_f32(valF_01); - int32x4_t val_10 = vcvtq_s32_f32(valF_10); - int32x4_t val_11 = vcvtq_s32_f32(valF_11); - int16x4_t v16_0 = vqmovn_s32(val_00); - int16x4_t v16_1 = vqmovn_s32(val_01); - int16x4_t v16_2 = vqmovn_s32(val_10); - int16x4_t v16_3 = vqmovn_s32(val_11); - int16x8_t v16_4 = vcombine_s16(v16_0, v16_1); - int16x8_t v16_5 = vcombine_s16(v16_2, v16_3); - v16_4 = vaddw_s8(v16_4, outZeroPoint); - v16_5 = vaddw_s8(v16_5, outZeroPoint); - int8x8_t v8_0 = vqmovn_s16(v16_4); - int8x8_t v8_1 = vqmovn_s16(v16_5); - - vst1_s8(outPtr, v8_0); - vst1_s8(outPtr + 8, v8_1); - inPtr += 16; - outPtr += 16; - } - start = 16 * sizeDiv16; + exeNegInt8(outPtr, inPtr, sizeDiv16, inZeroPoint, outZeroPoint, inpScale, outScale); } -#endif + if (remain > 0) { + int8_t intmp[16] = {0}; + int8_t outmp[16] = {0}; + ::memcpy(intmp, reinterpret_cast(inp) + 16 * sizeDiv16, remain * sizeof(int8_t)); + exeNegInt8(outmp, intmp, 1, inZeroPoint, outZeroPoint, inpScale, outScale); + ::memcpy(reinterpret_cast(out) + 16 * sizeDiv16, outmp, remain * sizeof(int8_t)); + } +#else #ifdef MNN_USE_SSE uint8_t* dst = (uint8_t*)out; uint8_t* src = (uint8_t*)inp; @@ -121,7 +131,7 @@ static void _NegInt8(void* out, const void* inp, int realSize, QuanPrePostParame float outscale_ = params->outputScale[0]; int min_ = static_cast(params->minValue); int max_ = static_cast(params->maxValue); - for (int i = start; i < realSize; ++i) { + for (int i = 0; i < realSize; ++i) { int value = -(src[i] - inzero_ - offset) * inscale_ * outscale_ + outzero_; if (value > max_) { value = max_; @@ -131,14 +141,65 @@ static void _NegInt8(void* out, const void* inp, int realSize, QuanPrePostParame } dst[i] = value + offset; } +#endif } static void _ABS(void* out, const void* inp, int realSize) { MNNReluWithSlopeCommon((float*)out, (const float*)inp, realSize, -1.0f); } +#ifdef MNN_USE_NEON +static inline void exeAbsInt8(int8_t* out, const int8_t* inp, int sizeQuad, int8x8_t inZeroPoint, int8x8_t outZeroPoint, float32x4_t inpScale, float32x4_t outScale) { + for (int i = 0;i < sizeQuad; ++i) { + int8x16_t absValue = vld1q_s8(inp); + int16x8_t val16_0 = vmovl_s8(vget_low_s8(absValue)); + int16x8_t val16_1 = vmovl_s8(vget_high_s8(absValue)); + val16_0 = vsubw_s8(val16_0, inZeroPoint); + val16_1 = vsubw_s8(val16_1, inZeroPoint); + int32x4_t val32_00 = vmovl_s16(vget_low_s16(val16_0)); + int32x4_t val32_01 = vmovl_s16(vget_high_s16(val16_0)); + int32x4_t val32_10 = vmovl_s16(vget_low_s16(val16_1)); + int32x4_t val32_11 = vmovl_s16(vget_high_s16(val16_1)); + float32x4_t valF_00 = vcvtq_f32_s32(val32_00); + float32x4_t valF_01 = vcvtq_f32_s32(val32_01); + float32x4_t valF_10 = vcvtq_f32_s32(val32_10); + float32x4_t valF_11 = vcvtq_f32_s32(val32_11); + valF_00 = vmulq_f32(valF_00, inpScale); + valF_01 = vmulq_f32(valF_01, inpScale); + valF_10 = vmulq_f32(valF_10, inpScale); + valF_11 = vmulq_f32(valF_11, inpScale); + valF_00 = vabsq_f32(valF_00); + valF_01 = vabsq_f32(valF_01); + valF_10 = vabsq_f32(valF_10); + valF_11 = vabsq_f32(valF_11); + valF_00 = vmulq_f32(valF_00, outScale); + valF_01 = vmulq_f32(valF_01, outScale); + valF_10 = vmulq_f32(valF_10, outScale); + valF_11 = vmulq_f32(valF_11, outScale); + int32x4_t val_00 = vcvtq_s32_f32(valF_00); + int32x4_t val_01 = vcvtq_s32_f32(valF_01); + int32x4_t val_10 = vcvtq_s32_f32(valF_10); + int32x4_t val_11 = vcvtq_s32_f32(valF_11); + int16x4_t v16_0 = vqmovn_s32(val_00); + int16x4_t v16_1 = vqmovn_s32(val_01); + int16x4_t v16_2 = vqmovn_s32(val_10); + int16x4_t v16_3 = vqmovn_s32(val_11); + int16x8_t v16_4 = vcombine_s16(v16_0, v16_1); + int16x8_t v16_5 = vcombine_s16(v16_2, v16_3); + v16_4 = vaddw_s8(v16_4, outZeroPoint); + v16_5 = vaddw_s8(v16_5, outZeroPoint); + int8x8_t v8_0 = vqmovn_s16(v16_4); + int8x8_t v8_1 = vqmovn_s16(v16_5); + + vst1_s8(out, v8_0); + vst1_s8(out + 8, v8_1); + inp += 16; + out += 16; + } +} +#endif static void _ABSInt8(void* out, const void* inp, int realSize, QuanPrePostParameters* params) { int sizeDiv16 = realSize / 16; - int start = 0; + int remain = realSize % 16; #ifdef MNN_USE_NEON int8_t* outPtr = (int8_t*)out; int8_t* inPtr = (int8_t*)inp; @@ -147,55 +208,16 @@ static void _ABSInt8(void* out, const void* inp, int realSize, QuanPrePostParame float32x4_t inpScale = vdupq_n_f32(params->inputScale[0]); float32x4_t outScale = vdupq_n_f32(params->outputScale[0]); if (sizeDiv16 > 0) { - for (int i = 0;i < sizeDiv16; ++i) { - int8x16_t absValue = vld1q_s8(inPtr); - int16x8_t val16_0 = vmovl_s8(vget_low_s8(absValue)); - int16x8_t val16_1 = vmovl_s8(vget_high_s8(absValue)); - val16_0 = vsubw_s8(val16_0, inZeroPoint); - val16_1 = vsubw_s8(val16_1, inZeroPoint); - int32x4_t val32_00 = vmovl_s16(vget_low_s16(val16_0)); - int32x4_t val32_01 = vmovl_s16(vget_high_s16(val16_0)); - int32x4_t val32_10 = vmovl_s16(vget_low_s16(val16_1)); - int32x4_t val32_11 = vmovl_s16(vget_high_s16(val16_1)); - float32x4_t valF_00 = vcvtq_f32_s32(val32_00); - float32x4_t valF_01 = vcvtq_f32_s32(val32_01); - float32x4_t valF_10 = vcvtq_f32_s32(val32_10); - float32x4_t valF_11 = vcvtq_f32_s32(val32_11); - valF_00 = vmulq_f32(valF_00, inpScale); - valF_01 = vmulq_f32(valF_01, inpScale); - valF_10 = vmulq_f32(valF_10, inpScale); - valF_11 = vmulq_f32(valF_11, inpScale); - valF_00 = vabsq_f32(valF_00); - valF_01 = vabsq_f32(valF_01); - valF_10 = vabsq_f32(valF_10); - valF_11 = vabsq_f32(valF_11); - valF_00 = vmulq_f32(valF_00, outScale); - valF_01 = vmulq_f32(valF_01, outScale); - valF_10 = vmulq_f32(valF_10, outScale); - valF_11 = vmulq_f32(valF_11, outScale); - int32x4_t val_00 = vcvtq_s32_f32(valF_00); - int32x4_t val_01 = vcvtq_s32_f32(valF_01); - int32x4_t val_10 = vcvtq_s32_f32(valF_10); - int32x4_t val_11 = vcvtq_s32_f32(valF_11); - int16x4_t v16_0 = vqmovn_s32(val_00); - int16x4_t v16_1 = vqmovn_s32(val_01); - int16x4_t v16_2 = vqmovn_s32(val_10); - int16x4_t v16_3 = vqmovn_s32(val_11); - int16x8_t v16_4 = vcombine_s16(v16_0, v16_1); - int16x8_t v16_5 = vcombine_s16(v16_2, v16_3); - v16_4 = vaddw_s8(v16_4, outZeroPoint); - v16_5 = vaddw_s8(v16_5, outZeroPoint); - int8x8_t v8_0 = vqmovn_s16(v16_4); - int8x8_t v8_1 = vqmovn_s16(v16_5); - - vst1_s8(outPtr, v8_0); - vst1_s8(outPtr + 8, v8_1); - inPtr += 16; - outPtr += 16; - } - start = 16 * sizeDiv16; + exeAbsInt8(outPtr, inPtr, sizeDiv16, inZeroPoint, outZeroPoint, inpScale, outScale); } -#endif + if (remain > 0) { + int8_t intmp[16] = {0}; + int8_t outmp[16] = {0}; + ::memcpy(intmp, reinterpret_cast(inp) + 16 * sizeDiv16, remain * sizeof(int8_t)); + exeAbsInt8(outmp, intmp, 1, inZeroPoint, outZeroPoint, inpScale, outScale); + ::memcpy(reinterpret_cast(out) + 16 * sizeDiv16, outmp, remain * sizeof(int8_t)); + } +#else #ifdef MNN_USE_SSE uint8_t* dst = (uint8_t*)out; uint8_t* src = (uint8_t*)inp; @@ -207,7 +229,7 @@ static void _ABSInt8(void* out, const void* inp, int realSize, QuanPrePostParame #endif int inzero_ = static_cast(params->inputZeroPoint[0]); int outzero_ = static_cast(params->outputZeroPoint[0]); - for (int i = start; i < realSize; ++i) { + for (int i = 0; i < realSize; ++i) { auto value = abs((src[i] - inzero_ - offset) * params->inputScale[0]); value = value * params->outputScale[0] + outzero_; if (value > params->maxValue) { @@ -218,11 +240,38 @@ static void _ABSInt8(void* out, const void* inp, int realSize, QuanPrePostParame } dst[i] = value + offset; } +#endif } - +#ifdef MNN_USE_NEON +static inline void exeSignInt8 (int8_t* out, const int8_t* inp, int sizeQuad, int16x8_t one, int16x8_t negone, int16x8_t zero, int8x8_t inZeroPoint, int8x8_t outZeroPoint, float32x4_t outScale) { + for (int i = 0;i < sizeQuad; ++i) { + int8x16_t value = vld1q_s8(inp); + int16x8_t vallow = vmovl_s8(vget_low_s8(value)); + int16x8_t valhi = vmovl_s8(vget_high_s8(value)); + vallow = vsubw_s8(vallow, inZeroPoint); + valhi = vsubw_s8(valhi, inZeroPoint); + uint16x8_t lomask1 = vcgtq_s16(vallow, zero); + uint16x8_t lomask_1 = vcltq_s16(vallow, zero); + uint16x8_t himask1 = vcgtq_s16(valhi, zero); + uint16x8_t himask_1 = vcltq_s16(valhi, zero); + uint16x8_t zeromask_low = vceqq_u16(lomask1, lomask_1); + uint16x8_t zeromask_hi = vceqq_u16(himask1, himask_1); + vallow = vbslq_s16(lomask1, one, negone); + vallow = vbslq_s16(zeromask_low, zero, vallow); + valhi = vbslq_s16(himask1, one, negone); + valhi = vbslq_s16(zeromask_hi, zero, valhi); + int8x8_t v8_0 = vqmovn_s16(vallow); + int8x8_t v8_1 = vqmovn_s16(valhi); + vst1_s8(out, v8_0); + vst1_s8(out + 8, v8_1); + inp += 16; + out += 16; + } +} +#endif static void _SignInt8(void* out, const void* inp, int realSize, QuanPrePostParameters* params) { int sizeDiv16 = realSize / 16; - int start = 0; + int remain = realSize % 16; #ifdef MNN_USE_NEON int8_t* outPtr = (int8_t*)out; int8_t* inPtr = (int8_t*)inp; @@ -233,54 +282,16 @@ static void _SignInt8(void* out, const void* inp, int realSize, QuanPrePostParam int8x8_t outZeroPoint = vdup_n_s8(params->outputZeroPoint[0]); float32x4_t outScale = vdupq_n_f32(params->outputScale[0]); if (sizeDiv16 > 0) { - for (int i = 0;i < sizeDiv16; ++i) { - int8x16_t value = vld1q_s8(inPtr); - int16x8_t vallow = vmovl_s8(vget_low_s8(value)); - int16x8_t valhi = vmovl_s8(vget_high_s8(value)); - vallow = vsubw_s8(vallow, inZeroPoint); - valhi = vsubw_s8(valhi, inZeroPoint); - uint16x8_t lomask1 = vcgtq_s16(vallow, zero); - uint16x8_t lomask_1 = vcltq_s16(vallow, zero); - uint16x8_t himask1 = vcgtq_s16(valhi, zero); - uint16x8_t himask_1 = vcltq_s16(valhi, zero); - vallow = vbslq_s16(lomask1, vallow, one); - vallow = vbslq_s16(lomask_1, vallow, negone); - valhi = vbslq_s16(himask1, valhi, one); - valhi = vbslq_s16(himask_1, valhi, negone); - int32x4_t val32_00 = vmovl_s16(vget_low_s16(vallow)); - int32x4_t val32_01 = vmovl_s16(vget_high_s16(vallow)); - int32x4_t val32_10 = vmovl_s16(vget_low_s16(valhi)); - int32x4_t val32_11 = vmovl_s16(vget_high_s16(valhi)); - float32x4_t valF_00 = vcvtq_f32_s32(val32_00); - float32x4_t valF_01 = vcvtq_f32_s32(val32_01); - float32x4_t valF_10 = vcvtq_f32_s32(val32_10); - float32x4_t valF_11 = vcvtq_f32_s32(val32_11); - valF_00 = vmulq_f32(valF_00, outScale); - valF_01 = vmulq_f32(valF_01, outScale); - valF_10 = vmulq_f32(valF_10, outScale); - valF_11 = vmulq_f32(valF_11, outScale); - int32x4_t val_00 = vcvtq_s32_f32(valF_00); - int32x4_t val_01 = vcvtq_s32_f32(valF_01); - int32x4_t val_10 = vcvtq_s32_f32(valF_10); - int32x4_t val_11 = vcvtq_s32_f32(valF_11); - int16x4_t v16_0 = vqmovn_s32(val_00); - int16x4_t v16_1 = vqmovn_s32(val_01); - int16x4_t v16_2 = vqmovn_s32(val_10); - int16x4_t v16_3 = vqmovn_s32(val_11); - int16x8_t v16_4 = vcombine_s16(v16_0, v16_1); - int16x8_t v16_5 = vcombine_s16(v16_2, v16_3); - v16_4 = vaddw_s8(v16_4, outZeroPoint); - v16_5 = vaddw_s8(v16_5, outZeroPoint); - int8x8_t v8_0 = vqmovn_s16(v16_4); - int8x8_t v8_1 = vqmovn_s16(v16_5); - vst1_s8(outPtr, v8_0); - vst1_s8(outPtr + 8, v8_1); - inPtr += 16; - outPtr += 16; - } - start = 16 * sizeDiv16; + exeSignInt8(outPtr, inPtr, sizeDiv16, one, negone, zero, inZeroPoint, outZeroPoint, outScale); } -#endif + if (remain > 0) { + int8_t intmp[16] = {0}; + int8_t outmp[16] = {0}; + ::memcpy(intmp, reinterpret_cast(inp) + 16 * sizeDiv16, remain * sizeof(int8_t)); + exeSignInt8(outmp, intmp, 1, one, negone, zero, inZeroPoint, outZeroPoint, outScale); + ::memcpy(reinterpret_cast(out) + 16 * sizeDiv16, outmp, remain * sizeof(int8_t)); + } +#else #ifdef MNN_USE_SSE uint8_t* dst = (uint8_t*)out; uint8_t* src = (uint8_t*)inp; @@ -292,7 +303,7 @@ static void _SignInt8(void* out, const void* inp, int realSize, QuanPrePostParam #endif int inzero_ = static_cast(params->inputZeroPoint[0]); int outzero_ = static_cast(params->outputZeroPoint[0]); - for (int i = start; i < realSize; ++i) { + for (int i = 0; i < realSize; ++i) { auto value = src[i] - offset - inzero_; if (value > 0) { int f = 1 * params->outputScale[0] + outzero_; @@ -304,6 +315,7 @@ static void _SignInt8(void* out, const void* inp, int realSize, QuanPrePostParam dst[i] = outzero_ + offset; } } +#endif } static void _Square(void* out, const void* inp, int realSize) { diff --git a/source/backend/cpu/arm/arm32/MNNGelu.S b/source/backend/cpu/arm/arm32/MNNGelu.S index 96bd322be..4eddbd9ce 100644 --- a/source/backend/cpu/arm/arm32/MNNGelu.S +++ b/source/backend/cpu/arm/arm32/MNNGelu.S @@ -45,8 +45,8 @@ vdup.32 q10, r8 //q10: [28.f]x4 vdup.32 q9, r10 //q9: [3150.f]x4 vdup.32 q8, r11 //q8: [62370.f]x4 -mov r4, #5.0 -mov r5, #-5.0 +mov r4, #5 +mov r5, #-5 GeluZLoop: @@ -68,6 +68,8 @@ vmul.f32 q3, q3, q14 // value // if value > 5, then value=5; if value<-5, then value=-5 vdup.32 q7, r4 vdup.32 q6, r5 +vcvt.f32.s32 q7, q7 +vcvt.f32.s32 q6, q6 vmax.f32 q2, q2, q6 vmax.f32 q3, q3, q6 vmin.f32 q2, q2, q7 diff --git a/source/backend/cpu/arm/arm32/bf16/MNNGelu_BF16.S b/source/backend/cpu/arm/arm32/bf16/MNNGelu_BF16.S index 907b0893e..29cb7647a 100644 --- a/source/backend/cpu/arm/arm32/bf16/MNNGelu_BF16.S +++ b/source/backend/cpu/arm/arm32/bf16/MNNGelu_BF16.S @@ -45,8 +45,8 @@ vdup.32 q10, r8 //q10: [28.f]x4 vdup.32 q9, r10 //q9: [3150.f]x4 vdup.32 q8, r11 //q8: [62370.f]x4 -mov r4, #5.0 -mov r5, #-5.0 +mov r4, #5 +mov r5, #-5 GeluZLoop: @@ -70,6 +70,8 @@ vmul.f32 q3, q3, q14 vdup.32 q7, r4 vdup.32 q6, r5 +vcvt.f32.s32 q7, q7 +vcvt.f32.s32 q6, q6 vmax.f32 q2, q2, q6 vmax.f32 q3, q3, q6 vmin.f32 q2, q2, q7 diff --git a/source/backend/cpu/compute/CommonOptFunction.cpp b/source/backend/cpu/compute/CommonOptFunction.cpp index abb6523dd..2df086eb3 100644 --- a/source/backend/cpu/compute/CommonOptFunction.cpp +++ b/source/backend/cpu/compute/CommonOptFunction.cpp @@ -2595,35 +2595,20 @@ void MNNPackTranspose(float* dst, const float* src, size_t area, size_t depth, i } void MNNExp(float* dst, const float* src, const float* offset, size_t dataSize) { - int countC8 = (int)dataSize / 8; + int countC8 = static_cast(dataSize) / 8; + int remain = static_cast(dataSize) % 8; + float parameters[] = { + (float)logf(2.0f), 1.0f / (float)logf(2.0f), 1.0f, 1.0f, 0.5f, 1.0f / 6.0f, 1.0f / 24.0f, 1.0f / 120.0f}; if (countC8 > 0) { // Align to eight so asm is easier to write - float parameters[] = { - (float)logf(2.0f), 1.0f / (float)logf(2.0f), 1.0f, 1.0f, 0.5f, 1.0f / 6.0f, 1.0f / 24.0f, 1.0f / 120.0f}; MNNExpC8(dst, src, offset, parameters, countC8); } - float alpha = offset[0]; - float beta = offset[1]; - int remain = countC8 * 8; - auto param = logf(2.0f); - float xLimit = 87; - for (int i = remain; i < dataSize; i++) { - /*Origin Function*/ - //dst[i] = expf(src[i] * alpha) + beta; - /*Approciate Function*/ - - auto x = alpha * src[i]; - x = ALIMAX(x, -xLimit); - x = ALIMIN(x, xLimit); - - int div = (x / param); - int div2 = (div + 127) << 23; - auto xReamin = x - div * param; - float expBasic = *(float*)(&div2); - - auto t = xReamin; - auto expRemain = ((((1.0f / 120 * t + 1.0f / 24) * t + 1.0f / 6) * t + 0.5f) * t + 1.0f) * t + 1.0f; - dst[i] = expBasic * expRemain + beta; + if (remain > 0) { + float intmp[8] = {0}; + float outmp[8] = {0}; + ::memcpy(intmp, src + 8 * countC8, remain * sizeof(float)); + MNNExpC8(outmp, intmp, offset, parameters, 1); + ::memcpy(dst + 8 * countC8, outmp, remain * sizeof(float)); } } @@ -2670,30 +2655,33 @@ void MNNReluWithSlope(float* dst, const float* src, size_t sizeQuad, float slope } void MNNReluWithSlopeCommon(float* dst, const float* src, size_t size, float slope) { - int sizeQuad = size / 4; - int start = 0; + int sizeQuad = static_cast(size) / 4; + int remain = static_cast(size) % 4; if (sizeQuad > 0) { MNNReluWithSlope(dst, src, sizeQuad, slope); - start = sizeQuad * 4; } - for (int j = start; j < size; j++) { - if (src[j] < 0) { - dst[j] = src[j] * slope; - } else { - dst[j] = src[j]; - } + if (remain > 0) { + float intmp[4] = {0}, outmp[4] = {0}; + ::memcpy(intmp, src + sizeQuad * 4, remain * sizeof(float)); + MNNReluWithSlope(outmp, intmp, 1, slope); + ::memcpy(dst + sizeQuad * 4, outmp, remain * sizeof(float)); } } void MNNHardSwishCommon(float* dst, const float* src, size_t size) { int sizeQuad = static_cast(size / 4); - int start = 0; + int remain = static_cast(size) % 4; #ifdef MNN_USE_SSE if (sizeQuad > 0) { MNNHardSwish(dst, src, sizeQuad); - start = sizeQuad * 4; } -#endif + if (remain > 0) { + float intmp[4] = {0}, outmp[4] = {0}; + ::memcpy(intmp, src + sizeQuad * 4, remain * sizeof(float)); + MNNHardSwish(outmp, intmp, 1); + ::memcpy(dst + sizeQuad * 4, outmp, remain * sizeof(float)); + } +#else #ifdef MNN_USE_NEON float32x4_t zero = vdupq_n_f32(0.f); float32x4_t three = vdupq_n_f32(3.f); @@ -2704,9 +2692,16 @@ void MNNHardSwishCommon(float* dst, const float* src, size_t size) { auto y = vmulq_f32(vmulq_f32(x, vminq_f32(vmaxq_f32(vaddq_f32(x, three), zero), six)), divsix); vst1q_f32(dst + 4 * i, y); } - start = sizeQuad * 4; -#endif - for (int j = start; j < size; j++) { + if (remain > 0) { + float intmp[4] = {0}, outmp[4] = {0}; + ::memcpy(intmp, src + sizeQuad * 4, remain * sizeof(float)); + auto x = vld1q_f32(intmp); + auto y = vmulq_f32(vmulq_f32(x, vminq_f32(vmaxq_f32(vaddq_f32(x, three), zero), six)), divsix); + vst1q_f32(outmp, y); + ::memcpy(dst + sizeQuad * 4, outmp, remain * sizeof(float)); + } +#else + for (int j = 0; j < size; j++) { if (src[j] <= -3) { dst[j] = 0; } else if (src[j] >= 3){ @@ -2715,6 +2710,8 @@ void MNNHardSwishCommon(float* dst, const float* src, size_t size) { dst[j] = src[j] * (src[j] + 3) / 6.f; } } +#endif +#endif } void MNNGeluStandardCommon(float* dst, const float* src, size_t size) { @@ -2725,14 +2722,20 @@ void MNNGeluStandardCommon(float* dst, const float* src, size_t size) { void MNNGeluCommon(float* dst, const float* src, size_t size) { int sizeQuad = static_cast(size / 8); - int start = 0; + int remain = static_cast(size) % 8; #if defined(MNN_USE_SSE) || defined(MNN_USE_NEON) + float parameters[8] = {0.044715f, 0.79788458f, 378.f, 17325.f, 135135.f, 28.f, 3150.f, 62370.f}; if (sizeQuad > 0) { - float parameters[8] = {0.044715f, 0.79788458f, 378.f, 17325.f, 135135.f, 28.f, 3150.f, 62370.f}; MNNGelu(dst, src, sizeQuad, parameters); - start = sizeQuad * 8; } -#endif + if (remain > 0) { + float intmp[8] = {0}; + float outmp[8] = {0}; + ::memcpy(intmp, src + 8 * sizeQuad, remain * sizeof(float)); + MNNGelu(outmp, intmp, 1, parameters); + ::memcpy(dst + 8 * sizeQuad, outmp, remain * sizeof(float)); + } +#else auto tanhf_poly = [](float value) -> float { if (value > 5.0f) { return 1.0f; @@ -2745,11 +2748,12 @@ void MNNGeluCommon(float* dst, const float* src, size_t size) { return a / b; } }; - for (int i = start; i < size; i++) { + for (int i = 0; i < size; i++) { float temp = 0.044715f * src[i] * src[i] * src[i]; temp = 0.79788458f * (temp + src[i]); dst[i] = (1.0f + tanhf_poly(temp)) * src[i] * 0.5f; } +#endif } void MNNScaleAndAddBiasScalar(float* dst, const float* src, float bias, float alpha, size_t number) { @@ -3056,11 +3060,13 @@ void MNNSigmoidLowp(float* dst, const float* src, size_t dataSize) { }; MNNExp(dst, src, offset, dataSize); #ifdef MNN_USE_NEON - int dataC4 = (int)dataSize / 4; + int dataC4 = static_cast(dataSize) / 4; + int remain = static_cast(dataSize) % 4; + float32x4_t value = vdupq_n_f32(1.0f); + if(dataC4 > 0) { - // neon optimization for sigmid cpu - float32x4_t value = vdupq_n_f32(1.0f); float32x4_t out = vld1q_f32(dst); + // neon optimization for sigmid cpu for (int i = 1; i < dataC4; ++i) { out = vrecpeq_f32(vaddq_f32(value,out)); vst1q_f32(dst ,out); @@ -3070,12 +3076,20 @@ void MNNSigmoidLowp(float* dst, const float* src, size_t dataSize) { out = vrecpeq_f32(vaddq_f32(value,out)); vst1q_f32(dst, out); dst += 4; - dataSize = dataSize - 4 * dataC4; } -#endif + if (remain > 0) { + float intmp[4] = {0}; + ::memcpy(intmp, dst, remain * sizeof(float)); + float32x4_t out = vld1q_f32(intmp); + out = vrecpeq_f32(vaddq_f32(value,out)); + vst1q_f32(intmp, out); + ::memcpy(dst, intmp, remain * sizeof(float)); + } +#else for (int i = 0; i < dataSize; ++i) { dst[i] = 1.0f / (1.0f + dst[i]); } +#endif } void MNNMultiAndDestTransformCommon23(float **cacheLine, const float *weigth, float *dest, int cacheLineSize, int ow, const float* bias, const float* parameters) { diff --git a/source/backend/cpu/compute/ConvInt8TiledExecutor.cpp b/source/backend/cpu/compute/ConvInt8TiledExecutor.cpp index c67e395de..7abf443d2 100644 --- a/source/backend/cpu/compute/ConvInt8TiledExecutor.cpp +++ b/source/backend/cpu/compute/ConvInt8TiledExecutor.cpp @@ -231,6 +231,10 @@ ErrorCode DenseConvInt8TiledExecutor::onExecute(const std::vector& inpu } else { quanParam.minValue = mMutableResource.mClampMin; } + int dstBytes = static_cast(backend())->getBytes(backend(), output); + if (dstBytes != 1) { + quanParam.useInt8 = 0; + } //MNN_PRINT("max: %d, min: %d\n", quanParam.maxValue, quanParam.minValue); const int col_buffer_unit_size = mIm2ColParamter.kernelCountUnit * DST_XUNIT * SRC_UNIT * sizeof(int8_t); auto col_buffer_size = col_buffer_unit_size * mIm2ColCount; @@ -262,13 +266,13 @@ ErrorCode DenseConvInt8TiledExecutor::onExecute(const std::vector& inpu if (number > 0) { blitProc(colAddr, srcPtr, info, el); } - auto outputInTilePtr = outputDataPtr + xIndexStart * PackUnit; + auto outputInTilePtr = outputDataPtr + xIndexStart * PackUnit * dstBytes; auto colAddrTemp = colAddr; do { int step = ALIMIN(DST_XUNIT, realDstCount); - mGemmKernel(outputInTilePtr, colAddrTemp, weightDataPtr, kernelCountUnitDouble, dstZStep, ocDiv4, &quanParam, step); + mGemmKernel(outputInTilePtr, colAddrTemp, weightDataPtr, kernelCountUnitDouble, dstZStep * dstBytes, ocDiv4, &quanParam, step); realDstCount-=step; - outputInTilePtr += DST_XUNIT * PackUnit; + outputInTilePtr += DST_XUNIT * PackUnit * dstBytes; colAddrTemp += col_buffer_unit_size; } while(realDstCount > 0); } diff --git a/source/backend/cpu/compute/Convolution1x1Strassen.cpp b/source/backend/cpu/compute/Convolution1x1Strassen.cpp index 31f11ea24..b2c06fa91 100644 --- a/source/backend/cpu/compute/Convolution1x1Strassen.cpp +++ b/source/backend/cpu/compute/Convolution1x1Strassen.cpp @@ -110,9 +110,6 @@ ErrorCode Convolution1x1Strassen::onResize(const std::vector &inputs, auto matrixSizeE = output->height() * output->width() * input->batch(); auto outputPlane = output->height() * output->width(); mUnits.clear(); - auto inputPtr = TensorUtils::getDescribe(input)->mem->chunk(); - auto outputPtr = TensorUtils::getDescribe(output)->mem->chunk(); - std::shared_ptr __autoFunction; auto padY = mPadY; auto padX = mPadX; @@ -156,9 +153,9 @@ ErrorCode Convolution1x1Strassen::onResize(const std::vector &inputs, int e = planeSize; int l = ic; int h = oc; - auto aPtr = inputPtr + core->pack * planeStart * bytes; + uint8_t* aPtr = nullptr; auto bPtr = TensorUtils::getDescribe(weightTensor)->mem->chunk();; - auto cPtr = outputPtr + core->pack * planeStart * bytes; + uint8_t* cPtr = nullptr; auto biasPtr = TensorUtils::getDescribe(mResource->mBias.get())->mem->chunk(); memoryPool->beginGroup(); auto code = unit.mStracssenComputor->onEncode(e, l, h, matrixSizeE * core->pack, UP_DIV(l, lPack) * lPack * hPack, matrixSizeE * core->pack, aPtr, bPtr, cPtr, true, biasPtr, postParameters); @@ -200,9 +197,9 @@ ErrorCode Convolution1x1Strassen::onResize(const std::vector &inputs, int e = matrixSizeE; int l = ic; int h = std::min(ocSize * core->pack, ocWeightSize * hPack); - auto aPtr = inputPtr; + uint8_t* aPtr = nullptr; auto bPtr = TensorUtils::getDescribe(mResource->mWeight.get())->mem->chunk() + hPack * icAlign * ocStartWeight * bytes; - auto cPtr = outputPtr + core->pack * matrixSizeE * ocStart * bytes; + uint8_t* cPtr = nullptr; auto biasPtr = TensorUtils::getDescribe(mResource->mBias.get())->mem->chunk() + core->pack * ocStart * bytes; memoryPool->beginGroup(); auto code = unit.mStracssenComputor->onEncode(e, l, h, matrixSizeE * core->pack, UP_DIV(l, lPack) * lPack * hPack, matrixSizeE * core->pack, aPtr, bPtr, cPtr, true, biasPtr, postParameters); diff --git a/source/backend/cpu/compute/Int8FunctionsOpt.cpp b/source/backend/cpu/compute/Int8FunctionsOpt.cpp index baaf6337b..73e399628 100644 --- a/source/backend/cpu/compute/Int8FunctionsOpt.cpp +++ b/source/backend/cpu/compute/Int8FunctionsOpt.cpp @@ -1453,7 +1453,9 @@ static void MNNGemmInt8AddBiasScale_16x4_Unit(int8_t* dst, const int8_t* src, co for (int j = 0; j < GEMM_INT8_UNIT; ++j) { const auto weight_j = weight_sz + j * GEMM_INT8_SRC_UNIT; for (int i = 0; i < GEMM_INT8_SRC_UNIT; ++i) { +// if (j == 2) printf("%d, %d\n", (int32_t)src_z[i], (int32_t)weight_j[i]); dstTemp[j] += (int32_t)src_z[i] * (int32_t)weight_j[i]; +// if (j == 0) printf("%d\n", dstTemp[j]); } } } diff --git a/source/backend/cuda/CMakeLists.txt b/source/backend/cuda/CMakeLists.txt index d4ea34b4d..83fed9b4e 100644 --- a/source/backend/cuda/CMakeLists.txt +++ b/source/backend/cuda/CMakeLists.txt @@ -6,7 +6,6 @@ if(MNN_CUDA_PROFILE) set(EXTRA_LIBS -lnvToolsExt) endif() - if(CUDA_FOUND) set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -D_FORCE_INLINES -Wno-deprecated-gpu-targets -w ${EXTRA_LIBS}") if(CMAKE_BUILD_TYPE MATCHES Debug) @@ -52,6 +51,7 @@ if(CUDA_FOUND) ENDIF() # Limit minimum cuda version for each archs + IF (${arch_count} EQUAL 1) IF ((CUDA_ARCH_FLAGS_readable_code VERSION_GREATER "80") OR (CUDA_ARCH_FLAGS_readable_code VERSION_EQUAL "80")) IF (CUDA_VERSION VERSION_LESS "11.2") diff --git a/source/backend/cuda/execution/BinaryExecution.cu b/source/backend/cuda/execution/BinaryExecution.cu index 8ec8f83b4..3e7f75025 100644 --- a/source/backend/cuda/execution/BinaryExecution.cu +++ b/source/backend/cuda/execution/BinaryExecution.cu @@ -52,7 +52,8 @@ ErrorCode BinaryExecution::onExecute(const std::vector &inputs, const int stride1[3] = {0, 0, s1}; int stride2[3] = {0, 0, 1}; - auto type = outputs[0]->getType(); + // use input type. output type maybe fixed, for example greater/less + auto type = inputs[0]->getType(); if (type.code == halide_type_float) { // Use Half or float type.bits = static_cast(backend())->getBytes(inputs[0]) * 8; @@ -102,4 +103,4 @@ public: static CUDACreatorRegister __init(OpType_BinaryOp); static CUDACreatorRegister __init2(OpType_Eltwise); } -} \ No newline at end of file +} diff --git a/source/backend/cuda/execution/ConvCutlassExecution.cu b/source/backend/cuda/execution/ConvCutlassExecution.cu index 4dfb47f50..28f455a55 100644 --- a/source/backend/cuda/execution/ConvCutlassExecution.cu +++ b/source/backend/cuda/execution/ConvCutlassExecution.cu @@ -199,54 +199,55 @@ ErrorCode ConvCutlassExecution::onResize(const std::vector &inputs, con mGpuComputeCap = runtime->compute_capability(); //MNN_PRINT("Gpu smArch is sm_%d\n", mGpuComputeCap); - if(mGpuComputeCap < 70) { + if (mGpuComputeCap < 70) { return callCutlassGemmCudaCoreFloat16(inputs, outputs); - } else if(mGpuComputeCap < 75) { + } else if (mGpuComputeCap < 75) { return callCutlassGemmTensorCore884(inputs, outputs); } - -#ifdef ENABLE_CUDA_TUNE_PARAM - /* - // 0 -> Gemm, 1~N -> BatchGemm - int32_t batchSize = 0; - // [0]->A, [1]->B, [2]->bias, [3]->output - std::pair ptrOffset[4]; - int32_t batchOffset[4]; - // [0]->alpha, [1]->beta, [2]->splitK - int32_t coefs[3]; - // 0 -> RowColumn, 1 -> RowRow - int32_t layout; - bool epilogueVectorize - */ - mInfo.problemSize[0] = mGemmInfo.elh[0]; - mInfo.problemSize[1] = mGemmInfo.elhPad[2]; - mInfo.problemSize[2] = mGemmInfo.elhPad[1]; - - mInfo.coefs[0] = 1; - mInfo.coefs[1] = 1; - mInfo.coefs[2] = 1; - - mInfo.epilogueVectorize = true; - mInfo.epilogueType = mActivationType;// Linear-Relu-Relu6 - mInfo.precisionType = mPrecisonLevel;// - mInfo.backend = mBackendPtr; - - mInfo.batchSize = 0;// For Gemm - mInfo.layout = 0; - void *inputA_ptr = mNeedIm2Col ? (void *)mIm2ColBuffer : (void *)input->deviceId(); - - mInfo.ptrOffset[0] = std::make_pair((void *)inputA_ptr, mGemmInfo.elhPad[1]); - mInfo.ptrOffset[1] = std::make_pair((void *)mFilterAddr, mGemmInfo.elhPad[1]); - mInfo.ptrOffset[2] = std::make_pair((void *)mBiasAddr, 0); - mInfo.ptrOffset[3] = std::make_pair((void *)outputs[0]->deviceId(), mGemmInfo.elhPad[2]); - getGemmTensorCoreFloat16Param(&mInfo); - // set preferd block shape argments - setGemmTensorCoreFloat16Argments(&mInfo); - return NO_ERROR; -#else - + #ifdef ENABLE_CUDA_TUNE_PARAM + if (mGpuComputeCap >= 80) { + mIsTuned = true; + /* + // 0 -> Gemm, 1~N -> BatchGemm + int32_t batchSize = 0; + // [0]->A, [1]->B, [2]->bias, [3]->output + std::pair ptrOffset[4]; + int32_t batchOffset[4]; + // [0]->alpha, [1]->beta, [2]->splitK + int32_t coefs[3]; + // 0 -> RowColumn, 1 -> RowRow + int32_t layout; + bool epilogueVectorize + */ + mInfo.problemSize[0] = mGemmInfo.elh[0]; + mInfo.problemSize[1] = mGemmInfo.elhPad[2]; + mInfo.problemSize[2] = mGemmInfo.elhPad[1]; + + mInfo.coefs[0] = 1; + mInfo.coefs[1] = 1; + mInfo.coefs[2] = 1; + + mInfo.epilogueVectorize = true; + mInfo.epilogueType = mActivationType;// Linear-Relu-Relu6 + mInfo.precisionType = mPrecisonLevel;// + mInfo.backend = mBackendPtr; + + mInfo.batchSize = 0;// For Gemm + mInfo.layout = 0; + void *inputA_ptr = mNeedIm2Col ? (void *)mIm2ColBuffer : (void *)input->deviceId(); + + mInfo.ptrOffset[0] = std::make_pair((void *)inputA_ptr, mGemmInfo.elhPad[1]); + mInfo.ptrOffset[1] = std::make_pair((void *)mFilterAddr, mGemmInfo.elhPad[1]); + mInfo.ptrOffset[2] = std::make_pair((void *)mBiasAddr, 0); + mInfo.ptrOffset[3] = std::make_pair((void *)outputs[0]->deviceId(), mGemmInfo.elhPad[2]); + getGemmTensorCoreFloat16Param(&mInfo); + // set preferd block shape argments + setGemmTensorCoreFloat16Argments(&mInfo); + return NO_ERROR; + } + #endif + return callCutlassGemmTensorCore(inputs, outputs); -#endif } ErrorCode ConvCutlassExecution::onExecute(const std::vector &inputs, const std::vector &outputs) { diff --git a/source/backend/cuda/execution/ConvWinogradExecution.cu b/source/backend/cuda/execution/ConvWinogradExecution.cu index d74499f16..934c8558e 100644 --- a/source/backend/cuda/execution/ConvWinogradExecution.cu +++ b/source/backend/cuda/execution/ConvWinogradExecution.cu @@ -310,75 +310,78 @@ ErrorCode ConvWinogradExecution::onResize(const std::vector &inputs, c //MNN_PRINT("Winograd BatchGemm batch:%d, MNK:%d-%d-%d\n", mBlock2, mGemmInfo.elh[0], mGemmInfo.elhPad[2], mGemmInfo.elhPad[1]); if(mFp16Infer) { #ifdef ENABLE_CUDA_TUNE_PARAM - /* - // 0 -> Gemm, 1~N -> BatchGemm - int32_t batchSize = 0; - // [0]->A, [1]->B, [2]->bias, [3]->output - std::pair ptrOffset[4]; - int32_t batchOffset[4]; - // [0]->alpha, [1]->beta, [2]->splitK - int32_t coefs[3]; - // 0 -> RowColumn, 1 -> RowRow - int32_t layout; - bool epilogueVectorize - */ - mInfo.problemSize[0] = mGemmInfo.elh[0]; - mInfo.problemSize[1] = mGemmInfo.elhPad[2]; - mInfo.problemSize[2] = mGemmInfo.elhPad[1]; - - mInfo.coefs[0] = 1; - mInfo.coefs[1] = 0; - mInfo.epilogueVectorize = true; - mInfo.epilogueType = 0;// Linear - mInfo.precisionType = 2;// FP16_FP16 - mInfo.backend = mResource->mBackend; - - mInfo.batchSize = mBlock2; - mInfo.layout = 0; - - mInfo.ptrOffset[0] = std::make_pair((void *)mBtdB_Buffer, mGemmInfo.elhPad[1]); - mInfo.ptrOffset[1] = std::make_pair((void *)mResource->mFilter, mGemmInfo.elhPad[1]); - mInfo.ptrOffset[2] = std::make_pair((void *)mResource->mBias, 0); - mInfo.ptrOffset[3] = std::make_pair((void *)mMatmul_Buffer, mGemmInfo.elhPad[2]); - - mInfo.batchOffset[0] = mGemmInfo.elh[0] * mGemmInfo.elhPad[1]; - mInfo.batchOffset[1] = mGemmInfo.elhPad[1] * mGemmInfo.elhPad[2]; - mInfo.batchOffset[2] = 0; - mInfo.batchOffset[3] = mGemmInfo.elh[0] * mGemmInfo.elhPad[2]; - - getGemmBatchedTensorCoreFloat16Param(&mInfo); - // set preferd block shape argments - setGemmBatchedTensorCoreFloat16Argments(&mInfo); - - #else - typename GemmBatchedTensor_F16_F16_Linear_AlignTensor_Row_Column_Sm75::Arguments arguments{problem_size, // <- problem size of matrix multiplication - {(ElementInput_F16 *)mBtdB_Buffer, mGemmInfo.elhPad[1]}, // Ptr + ldm - (int64_t)(mGemmInfo.elh[0] * mGemmInfo.elhPad[1]), // batch_stride_A - {(ElementInput_F16 *)mResource->mFilter, mGemmInfo.elhPad[1]}, // Ptr + ldm - (int64_t)(mGemmInfo.elhPad[1] * mGemmInfo.elhPad[2]), // batch_stride_B - {(ElementOutput_F16 *)mResource->mBias, 0}, // Ptr + ldm if ldm = 0, vector, - (int64_t)(0), // batch_stride_bias - {(ElementOutput_F16 *)mMatmul_Buffer, mGemmInfo.elhPad[2]}, // Ptr + ldm - (int64_t)(mGemmInfo.elh[0] * mGemmInfo.elhPad[2]), // batch_stride_C - {alpha, beta}, // <- tuple of alpha and beta - mBlock2}; // batch_count + if(mGpuComputeCap >= 80 ) { + mIsTuned = true; + /* + // 0 -> Gemm, 1~N -> BatchGemm + int32_t batchSize = 0; + // [0]->A, [1]->B, [2]->bias, [3]->output + std::pair ptrOffset[4]; + int32_t batchOffset[4]; + // [0]->alpha, [1]->beta, [2]->splitK + int32_t coefs[3]; + // 0 -> RowColumn, 1 -> RowRow + int32_t layout; + bool epilogueVectorize + */ + mInfo.problemSize[0] = mGemmInfo.elh[0]; + mInfo.problemSize[1] = mGemmInfo.elhPad[2]; + mInfo.problemSize[2] = mGemmInfo.elhPad[1]; + + mInfo.coefs[0] = 1; + mInfo.coefs[1] = 0; + mInfo.epilogueVectorize = true; + mInfo.epilogueType = 0;// Linear + mInfo.precisionType = 2;// FP16_FP16 + mInfo.backend = mResource->mBackend; + + mInfo.batchSize = mBlock2; + mInfo.layout = 0; + + mInfo.ptrOffset[0] = std::make_pair((void *)mBtdB_Buffer, mGemmInfo.elhPad[1]); + mInfo.ptrOffset[1] = std::make_pair((void *)mResource->mFilter, mGemmInfo.elhPad[1]); + mInfo.ptrOffset[2] = std::make_pair((void *)mResource->mBias, 0); + mInfo.ptrOffset[3] = std::make_pair((void *)mMatmul_Buffer, mGemmInfo.elhPad[2]); + + mInfo.batchOffset[0] = mGemmInfo.elh[0] * mGemmInfo.elhPad[1]; + mInfo.batchOffset[1] = mGemmInfo.elhPad[1] * mGemmInfo.elhPad[2]; + mInfo.batchOffset[2] = 0; + mInfo.batchOffset[3] = mGemmInfo.elh[0] * mGemmInfo.elhPad[2]; + + getGemmBatchedTensorCoreFloat16Param(&mInfo); + // set preferd block shape argments + setGemmBatchedTensorCoreFloat16Argments(&mInfo); + } + #endif + if(!mIsTuned) { + typename GemmBatchedTensor_F16_F16_Linear_AlignTensor_Row_Column_Sm75::Arguments arguments{problem_size, // <- problem size of matrix multiplication + {(ElementInput_F16 *)mBtdB_Buffer, mGemmInfo.elhPad[1]}, // Ptr + ldm + (int64_t)(mGemmInfo.elh[0] * mGemmInfo.elhPad[1]), // batch_stride_A + {(ElementInput_F16 *)mResource->mFilter, mGemmInfo.elhPad[1]}, // Ptr + ldm + (int64_t)(mGemmInfo.elhPad[1] * mGemmInfo.elhPad[2]), // batch_stride_B + {(ElementOutput_F16 *)mResource->mBias, 0}, // Ptr + ldm if ldm = 0, vector, + (int64_t)(0), // batch_stride_bias + {(ElementOutput_F16 *)mMatmul_Buffer, mGemmInfo.elhPad[2]}, // Ptr + ldm + (int64_t)(mGemmInfo.elh[0] * mGemmInfo.elhPad[2]), // batch_stride_C + {alpha, beta}, // <- tuple of alpha and beta + mBlock2}; // batch_count - size_t workspace_size = GemmBatchedTensor_F16_F16_Linear_AlignTensor_Row_Column_Sm75::get_workspace_size(arguments); + size_t workspace_size = GemmBatchedTensor_F16_F16_Linear_AlignTensor_Row_Column_Sm75::get_workspace_size(arguments); - if(workspace_size != 0) { - workspaceTensor.reset(Tensor::createDevice({(int)workspace_size})); - mResource->mBackend->onAcquireBuffer(workspaceTensor.get(), Backend::STATIC); - mWorkspace = (void *)workspaceTensor.get()->buffer().device; - } + if(workspace_size != 0) { + workspaceTensor.reset(Tensor::createDevice({(int)workspace_size})); + mResource->mBackend->onAcquireBuffer(workspaceTensor.get(), Backend::STATIC); + mWorkspace = (void *)workspaceTensor.get()->buffer().device; + } - // Check the problem size is supported or not - cutlass::Status status = mGemmBatchedF16F16LnSm75.can_implement(arguments); - cutlass_check(status); + // Check the problem size is supported or not + cutlass::Status status = mGemmBatchedF16F16LnSm75.can_implement(arguments); + cutlass_check(status); - // Initialize CUTLASS kernel with arguments and workspace pointer - status = mGemmBatchedF16F16LnSm75.initialize(arguments, (uint8_t *)mWorkspace); - cutlass_check(status); - #endif + // Initialize CUTLASS kernel with arguments and workspace pointer + status = mGemmBatchedF16F16LnSm75.initialize(arguments, (uint8_t *)mWorkspace); + cutlass_check(status); + } } else { typename GemmBatchedTensor_F16_F32_Linear_AlignTensor_Row_Column_Sm75::Arguments arguments{problem_size, // <- problem size of matrix multiplication @@ -477,12 +480,15 @@ ErrorCode ConvWinogradExecution::onExecute(const std::vector &inputs, c cutlass::Status status = mGemmBatchedF16F32LnSm75(); cutlass_check(status); } else { - #ifdef ENABLE_CUDA_TUNE_PARAM - runGemmBatchedTensorCoreFloat16Infer(&mInfo); - #else - cutlass::Status status = mGemmBatchedF16F16LnSm75(); - cutlass_check(status); - #endif + #ifdef ENABLE_CUDA_TUNE_PARAM + if(mIsTuned) { + runGemmBatchedTensorCoreFloat16Infer(&mInfo); + } + #endif + if(!mIsTuned) { + cutlass::Status status = mGemmBatchedF16F16LnSm75(); + cutlass_check(status); + } } } } diff --git a/source/backend/cuda/execution/ConvWinogradExecution.hpp b/source/backend/cuda/execution/ConvWinogradExecution.hpp index e262a966c..6d1937e07 100644 --- a/source/backend/cuda/execution/ConvWinogradExecution.hpp +++ b/source/backend/cuda/execution/ConvWinogradExecution.hpp @@ -71,6 +71,7 @@ class ConvWinogradExecution : int mPadY; int mBlock2; int mGpuComputeCap; + bool mIsTuned =false; int mActivationType; bool mFp16Infer = false; bool mFp32Infer = false; diff --git a/source/backend/cuda/execution/MatMulExecution.cu b/source/backend/cuda/execution/MatMulExecution.cu index c0d41ce5d..9c66f6746 100644 --- a/source/backend/cuda/execution/MatMulExecution.cu +++ b/source/backend/cuda/execution/MatMulExecution.cu @@ -481,215 +481,219 @@ void MatMulExecution::setArguments(const std::vector &inputs, const st if(mFp16Infer) { #ifdef ENABLE_CUDA_TUNE_PARAM - /* - // 0 -> Gemm, 1~N -> BatchGemm - int32_t batchSize = 0; - // [0]->A, [1]->B, [2]->bias, [3]->output - std::pair ptrOffset[4]; - int32_t batchOffset[4]; - // [0]->alpha, [1]->beta, [2]->splitK - int32_t coefs[3]; - // 0 -> RowColumn, 1 -> RowRow - int32_t layout; - bool epilogueVectorize - */ - mInfo.problemSize[0] = mGemmInfo.elh[0]; - mInfo.problemSize[1] = mGemmInfo.elh[2]; - mInfo.problemSize[2] = mGemmInfo.elhPad[1]; - - mInfo.coefs[0] = 1; - mInfo.coefs[1] = 0; - if (inputs.size() > 2) { - mInfo.coefs[1] = 1; - } - mInfo.epilogueVectorize = true; - mInfo.epilogueType = 0;// Linear - mInfo.precisionType = 2;// FP16_FP16 - mInfo.backend = mBackend; - - if(mUseRRLayout) { - mInfo.batchSize = mBatch; - mInfo.layout = 1; - - mInfo.ptrOffset[0] = std::make_pair((void *)mTempMatA, mGemmInfo.elhPad[1]); - mInfo.ptrOffset[1] = std::make_pair((void *)mTempMatB, mGemmInfo.elhPad[2]); - mInfo.ptrOffset[2] = std::make_pair((void *)mBiasPtr, 0); - mInfo.ptrOffset[3] = std::make_pair((void *)C->deviceId(), mGemmInfo.elhPad[2]); - - mInfo.batchOffset[0] = mGemmInfo.elh[0] * mGemmInfo.elhPad[1]* mAs; - mInfo.batchOffset[1] = mGemmInfo.elhPad[1] * mGemmInfo.elhPad[2]* mBs; - mInfo.batchOffset[2] = 0; - mInfo.batchOffset[3] = mGemmInfo.elh[0] * mGemmInfo.elhPad[2]; - } else { - if(hAlignment) { - mInfo.epilogueVectorize = true; - } else { - mInfo.epilogueVectorize = false; + if(mGpuComputeCap >= 80) { + mIsTuned = true; + /* + // 0 -> Gemm, 1~N -> BatchGemm + int32_t batchSize = 0; + // [0]->A, [1]->B, [2]->bias, [3]->output + std::pair ptrOffset[4]; + int32_t batchOffset[4]; + // [0]->alpha, [1]->beta, [2]->splitK + int32_t coefs[3]; + // 0 -> RowColumn, 1 -> RowRow + int32_t layout; + bool epilogueVectorize + */ + mInfo.problemSize[0] = mGemmInfo.elh[0]; + mInfo.problemSize[1] = mGemmInfo.elh[2]; + mInfo.problemSize[2] = mGemmInfo.elhPad[1]; + + mInfo.coefs[0] = 1; + mInfo.coefs[1] = 0; + if (inputs.size() > 2) { + mInfo.coefs[1] = 1; } + mInfo.epilogueVectorize = true; + mInfo.epilogueType = 0;// Linear + mInfo.precisionType = 2;// FP16_FP16 + mInfo.backend = mBackend; - if(hAlignment && mConvertGemmSplitK) { - mInfo.batchSize = 0; - mInfo.layout = 0; - mInfo.coefs[2] = 16; - - mInfo.ptrOffset[0] = std::make_pair((void *)mTempMatA, mGemmInfo.elhPad[1]); - mInfo.ptrOffset[1] = std::make_pair((void *)mTempMatB, mGemmInfo.elhPad[1]); - mInfo.ptrOffset[2] = std::make_pair((void *)mBiasPtr, 0); - mInfo.ptrOffset[3] = std::make_pair((void *)C->deviceId(), mGemmInfo.elh[2]); - } else { + if(mUseRRLayout) { mInfo.batchSize = mBatch; - mInfo.layout = 0; - + mInfo.layout = 1; + mInfo.ptrOffset[0] = std::make_pair((void *)mTempMatA, mGemmInfo.elhPad[1]); - mInfo.ptrOffset[1] = std::make_pair((void *)mTempMatB, mGemmInfo.elhPad[1]); + mInfo.ptrOffset[1] = std::make_pair((void *)mTempMatB, mGemmInfo.elhPad[2]); mInfo.ptrOffset[2] = std::make_pair((void *)mBiasPtr, 0); - mInfo.ptrOffset[3] = std::make_pair((void *)C->deviceId(), mGemmInfo.elh[2]); - + mInfo.ptrOffset[3] = std::make_pair((void *)C->deviceId(), mGemmInfo.elhPad[2]); + mInfo.batchOffset[0] = mGemmInfo.elh[0] * mGemmInfo.elhPad[1]* mAs; - mInfo.batchOffset[1] = mGemmInfo.elhPad[1] * mGemmInfo.elh[2]* mBs; + mInfo.batchOffset[1] = mGemmInfo.elhPad[1] * mGemmInfo.elhPad[2]* mBs; mInfo.batchOffset[2] = 0; - mInfo.batchOffset[3] = mGemmInfo.elh[0] * mGemmInfo.elh[2]; + mInfo.batchOffset[3] = mGemmInfo.elh[0] * mGemmInfo.elhPad[2]; + } else { + if(hAlignment) { + mInfo.epilogueVectorize = true; + } else { + mInfo.epilogueVectorize = false; + } + + if(hAlignment && mConvertGemmSplitK) { + mInfo.batchSize = 0; + mInfo.layout = 0; + mInfo.coefs[2] = 16; + + mInfo.ptrOffset[0] = std::make_pair((void *)mTempMatA, mGemmInfo.elhPad[1]); + mInfo.ptrOffset[1] = std::make_pair((void *)mTempMatB, mGemmInfo.elhPad[1]); + mInfo.ptrOffset[2] = std::make_pair((void *)mBiasPtr, 0); + mInfo.ptrOffset[3] = std::make_pair((void *)C->deviceId(), mGemmInfo.elh[2]); + } else { + mInfo.batchSize = mBatch; + mInfo.layout = 0; + + mInfo.ptrOffset[0] = std::make_pair((void *)mTempMatA, mGemmInfo.elhPad[1]); + mInfo.ptrOffset[1] = std::make_pair((void *)mTempMatB, mGemmInfo.elhPad[1]); + mInfo.ptrOffset[2] = std::make_pair((void *)mBiasPtr, 0); + mInfo.ptrOffset[3] = std::make_pair((void *)C->deviceId(), mGemmInfo.elh[2]); + + mInfo.batchOffset[0] = mGemmInfo.elh[0] * mGemmInfo.elhPad[1]* mAs; + mInfo.batchOffset[1] = mGemmInfo.elhPad[1] * mGemmInfo.elh[2]* mBs; + mInfo.batchOffset[2] = 0; + mInfo.batchOffset[3] = mGemmInfo.elh[0] * mGemmInfo.elh[2]; + } } + getGemmBatchedTensorCoreFloat16Param(&mInfo); + + // set preferd block shape argments + setGemmBatchedTensorCoreFloat16Argments(&mInfo); } - getGemmBatchedTensorCoreFloat16Param(&mInfo); + #endif + if(!mIsTuned) { + if(mUseRRLayout) { + typename GemmBatchedTensor_F16_F16_Linear_AlignTensor_Row_Row_Sm75::Arguments arguments{problem_size, // <- problem size of matrix multiplication + {(ElementInput_F16 *)mTempMatA, mGemmInfo.elhPad[1]}, // Ptr + ldm + (int64_t)(mGemmInfo.elh[0] * mGemmInfo.elhPad[1]* mAs), // batch_stride_A + {(ElementInput_F16 *)mTempMatB, mGemmInfo.elhPad[2]}, // Ptr + ldm + (int64_t)(mGemmInfo.elhPad[1] * mGemmInfo.elhPad[2]* mBs), // batch_stride_B + {(ElementOutput_F16 *)mBiasPtr, 0}, // Ptr + ldm if ldm = 0, vector, + (int64_t)(0), // batch_stride_bias + {(ElementOutput_F16 *)C->deviceId(), mGemmInfo.elhPad[2]}, // Ptr + ldm + (int64_t)(mGemmInfo.elh[0] * mGemmInfo.elhPad[2]), // batch_stride_C + {alpha, beta}, // <- tuple of alpha and beta + mBatch}; // batch_count - // set preferd block shape argments - setGemmBatchedTensorCoreFloat16Argments(&mInfo); - #else - if(mUseRRLayout) { - typename GemmBatchedTensor_F16_F16_Linear_AlignTensor_Row_Row_Sm75::Arguments arguments{problem_size, // <- problem size of matrix multiplication - {(ElementInput_F16 *)mTempMatA, mGemmInfo.elhPad[1]}, // Ptr + ldm - (int64_t)(mGemmInfo.elh[0] * mGemmInfo.elhPad[1]* mAs), // batch_stride_A - {(ElementInput_F16 *)mTempMatB, mGemmInfo.elhPad[2]}, // Ptr + ldm - (int64_t)(mGemmInfo.elhPad[1] * mGemmInfo.elhPad[2]* mBs), // batch_stride_B - {(ElementOutput_F16 *)mBiasPtr, 0}, // Ptr + ldm if ldm = 0, vector, - (int64_t)(0), // batch_stride_bias - {(ElementOutput_F16 *)C->deviceId(), mGemmInfo.elhPad[2]}, // Ptr + ldm - (int64_t)(mGemmInfo.elh[0] * mGemmInfo.elhPad[2]), // batch_stride_C - {alpha, beta}, // <- tuple of alpha and beta - mBatch}; // batch_count - - size_t workspace_size = GemmBatchedTensor_F16_F16_Linear_AlignTensor_Row_Row_Sm75::get_workspace_size(arguments); - if(workspace_size != 0) { - workspaceTensor.reset(Tensor::createDevice({(int)workspace_size})); - mBackend->onAcquireBuffer(workspaceTensor.get(), Backend::STATIC); - mWorkspace = (void *)workspaceTensor.get()->buffer().device; - } - // Check the problem size is supported or not - cutlass::Status status = mGemmBatchedF16F16LnAlign8RRSm75.can_implement(arguments); - cutlass_check(status); + size_t workspace_size = GemmBatchedTensor_F16_F16_Linear_AlignTensor_Row_Row_Sm75::get_workspace_size(arguments); + if(workspace_size != 0) { + workspaceTensor.reset(Tensor::createDevice({(int)workspace_size})); + mBackend->onAcquireBuffer(workspaceTensor.get(), Backend::STATIC); + mWorkspace = (void *)workspaceTensor.get()->buffer().device; + } + // Check the problem size is supported or not + cutlass::Status status = mGemmBatchedF16F16LnAlign8RRSm75.can_implement(arguments); + cutlass_check(status); - // Initialize CUTLASS kernel with arguments and workspace pointer - status = mGemmBatchedF16F16LnAlign8RRSm75.initialize(arguments, (uint8_t *)mWorkspace); - cutlass_check(status); - } else { - if(hAlignment) { - if(mConvertGemmSplitK) { - int split_k_slices = 16; - typename GemmTensor_F16_F16_Linear_AlignTensor_Sm75::Arguments arguments{problem_size, // <- problem size of matrix multiplication - {(ElementInput_F16 *)mTempMatA, mGemmInfo.elhPad[1]}, // Ptr + ldm - {(ElementInput_F16 *)mTempMatB, mGemmInfo.elhPad[1]}, // Ptr + ldm - {(ElementOutput_F16 *)mBiasPtr, 0}, // Ptr + ldm if ldm = 0, vector, - {(ElementOutput_F16 *)C->deviceId(), mGemmInfo.elh[2]}, // Ptr + ldm - {alpha, beta}, // <- tuple of alpha and beta - split_k_slices}; // <- k-dimension split factor - size_t workspace_size = GemmTensor_F16_F16_Linear_AlignTensor_Sm75::get_workspace_size(arguments); + // Initialize CUTLASS kernel with arguments and workspace pointer + status = mGemmBatchedF16F16LnAlign8RRSm75.initialize(arguments, (uint8_t *)mWorkspace); + cutlass_check(status); + } else { + if(hAlignment) { + if(mConvertGemmSplitK) { + int split_k_slices = 16; + typename GemmTensor_F16_F16_Linear_AlignTensor_Sm75::Arguments arguments{problem_size, // <- problem size of matrix multiplication + {(ElementInput_F16 *)mTempMatA, mGemmInfo.elhPad[1]}, // Ptr + ldm + {(ElementInput_F16 *)mTempMatB, mGemmInfo.elhPad[1]}, // Ptr + ldm + {(ElementOutput_F16 *)mBiasPtr, 0}, // Ptr + ldm if ldm = 0, vector, + {(ElementOutput_F16 *)C->deviceId(), mGemmInfo.elh[2]}, // Ptr + ldm + {alpha, beta}, // <- tuple of alpha and beta + split_k_slices}; // <- k-dimension split factor + size_t workspace_size = GemmTensor_F16_F16_Linear_AlignTensor_Sm75::get_workspace_size(arguments); - if(workspace_size != 0) { - workspaceTensor.reset(Tensor::createDevice({(int)workspace_size})); - mBackend->onAcquireBuffer(workspaceTensor.get(), Backend::STATIC); - mWorkspace = (void *)workspaceTensor.get()->buffer().device; - } + if(workspace_size != 0) { + workspaceTensor.reset(Tensor::createDevice({(int)workspace_size})); + mBackend->onAcquireBuffer(workspaceTensor.get(), Backend::STATIC); + mWorkspace = (void *)workspaceTensor.get()->buffer().device; + } - cutlass::Status status = mGemmF16F16LnAlign8Sm75.can_implement(arguments); - cutlass_check(status); + cutlass::Status status = mGemmF16F16LnAlign8Sm75.can_implement(arguments); + cutlass_check(status); - // Initialize CUTLASS kernel with arguments and workspace pointer - status = mGemmF16F16LnAlign8Sm75.initialize(arguments, (uint8_t *)mWorkspace); - cutlass_check(status); - } else { - typename GemmBatchedTensor_F16_F16_Linear_AlignTensor_Row_Column_Sm75::Arguments arguments{problem_size, // <- problem size of matrix multiplication - {(ElementInput_F16 *)mTempMatA, mGemmInfo.elhPad[1]}, // Ptr + ldm - (int64_t)(mGemmInfo.elh[0] * mGemmInfo.elhPad[1]* mAs), // batch_stride_A - {(ElementInput_F16 *)mTempMatB, mGemmInfo.elhPad[1]}, // Ptr + ldm - (int64_t)(mGemmInfo.elhPad[1] * mGemmInfo.elh[2]* mBs), // batch_stride_B - {(ElementOutput_F16 *)mBiasPtr, 0}, // Ptr + ldm if ldm = 0, vector, - (int64_t)(0), // batch_stride_bias - {(ElementOutput_F16 *)C->deviceId(), mGemmInfo.elh[2]}, // Ptr + ldm - (int64_t)(mGemmInfo.elh[0] * mGemmInfo.elh[2]), // batch_stride_C - {alpha, beta}, // <- tuple of alpha and beta - mBatch}; // batch_count - - size_t workspace_size = GemmBatchedTensor_F16_F16_Linear_AlignTensor_Row_Column_Sm75::get_workspace_size(arguments); + // Initialize CUTLASS kernel with arguments and workspace pointer + status = mGemmF16F16LnAlign8Sm75.initialize(arguments, (uint8_t *)mWorkspace); + cutlass_check(status); + } else { + typename GemmBatchedTensor_F16_F16_Linear_AlignTensor_Row_Column_Sm75::Arguments arguments{problem_size, // <- problem size of matrix multiplication + {(ElementInput_F16 *)mTempMatA, mGemmInfo.elhPad[1]}, // Ptr + ldm + (int64_t)(mGemmInfo.elh[0] * mGemmInfo.elhPad[1]* mAs), // batch_stride_A + {(ElementInput_F16 *)mTempMatB, mGemmInfo.elhPad[1]}, // Ptr + ldm + (int64_t)(mGemmInfo.elhPad[1] * mGemmInfo.elh[2]* mBs), // batch_stride_B + {(ElementOutput_F16 *)mBiasPtr, 0}, // Ptr + ldm if ldm = 0, vector, + (int64_t)(0), // batch_stride_bias + {(ElementOutput_F16 *)C->deviceId(), mGemmInfo.elh[2]}, // Ptr + ldm + (int64_t)(mGemmInfo.elh[0] * mGemmInfo.elh[2]), // batch_stride_C + {alpha, beta}, // <- tuple of alpha and beta + mBatch}; // batch_count - if(workspace_size != 0) { - workspaceTensor.reset(Tensor::createDevice({(int)workspace_size})); - mBackend->onAcquireBuffer(workspaceTensor.get(), Backend::STATIC); - mWorkspace = (void *)workspaceTensor.get()->buffer().device; - } - // Check the problem size is supported or not - cutlass::Status status = mGemmBatchedF16F16LnAlign8RCSm75.can_implement(arguments); - cutlass_check(status); + size_t workspace_size = GemmBatchedTensor_F16_F16_Linear_AlignTensor_Row_Column_Sm75::get_workspace_size(arguments); - // Initialize CUTLASS kernel with arguments and workspace pointer - status = mGemmBatchedF16F16LnAlign8RCSm75.initialize(arguments, (uint8_t *)mWorkspace); - cutlass_check(status); - } - } else { - if(mConvertGemmSplitK) { - int split_k_slices = 16; - typename GemmTensor_F16_F16_Linear_AlignCuda_Sm75::Arguments arguments{problem_size, // <- problem size of matrix multiplication - {(ElementInput_F16 *)mTempMatA, mGemmInfo.elhPad[1]}, // Ptr + ldm - {(ElementInput_F16 *)mTempMatB, mGemmInfo.elhPad[1]}, // Ptr + ldm - {(ElementOutput_F16 *)mBiasPtr, 0}, // Ptr + ldm if ldm = 0, vector, - {(ElementOutput_F16 *)C->deviceId(), mGemmInfo.elh[2]}, // Ptr + ldm - {alpha, beta}, // <- tuple of alpha and beta - split_k_slices}; // <- k-dimension split factor - size_t workspace_size = GemmTensor_F16_F16_Linear_AlignCuda_Sm75::get_workspace_size(arguments); + if(workspace_size != 0) { + workspaceTensor.reset(Tensor::createDevice({(int)workspace_size})); + mBackend->onAcquireBuffer(workspaceTensor.get(), Backend::STATIC); + mWorkspace = (void *)workspaceTensor.get()->buffer().device; + } + // Check the problem size is supported or not + cutlass::Status status = mGemmBatchedF16F16LnAlign8RCSm75.can_implement(arguments); + cutlass_check(status); - if(workspace_size != 0) { - workspaceTensor.reset(Tensor::createDevice({(int)workspace_size})); - mBackend->onAcquireBuffer(workspaceTensor.get(), Backend::STATIC); - mWorkspace = (void *)workspaceTensor.get()->buffer().device; + // Initialize CUTLASS kernel with arguments and workspace pointer + status = mGemmBatchedF16F16LnAlign8RCSm75.initialize(arguments, (uint8_t *)mWorkspace); + cutlass_check(status); } + } else { + if(mConvertGemmSplitK) { + int split_k_slices = 16; + typename GemmTensor_F16_F16_Linear_AlignCuda_Sm75::Arguments arguments{problem_size, // <- problem size of matrix multiplication + {(ElementInput_F16 *)mTempMatA, mGemmInfo.elhPad[1]}, // Ptr + ldm + {(ElementInput_F16 *)mTempMatB, mGemmInfo.elhPad[1]}, // Ptr + ldm + {(ElementOutput_F16 *)mBiasPtr, 0}, // Ptr + ldm if ldm = 0, vector, + {(ElementOutput_F16 *)C->deviceId(), mGemmInfo.elh[2]}, // Ptr + ldm + {alpha, beta}, // <- tuple of alpha and beta + split_k_slices}; // <- k-dimension split factor + size_t workspace_size = GemmTensor_F16_F16_Linear_AlignCuda_Sm75::get_workspace_size(arguments); - cutlass::Status status = mGemmF16F16LnAlign1Sm75.can_implement(arguments); - cutlass_check(status); + if(workspace_size != 0) { + workspaceTensor.reset(Tensor::createDevice({(int)workspace_size})); + mBackend->onAcquireBuffer(workspaceTensor.get(), Backend::STATIC); + mWorkspace = (void *)workspaceTensor.get()->buffer().device; + } - // Initialize CUTLASS kernel with arguments and workspace pointer - status = mGemmF16F16LnAlign1Sm75.initialize(arguments, (uint8_t *)mWorkspace); - cutlass_check(status); - } else { - typename GemmBatchedTensor_F16_F16_Linear_AlignCuda_Row_Column_Sm75::Arguments arguments{problem_size, // <- problem size of matrix multiplication - {(ElementInput_F16 *)mTempMatA, mGemmInfo.elhPad[1]}, // Ptr + ldm - (int64_t)(mGemmInfo.elh[0] * mGemmInfo.elhPad[1]* mAs), // batch_stride_A - {(ElementInput_F16 *)mTempMatB, mGemmInfo.elhPad[1]}, // Ptr + ldm - (int64_t)(mGemmInfo.elhPad[1] * mGemmInfo.elh[2]* mBs), // batch_stride_B - {(ElementOutput_F16 *)mBiasPtr, 0}, // Ptr + ldm if ldm = 0, vector, - (int64_t)(0), // batch_stride_bias - {(ElementOutput_F16 *)C->deviceId(), mGemmInfo.elh[2]}, // Ptr + ldm - (int64_t)(mGemmInfo.elh[0] * mGemmInfo.elh[2]), // batch_stride_C - {alpha, beta}, // <- tuple of alpha and beta - mBatch}; // batch_count - - size_t workspace_size = GemmBatchedTensor_F16_F16_Linear_AlignCuda_Row_Column_Sm75::get_workspace_size(arguments); + cutlass::Status status = mGemmF16F16LnAlign1Sm75.can_implement(arguments); + cutlass_check(status); - if(workspace_size != 0) { - workspaceTensor.reset(Tensor::createDevice({(int)workspace_size})); - mBackend->onAcquireBuffer(workspaceTensor.get(), Backend::STATIC); - mWorkspace = (void *)workspaceTensor.get()->buffer().device; - } - // Check the problem size is supported or not - cutlass::Status status = mGemmBatchedF16F16LnAlign1RCSm75.can_implement(arguments); - cutlass_check(status); + // Initialize CUTLASS kernel with arguments and workspace pointer + status = mGemmF16F16LnAlign1Sm75.initialize(arguments, (uint8_t *)mWorkspace); + cutlass_check(status); + } else { + typename GemmBatchedTensor_F16_F16_Linear_AlignCuda_Row_Column_Sm75::Arguments arguments{problem_size, // <- problem size of matrix multiplication + {(ElementInput_F16 *)mTempMatA, mGemmInfo.elhPad[1]}, // Ptr + ldm + (int64_t)(mGemmInfo.elh[0] * mGemmInfo.elhPad[1]* mAs), // batch_stride_A + {(ElementInput_F16 *)mTempMatB, mGemmInfo.elhPad[1]}, // Ptr + ldm + (int64_t)(mGemmInfo.elhPad[1] * mGemmInfo.elh[2]* mBs), // batch_stride_B + {(ElementOutput_F16 *)mBiasPtr, 0}, // Ptr + ldm if ldm = 0, vector, + (int64_t)(0), // batch_stride_bias + {(ElementOutput_F16 *)C->deviceId(), mGemmInfo.elh[2]}, // Ptr + ldm + (int64_t)(mGemmInfo.elh[0] * mGemmInfo.elh[2]), // batch_stride_C + {alpha, beta}, // <- tuple of alpha and beta + mBatch}; // batch_count - // Initialize CUTLASS kernel with arguments and workspace pointer - status = mGemmBatchedF16F16LnAlign1RCSm75.initialize(arguments, (uint8_t *)mWorkspace); - cutlass_check(status); + size_t workspace_size = GemmBatchedTensor_F16_F16_Linear_AlignCuda_Row_Column_Sm75::get_workspace_size(arguments); + + if(workspace_size != 0) { + workspaceTensor.reset(Tensor::createDevice({(int)workspace_size})); + mBackend->onAcquireBuffer(workspaceTensor.get(), Backend::STATIC); + mWorkspace = (void *)workspaceTensor.get()->buffer().device; + } + // Check the problem size is supported or not + cutlass::Status status = mGemmBatchedF16F16LnAlign1RCSm75.can_implement(arguments); + cutlass_check(status); + + // Initialize CUTLASS kernel with arguments and workspace pointer + status = mGemmBatchedF16F16LnAlign1RCSm75.initialize(arguments, (uint8_t *)mWorkspace); + cutlass_check(status); + } } } } - #endif } else { if(mUseRRLayout) { if(mNeedConvertMatAB) { @@ -1239,32 +1243,35 @@ ErrorCode MatMulExecution::onExecute(const std::vector &inputs, const } } else { - #ifdef ENABLE_CUDA_TUNE_PARAM - runGemmBatchedTensorCoreFloat16Infer(&mInfo); - #else - if(mUseRRLayout) { - cutlass::Status status = mGemmBatchedF16F16LnAlign8RRSm75(); - cutlass_check(status); - } else { - if(hAlignment) { - if(mConvertGemmSplitK) { - cutlass::Status status = mGemmF16F16LnAlign8Sm75(); - cutlass_check(status); - } else { - cutlass::Status status = mGemmBatchedF16F16LnAlign8RCSm75(); - cutlass_check(status); - } + #ifdef ENABLE_CUDA_TUNE_PARAM + if(mIsTuned) { + runGemmBatchedTensorCoreFloat16Infer(&mInfo); + } + #endif + if(!mIsTuned) { + if(mUseRRLayout) { + cutlass::Status status = mGemmBatchedF16F16LnAlign8RRSm75(); + cutlass_check(status); } else { - if(mConvertGemmSplitK) { - cutlass::Status status = mGemmF16F16LnAlign1Sm75(); - cutlass_check(status); + if(hAlignment) { + if(mConvertGemmSplitK) { + cutlass::Status status = mGemmF16F16LnAlign8Sm75(); + cutlass_check(status); + } else { + cutlass::Status status = mGemmBatchedF16F16LnAlign8RCSm75(); + cutlass_check(status); + } } else { - cutlass::Status status = mGemmBatchedF16F16LnAlign1RCSm75(); - cutlass_check(status); + if(mConvertGemmSplitK) { + cutlass::Status status = mGemmF16F16LnAlign1Sm75(); + cutlass_check(status); + } else { + cutlass::Status status = mGemmBatchedF16F16LnAlign1RCSm75(); + cutlass_check(status); + } } } } - #endif } // printf("normal:%d rrlayout:%d convertab:%d halign:%d\n", mFp16Fp32MixInfer, mUseRRLayout, mNeedConvertMatAB, hAlignment); return NO_ERROR; diff --git a/source/backend/cuda/execution/MatMulExecution.hpp b/source/backend/cuda/execution/MatMulExecution.hpp index 1a9a76f94..a2b213f40 100644 --- a/source/backend/cuda/execution/MatMulExecution.hpp +++ b/source/backend/cuda/execution/MatMulExecution.hpp @@ -84,6 +84,7 @@ class MatMulExecution : CutlassGemmInfo mGemmInfo; int mBatch = 1; int mGpuComputeCap; + bool mIsTuned = false; bool mFp16Infer = false; bool mFp32Infer = false; bool mFp16Fp32MixInfer = false; diff --git a/source/backend/cuda/execution/Raster.cu b/source/backend/cuda/execution/Raster.cu index 0d5b35161..6ac87f6e8 100644 --- a/source/backend/cuda/execution/Raster.cu +++ b/source/backend/cuda/execution/Raster.cu @@ -1083,9 +1083,17 @@ void BinaryBlit(uint8_t* output, const uint8_t* input, const uint8_t* input1, co BinaryBlitTemplateFloat((float*)output, (float*)input, (float*)input1, size, srcStride, srcStride1, dstStride, type.bytes(), runtime, opType, activationType); } else if (type.bits == 16) { BinaryBlitTemplateFloat((half*)output, (half*)input, (half*)input1, size, srcStride, srcStride1, dstStride, type.bytes(), runtime, opType, activationType); + } else { + MNN_ERROR("CUDA not supoort data code:%d, data bits:%d\n", type.code, type.bits); } } else if (type.code == halide_type_int) { - BinaryBlitTemplateInt32(output, input, input1, size, srcStride, srcStride1, dstStride, type.bytes(), runtime, opType, activationType); + if(type.bits == 32) { + BinaryBlitTemplateInt32(output, input, input1, size, srcStride, srcStride1, dstStride, type.bytes(), runtime, opType, activationType); + } else { + MNN_ERROR("CUDA not supoort data code:%d, data bits:%d\n", type.code, type.bits); + } + } else { + MNN_ERROR("CUDA not supoort data code:%d, data bits:%d\n", type.code, type.bits); } } diff --git a/source/backend/cuda/execution/cutlass_common/CutlassConvCommonExecution.cu b/source/backend/cuda/execution/cutlass_common/CutlassConvCommonExecution.cu index fc0af0aa1..352910906 100644 --- a/source/backend/cuda/execution/cutlass_common/CutlassConvCommonExecution.cu +++ b/source/backend/cuda/execution/cutlass_common/CutlassConvCommonExecution.cu @@ -109,35 +109,38 @@ ErrorCode CutlassConvCommonExecution::runCutlassGemmFunc() { return NO_ERROR; } -#ifdef ENABLE_CUDA_TUNE_PARAM - runGemmTensorCoreFloat16Infer(&mInfo); -#else - if(mActivationType == 1) { - if(mFp16Fp32MixInfer) { - cutlass::Status status = mGemmF16F32ReluSm75(); - cutlass_check(status); - } else { - cutlass::Status status = mGemmF16F16ReluSm75(); - cutlass_check(status); - } - } else if(mActivationType == 2) { - if(mFp16Fp32MixInfer) { - cutlass::Status status = mGemmF16F32Relu6Sm75(); - cutlass_check(status); - } else { - cutlass::Status status = mGemmF16F16Relu6Sm75(); - cutlass_check(status); - } - } else { - if(mFp16Fp32MixInfer) { - cutlass::Status status = mGemmF16F32LnSm75(); - cutlass_check(status); + #ifdef ENABLE_CUDA_TUNE_PARAM + if(mIsTuned) { + runGemmTensorCoreFloat16Infer(&mInfo); + } + #endif + if(!mIsTuned) { + if(mActivationType == 1) { + if(mFp16Fp32MixInfer) { + cutlass::Status status = mGemmF16F32ReluSm75(); + cutlass_check(status); + } else { + cutlass::Status status = mGemmF16F16ReluSm75(); + cutlass_check(status); + } + } else if(mActivationType == 2) { + if(mFp16Fp32MixInfer) { + cutlass::Status status = mGemmF16F32Relu6Sm75(); + cutlass_check(status); + } else { + cutlass::Status status = mGemmF16F16Relu6Sm75(); + cutlass_check(status); + } } else { - cutlass::Status status = mGemmF16F16LnSm75(); - cutlass_check(status); + if(mFp16Fp32MixInfer) { + cutlass::Status status = mGemmF16F32LnSm75(); + cutlass_check(status); + } else { + cutlass::Status status = mGemmF16F16LnSm75(); + cutlass_check(status); + } } } -#endif return NO_ERROR; } diff --git a/source/backend/cuda/execution/cutlass_common/CutlassConvCommonExecution.hpp b/source/backend/cuda/execution/cutlass_common/CutlassConvCommonExecution.hpp index 10c9b3ca6..ac97be31b 100644 --- a/source/backend/cuda/execution/cutlass_common/CutlassConvCommonExecution.hpp +++ b/source/backend/cuda/execution/cutlass_common/CutlassConvCommonExecution.hpp @@ -94,6 +94,7 @@ class CutlassConvCommonExecution : GemmTensor_BF16_BF16_Relu6_AlignTensor_Sm80 mGemmBF16BF16Relu6Sm80; #endif int mGpuComputeCap = 75; + bool mIsTuned = false; int mActivationType = 0; bool mFp16Infer = false; bool mFp32Infer = false; diff --git a/source/backend/metal/AllShader.cpp b/source/backend/metal/AllShader.cpp index 602184146..5b4922771 100644 --- a/source/backend/metal/AllShader.cpp +++ b/source/backend/metal/AllShader.cpp @@ -871,6 +871,17 @@ const char* shader_MetalBackend_metal = " uint4 extent;//dstStride[3]+dstOffset\n" " uint4 imageSize;\n" "};\n" +"struct MemsetInfo {\n" +" int4 V;\n" +" uint4 size;\n" +"};\n" +"kernel void fill_intx4(device int4 *out [[buffer(0)]],\n" +" constant MemsetInfo &info [[buffer(1)]],\n" +" uint3 gid [[thread_position_in_grid]]) {\n" +" if (gid.x= cst.input_width || src_y >= cst.input_height;\n" -" xy_cols[(ky*cst.kernel_x+kx)*4]=pad ? 0 : xy_im[src_y*cst.input_width+src_x];\n" -" }\n" -" }\n" -" }\n" -"}\n" -"kernel void conv_col2im(const device M4 *cols [[buffer(0)]],\n" -" device M4 *im [[buffer(1)]],\n" -" const device M4 *biasTerms [[buffer(2)]],\n" -" constant conv_im2col_cst& cst [[buffer(3)]],\n" -" uint3 gid [[thread_position_in_grid]]) {\n" -" auto z=gid.z % cst.output_slice;\n" -" auto b=gid.z/cst.output_slice;\n" -" if ((int)gid.x device; /** max memory length cound be used in threadgroup */ @property (assign, nonatomic, readonly) BOOL isCommitEachShader; +@property (assign, nonatomic, readonly) BOOL isIphone; /** * @brief alloc temp buffer on device @@ -60,19 +61,6 @@ typedef struct { */ - (id)newDeviceBuffer:(NSUInteger)size bytes:(const void *)bytes access:(MNN::MetalAccess)access; -/** - * @brief create compute encoder on default command buffer - * @return created encoder - */ -- (id)encoder; -- (id)encoder_net; - -/** - * @brief create fill encoder on default command buffer - * @return created encoder - */ -- (id)encoderBlit; -- (id)encoderBlit_net; /** * @brief load encoder with function name. returns maxTotalThreadsPerThreadgroup of pipeline. @@ -80,7 +68,7 @@ typedef struct { * @param encoder command encoder * @return bandwidth info for function */ -- (MNN::MetalBandwidth)load:(NSString *)name encoder:(id)encoder; +- (MNN::MetalBandwidth)load:(NSString *)name encoder:(id)encoder fp16:(BOOL)fp16; /** * @brief load encoder with function name. returns maxTotalThreadsPerThreadgroup of pipeline. @@ -88,22 +76,15 @@ typedef struct { * @param encoder command encoder * @return bandwidth info for function */ -- (id) newCmdBuffer:(MTLSize) localIndex; +- (id) newCmdBuffer:(MTLSize) localIndex queue:(id) cmdqueue; - (NSUInteger)timeUsed:(id) buffer; -- (std::tuple) getGridAndThreadgroup: (id)pipeline gid:(MTLSize)threads loop:(NSUInteger)count buffer:(NSArray *)buffers runtime:(MNN::MetalRuntime *) rt shaderName:(std::string) kernelName; +- (std::tuple) getGridAndThreadgroup: (id)pipeline gid:(MTLSize)threads loop:(NSUInteger)count buffer:(NSArray *)buffers runtime:(MNN::MetalRuntime *) rt shaderName:(std::string) kernelName queue:(id) cmdqueue; +- (NSUInteger)PipelinetimeUsed: (id)pipeline global:(MTLSize)globals local:(MTLSize)locals loop:(NSUInteger)count buffer:(NSArray *)buffers queue:(id) cmdqueue; + - (BOOL) initWithSharedContext:(const MNNMetalSharedContext*)context dev:(id)device; -/** - * @brief commit commands - */ -- (void)commit; -- (void)commit_net; -/** - * @brief wait for completion - */ -- (void)wait; /** * @brief dispatch encoder with default settings @@ -126,8 +107,8 @@ typedef struct { threads:(MTLSize)threads threadsPerGroup:(MTLSize)threadsPerGroup bandwidth:(MNN::MetalBandwidth)bandwidth; -- (id)pipelineWithName:(NSString *)name; -- (id)pipelineWithSource:(NSString *)source name:(NSString *)name; +- (id)pipelineWithName:(NSString *)name fp16:(BOOL)fp16; +- (id)pipelineWithSourceOption:(NSString *)source name:(NSString *)name options:(MTLCompileOptions *)options; - (MTLSize)computeBestGroup:(id) pipeline threads:(MTLSize)threads; - (std::pair)computeBestGroupAndLocal:(id) bw threads:(MTLSize)t; diff --git a/source/backend/metal/MNNMetalContext.mm b/source/backend/metal/MNNMetalContext.mm index 78125ab05..7624d1485 100644 --- a/source/backend/metal/MNNMetalContext.mm +++ b/source/backend/metal/MNNMetalContext.mm @@ -22,18 +22,15 @@ @interface MNNMetalContext () // public @property (strong, nonatomic) id device; -@property (strong, nonatomic) id commandQueue; -@property (strong, nonatomic) id commandBuffer; -@property (strong, nonatomic) id commandBuffer_net; +@property (assign, nonatomic) BOOL isIphone; // private -@property (strong, nonatomic) NSMutableDictionary> *caches; -@property (strong, nonatomic) NSMutableArray> *waitings; -@property (strong, nonatomic) NSMutableDictionary>* library; +@property (strong, nonatomic) NSMutableDictionary> *cachesFp32; +@property (strong, nonatomic) NSMutableDictionary> *cachesFp16; @end @implementation MNNMetalContext -static void createLibrary(id device, NSMutableDictionary>* libraryMap) { +static void createLibrary(id device, NSMutableDictionary>* libraryMap, bool usefp16) { AUTOTIME; ShaderMap shader; auto first = shader.search("shader_MetalDefine_metal"); @@ -47,6 +44,11 @@ static void createLibrary(id device, NSMutableDictionary device, NSMutableDictionary function = [library newFunctionWithName:functionNames[i]]; + if (!function) { + MNN_ERROR("Create Function in metal error\n"); + continue; + } + + NSError *error = nil; + auto result = [device newComputePipelineStateWithFunction:function error:&error]; + libraryMap[functionNames[i]] = result; } } } @@ -96,19 +106,29 @@ + (BOOL)commit_frequent{ return NO; } ++ (BOOL)isIphone{ + struct utsname systemInfo; + uname(&systemInfo); + NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSASCIIStringEncoding]; + NSString *subString = @"iPhone"; + NSRange range = [deviceString rangeOfString:subString]; + if (range.location != NSNotFound) { + return YES; + } + return NO; +} + + - (BOOL) initWithSharedContext:(const MNNMetalSharedContext*)context dev:(id)device { MNN_ASSERT(nullptr != context); _device = context->device; - _library = [NSMutableDictionary dictionary]; - createLibrary(_device, _library); - _commandQueue = context->queue; - _commandBuffer = [_commandQueue commandBuffer]; - _commandBuffer_net = [_commandQueue commandBuffer]; - _caches = [NSMutableDictionary dictionary]; - _waitings = [NSMutableArray array]; + _cachesFp16 = [NSMutableDictionary dictionary]; + _cachesFp32 = [NSMutableDictionary dictionary]; _isCommitEachShader = self.class.commit_frequent; - - return (0 != [_library count]); + _isIphone = self.class.isIphone; + createLibrary(_device, _cachesFp16, true); + createLibrary(_device, _cachesFp32, false); + return nil != _device; } - (instancetype)init { @@ -139,42 +159,16 @@ - (MTLResourceOptions)optionForAccess:(MNN::MetalAccess)access { return [_device newBufferWithBytes:bytes length:size options:[self optionForAccess:access]]; } -#pragma mark enqueue -- (id)functionWithName:(NSString *)name { - if (!name) - return nil; - auto lib = _library[name]; - id result = [lib newFunctionWithName:name]; -#if MNN_METAL_DEBUG || MNN_METAL_BENCHMARK - if (@available(iOS 10.0, *)) - result.label = name; -#endif - return result; -} - -- (id)pipelineWithName:(NSString *)name { - id result = _caches[name]; - if (result) - return result; - - id function = [self functionWithName:name]; - if (!function) - return nil; - - NSError *error = nil; - result = [_device newComputePipelineStateWithFunction:function error:&error]; -#if MNN_METAL_DEBUG - if (error) - printf("[METAL] create pipeline error: %s\n", error.localizedDescription.UTF8String); -#endif - if (result) - _caches[name] = result; - return result; +- (id)pipelineWithName:(NSString *)name fp16:(BOOL)fp16 { + if (fp16) { + return _cachesFp16[name]; + } + return _cachesFp32[name]; } -- (id)pipelineWithSource:(NSString *)source name:(NSString *)name { +- (id)pipelineWithSourceOption:(NSString *)source name:(NSString *)name options:(MTLCompileOptions *)options { NSError *err = nil; - auto library = [_device newLibraryWithSource:source options:nil error:&err]; + auto library = [_device newLibraryWithSource:source options:options error:&err]; if (nil == library) { if (err) { NSLog(@"Warning: pipelineWithSource error: %@", err); @@ -184,43 +178,11 @@ - (MTLResourceOptions)optionForAccess:(MNN::MetalAccess)access { id function = [library newFunctionWithName:name]; NSError *error = nil; id result = [_device newComputePipelineStateWithFunction:function error:&error]; - if (result) - _caches[name] = result; - return result; -} - -- (id)encoder { - id result = [_commandBuffer computeCommandEncoder]; -#if MNN_METAL_DEBUG || MNN_METAL_BENCHMARK - result.label = nil; -#endif - return result; -} -- (id)encoderBlit { - id result = [_commandBuffer blitCommandEncoder]; -#if MNN_METAL_DEBUG || MNN_METAL_BENCHMARK - result.label = nil; -#endif - return result; -} - -- (id)encoder_net { - id result = [_commandBuffer_net computeCommandEncoder]; -#if MNN_METAL_DEBUG || MNN_METAL_BENCHMARK - result.label = nil; -#endif - return result; -} -- (id)encoderBlit_net { - id result = [_commandBuffer_net blitCommandEncoder]; -#if MNN_METAL_DEBUG || MNN_METAL_BENCHMARK - result.label = nil; -#endif return result; } -- (MetalBandwidth)load:(NSString *)name encoder:(id)encoder { - id pipeline = [self pipelineWithName:name]; +- (MetalBandwidth)load:(NSString *)name encoder:(id)encoder fp16:(BOOL)fp16 { + id pipeline = [self pipelineWithName:name fp16:fp16]; MNN_ASSERT(nil != pipeline); [encoder setComputePipelineState:pipeline]; #if MNN_METAL_DEBUG || MNN_METAL_BENCHMARK @@ -238,13 +200,6 @@ - (MetalBandwidth)load:(NSString *)name encoder:(id)en return {pipeline.threadExecutionWidth, pipeline.maxTotalThreadsPerThreadgroup, NO}; } -- (id) newCmdBuffer:(MTLSize) localIndex { - id cmdBuffer = [_commandQueue commandBuffer]; // create a new command buffer - std::string label = std::to_string((int)localIndex.width) + "_" + std::to_string((int)localIndex.height) + "_" + std::to_string((int)localIndex.depth); - cmdBuffer.label = [NSString stringWithCString:label.c_str() encoding:[NSString defaultCStringEncoding]]; - return cmdBuffer; -} - - (NSUInteger)timeUsed:(id)buffer { // Get ns precision time auto start = mach_absolute_time(); @@ -256,8 +211,14 @@ - (NSUInteger)timeUsed:(id)buffer { return (end-start)/1000; } +- (id) newCmdBuffer:(MTLSize) localIndex queue:(id) cmdqueue { + id cmdBuffer = [cmdqueue commandBuffer]; // create a new command buffer + std::string label = std::to_string((int)localIndex.width) + "_" + std::to_string((int)localIndex.height) + "_" + std::to_string((int)localIndex.depth); + cmdBuffer.label = [NSString stringWithCString:label.c_str() encoding:[NSString defaultCStringEncoding]]; + return cmdBuffer; +} -- (std::tuple) getGridAndThreadgroup: (id)pipeline gid:(MTLSize)threads loop:(NSUInteger)count buffer:(NSArray *)buffers runtime:(MetalRuntime *) rt shaderName:(std::string) kernelName { +- (std::tuple) getGridAndThreadgroup: (id)pipeline gid:(MTLSize)threads loop:(NSUInteger)count buffer:(NSArray *)buffers runtime:(MetalRuntime *) rt shaderName:(std::string) kernelName queue:(id) cmdqueue { NSUInteger gid_x = threads.width; NSUInteger gid_y = threads.height; NSUInteger gid_z = threads.depth; @@ -289,7 +250,7 @@ - (NSUInteger)timeUsed:(id)buffer { { //get original trick time { - id commamd_buffer = [self newCmdBuffer:thread.second]; + id commamd_buffer = [self newCmdBuffer:thread.second queue:cmdqueue]; id encoder = [commamd_buffer computeCommandEncoder]; int loop = count; @@ -344,7 +305,7 @@ - (NSUInteger)timeUsed:(id)buffer { } MTLSize local = {x, y, z}; MTLSize global = {UP_DIV(gid_x, x), UP_DIV(gid_y, y), UP_DIV(gid_z, z)}; - id commamd_buffer = [self newCmdBuffer:local]; + id commamd_buffer = [self newCmdBuffer:local queue:cmdqueue]; id encoder = [commamd_buffer computeCommandEncoder]; int loop = count; @@ -388,50 +349,27 @@ - (NSUInteger)timeUsed:(id)buffer { return std::make_tuple(thread.first, thread.second, min_time); } -#pragma mark dispatch -- (void)commit { - if (_commandBuffer.status < MTLCommandBufferStatusCommitted) { - [_commandBuffer commit]; - [_waitings addObject:_commandBuffer]; - _commandBuffer = [_commandQueue commandBuffer]; // create a new command buffer - } -} - -- (void)commit_net { - if (_commandBuffer_net.status < MTLCommandBufferStatusCommitted) { - [_commandBuffer_net commit]; - [_waitings addObject:_commandBuffer_net]; - _commandBuffer_net = [_commandQueue commandBuffer]; // create a new command buffer - } -} - -- (void)wait { - for (id buffer in _waitings) { - if (buffer.status >= MTLCommandBufferStatusCompleted) - continue; -#if MNN_METAL_BENCHMARK - NSTimeInterval begin = [NSDate timeIntervalSinceReferenceDate]; - [buffer waitUntilCompleted]; - NSTimeInterval end = [NSDate timeIntervalSinceReferenceDate]; - if (@available(iOS 10.3, *)) { - printf("[METAL] commit costs: %.3fms\t(kernel: %.3fms, GPU: %.3fms)\n", (end - begin) * 1000.f, - (buffer.kernelEndTime - buffer.kernelStartTime) * 1000.f, - (buffer.GPUEndTime - buffer.GPUStartTime) * 1000.f); - } else { - printf("[METAL] commit costs: %.3fms\n", (end - begin) * 1000.f); - } -#else - [buffer waitUntilCompleted]; -#endif - -#if MNN_METAL_DEBUG - if (buffer.error) { - printf("[METAL] %s\n", buffer.error.localizedDescription.UTF8String); +- (NSUInteger)PipelinetimeUsed: (id)pipeline global:(MTLSize)globals local:(MTLSize)locals loop:(NSUInteger)count buffer:(NSArray *)buffers queue:(id) cmdqueue{ + NSUInteger time = 0; + MTLSize local_size = {locals.width, locals.height, locals.depth}; + MTLSize global_size = {globals.width, globals.height, globals.depth}; + id commamd_buffer = [self newCmdBuffer:local_size queue:cmdqueue]; + id encoder = [commamd_buffer computeCommandEncoder]; + + int loop = count; + while(loop--) { + [encoder setComputePipelineState:pipeline]; + for(NSUInteger idx = 0; idx < buffers.count; idx++) { + [encoder setBuffer:[buffers objectAtIndex:idx] offset:0 atIndex:idx]; } -#endif + + [encoder dispatchThreadgroups:global_size threadsPerThreadgroup:local_size]; } - [_waitings removeAllObjects]; + [encoder endEncoding]; + time = [self timeUsed :commamd_buffer]; + + return time; } static NSUInteger smallest_log2(NSUInteger integer) { @@ -663,7 +601,7 @@ - (void)printBytes:(const void *)bytes length:(NSUInteger)length type:(halide_ty } } else if (type == halide_type_float) { if (bits == 16) { // half - printBuffer(bytes, length, "%.4f"); + printBuffer<__fp16>(bytes, length, "%.4f"); } else { // float printBuffer(bytes, length, "%.4f"); } diff --git a/source/backend/metal/MetalBackend.hpp b/source/backend/metal/MetalBackend.hpp index 8eeb74bca..ff93caa7b 100644 --- a/source/backend/metal/MetalBackend.hpp +++ b/source/backend/metal/MetalBackend.hpp @@ -37,6 +37,10 @@ class MetalRuntime : public Runtime { } void setGpuMode(const int cl_mode_num); + void setCommandQueue(id queue); + id getCommandQueue() const { + return mQueue; + } std::pair makeCache(TunedInfo* info); bool setCache(std::pair cache); @@ -70,10 +74,12 @@ class MetalRuntime : public Runtime { std::map>, std::tuple, std::vector, uint32_t>> mTunedThreadGroup; private: + id mQueue = nil; std::vector mBuffer; const void* mCacheOutside = nullptr; size_t mCacheOutsideSize = 0; TunedInfo* mTunedInfo; + BackendConfig mDefaultConfig; }; @@ -124,11 +130,13 @@ class MetalBackend : public Backend { * @param creator registering creator. */ static void addCreator(OpType type, Creator *creator); + size_t getTensorSizeInBytes(const Tensor* tensor) const; id getHostBuffer(size_t size) const; id getConstBuffer(size_t size) const; + id makeComputePipelineWithSourceOption(const char* csource, const char* cname, MTLCompileOptions *options) const; public: - MetalBackend(std::shared_ptr staticMem, const MetalRuntime* runtime); + MetalBackend(std::shared_ptr staticMem, const MetalRuntime* runtime, bool usefp16AsFp32); virtual ~MetalBackend(); const MetalRuntime* runtime() const { return mRuntime; @@ -146,6 +154,7 @@ class MetalBackend : public Backend { virtual void onExecuteBegin() const override; virtual void onExecuteEnd() const override; virtual int onSync(Tensor::MapType mtype, bool toCpu, const Tensor* dstTensor) override; + virtual bool onGetTensorInfo(const Tensor* tensor, void* dstInfo) override; public: /** @@ -164,7 +173,7 @@ class MetalBackend : public Backend { id encoder, id shape) const; void flushEncoder() const; - id encoder() const; + id encoder_for_net() const; void addOpEncoder(std::function opEncoder); bool isCommandEncoderSet(); @@ -178,15 +187,36 @@ class MetalBackend : public Backend { } bool isCmdBufferCommit(); + bool isIphone(){ + return mIsIphone; + } + void commit() const; + void commit_net() const; + void wait() const; + id queue() const { + return _commandQueue; + } + bool useFp16InsteadFp32() const { + return mUseFloatAsFp16; + } private: + id getCommandBufferForBufferCopy() const; + id getCommandBufferForNet() const; + id encoder_net() const; + mutable id _commandBuffer = nil; + mutable id _commandBuffer_net = nil; + mutable id _waiting = nil; + + id _commandQueue; + const MetalRuntime* mRuntime; std::vector> mHoldBuffers; id mShapeH2D; id mShapeD2H; mutable NSUInteger mEncoderCount = 0; mutable bool mOpEncoderSet = false;//whether has set encoder - mutable bool mOpFullSupport = true; + mutable bool mSupportDeferEncode = true; mutable bool mFrameEncodeCache = false; std::vector> mOpEncoders; @@ -199,6 +229,8 @@ class MetalBackend : public Backend { void onCopyHostToDevice(const Tensor *src, const Tensor *dst) const; void onCopyDeviceToHost(const Tensor *src, const Tensor *dst) const; void onCopyDeviceToDevice(const Tensor *src, const Tensor *dst, id encoder, id shape) const; + bool mUseFloatAsFp16; + bool mIsIphone = false; }; diff --git a/source/backend/metal/MetalBackend.mm b/source/backend/metal/MetalBackend.mm index 57962cbb4..52c1eb4ee 100644 --- a/source/backend/metal/MetalBackend.mm +++ b/source/backend/metal/MetalBackend.mm @@ -34,6 +34,9 @@ int MNNMetalGetTensorContent(MNNMetalTensorContent* content, void* tensor) { }; void registerMetalOps(); +#ifdef MNN_SUPPORT_RENDER +extern void registerMetalRenderOps(); +#endif static inline std::map *getCreatorMap() { static std::once_flag of; @@ -50,17 +53,40 @@ int MNNMetalGetTensorContent(MNNMetalTensorContent* content, void* tensor) { map->insert(std::make_pair(t, c)); } -MetalBackend::MetalBackend(std::shared_ptr staticMem, const MetalRuntime* runtime) : Backend(MNN_FORWARD_METAL) { +MetalBackend::MetalBackend(std::shared_ptr staticMem, const MetalRuntime* runtime, bool usefp16AsFp32) : Backend(MNN_FORWARD_METAL) { mRuntime = runtime; mBufferPool.reset(new EagerBufferAllocator(EagerBufferAllocator::Allocator::createRecurse(staticMem.get()), 1024)); mStaticBufferPool = staticMem; mShapeH2D = getConstBuffer(4 * sizeof(int)); mShapeD2H = getConstBuffer(4 * sizeof(int)); - mOpFullSupport = true; + mUseFloatAsFp16 = usefp16AsFp32; + auto ctx = (__bridge MNNMetalContext *)context(); + mIsIphone = ctx.isIphone; + if (runtime->getCommandQueue() == nil) { + // one command queue can create only a few command buffer, so let each backend own a command queue + _commandQueue = [[ctx device] newCommandQueue]; + mSupportDeferEncode = true; + } else { + // otherwise forbid defer encode optimize + _commandQueue = runtime->getCommandQueue(); + mSupportDeferEncode = false; + } + _commandBuffer = nil; + _commandBuffer_net = nil; + _waiting = nil; } MetalBackend::~MetalBackend() { - // Do nothing + flushEncoder(); } + +id MetalBackend::encoder_net() const { + id result = [getCommandBufferForNet() computeCommandEncoder]; +#if MNN_METAL_DEBUG || MNN_METAL_BENCHMARK + result.label = nil; +#endif + return result; +} + void *MetalBackend::context() const { return mRuntime->context(); } @@ -81,8 +107,7 @@ MemChunk chunk() override { MemChunk mBuffer; EagerBufferAllocator* mAllocator; }; -Backend::MemObj* MetalBackend::onAcquire(const Tensor *_tensor, StorageType storageType) { - auto tensor = const_cast(_tensor); +size_t MetalBackend::getTensorSizeInBytes(const Tensor* tensor) const { auto format = TensorUtils::getDescribe(tensor)->dimensionFormat; size_t size; if (MNN_DATA_FORMAT_NC4HW4 == format && tensor->dimensions() >= 2) { @@ -107,16 +132,25 @@ MemChunk chunk() override { size = ROUND_UP(size, 4); } if (0 == size) { - return nullptr; + return 0; } - // use metal_float when meets float - if (halide_type_float == tensor->buffer().type.code && tensor->buffer().type.bits == 32) { - size*= sizeof(metal_float); + if (halide_type_float == tensor->buffer().type.code && tensor->buffer().type.bits == 32 && mUseFloatAsFp16) { + size *= 2; } else { size *= tensor->getType().bytes(); } + size_t align = 4 * sizeof(int); + size = ROUND_UP(size, align); + return size; +} +Backend::MemObj* MetalBackend::onAcquire(const Tensor *_tensor, StorageType storageType) { + auto tensor = const_cast(_tensor); + size_t size = getTensorSizeInBytes(_tensor); + if (0 == size) { + return nullptr; + } // reuse if possible MemChunk buffer; EagerBufferAllocator* allocator = nullptr; @@ -159,7 +193,7 @@ MemChunk chunk() override { auto map = getCreatorMap(); auto iter = map->find(op->type()); if (iter == map->end()) { - mOpFullSupport = false; + mSupportDeferEncode = false; if (nullptr != op->name()) { MNN_PRINT("Don't support type [%s], %s\n", EnumNameOpType(op->type()), op->name()->c_str()); } else { @@ -170,7 +204,7 @@ MemChunk chunk() override { auto exe = iter->second->onCreate(inputs, op, this, outputs); if (NULL == exe) { - mOpFullSupport = false; + mSupportDeferEncode = false; MNN_PRINT("The Creator Don't support type [%s], %s\n", MNN::EnumNameOpType(op->type()), op->name() ? op->name()->c_str() : ""); return NULL; } @@ -192,8 +226,7 @@ MemChunk chunk() override { } void MetalBackend::onExecuteEnd() const { flushEncoder(); - auto ctx = (__bridge MNNMetalContext *)context(); - [ctx commit_net]; + commit_net(); if(mFrameEncodeCache) { for(auto opEncoder : mOpEncoders) { @@ -202,6 +235,20 @@ MemChunk chunk() override { setOpEncoder(); } } +bool MetalBackend::onGetTensorInfo(const Tensor* tensor, void* dstInfo) { + if (nullptr == dstInfo) { + return true; + } + auto dst = (MNNMetalTensorContent*)dstInfo; + dst->type.code = halide_type_float; + if (mUseFloatAsFp16) { + dst->type.bits = 16; + } else { + dst->type.bits = 32; + } + MNNMetalGetTensorContent(dst, (void*)tensor); + return true; +} bool MetalBackend::isCommandEncoderSet() { return mOpEncoderSet;// !isCommitEachShader & mOpFullSupport @@ -350,14 +397,13 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { // Finish last inference task if needed flushEncoder(); - auto ctx = (__bridge MNNMetalContext *)context(); - [ctx commit_net]; - [ctx wait]; + commit_net(); + wait(); } ErrorCode MetalBackend::onResizeEnd() { auto ctx = (__bridge MNNMetalContext *)context(); - mFrameEncodeCache = (!ctx.isCommitEachShader && mOpFullSupport); + mFrameEncodeCache = (!ctx.isCommitEachShader && mSupportDeferEncode); return NO_ERROR; } @@ -368,13 +414,17 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { auto device = (id)((MetalRuntimeAllocator::MetalBufferAlloc *) (dst->deviceId()))->getBuffer(); auto floats = src->getType().code == halide_type_float; + // For command queue from user, need user to make sure last frame's gpu work is ready + bool needWait = mRuntime->getCommandQueue() == nil; // cast if (sfmt == dfmt || src->dimensions() <= 1) { - if (floats) { + if (floats && mUseFloatAsFp16) { NSUInteger size = src->elementSize(); auto sizeC4 = UP_DIV(size, 4); auto host = this->getHostBuffer(sizeC4 * 4 * sizeof(float)); - [ctx wait];// make sure previous gpu task finished. for reuse mHostBuffer and mShapeH2D + if (needWait) { + wait(); + } memcpy(host.contents, src->host(), src->size()); unsigned int limits[] = { (unsigned int)sizeC4, @@ -383,8 +433,8 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { 1 }; ::memcpy(mShapeH2D.contents, limits, sizeof(limits)); - auto encoder = [ctx encoder]; - auto bandwidth = [ctx load: @"downcast_float4" encoder:encoder]; + auto encoder = [getCommandBufferForBufferCopy() computeCommandEncoder]; + auto bandwidth = [ctx load: @"downcast_float4" encoder:encoder fp16:mUseFloatAsFp16]; [encoder setBuffer:host offset:0 atIndex:0]; [encoder setBuffer:device offset:TensorUtils::getDescribe(dst)->extra.offset atIndex:1]; @@ -397,12 +447,14 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { threads.first.width = UP_DIV(threads.first.width, threads.second.width); [encoder dispatchThreadgroups:threads.first threadsPerThreadgroup:threads.second]; [encoder endEncoding]; - [ctx commit]; + commit(); //[ctx wait]; } else { - [ctx wait]; - memcpy(device.contents, src->host(), src->size()); - [ctx commit]; + if (needWait) { + wait(); + } + memcpy((uint8_t*)device.contents + TensorUtils::getDescribe(dst)->extra.offset, src->host(), src->size()); + commit(); //[ctx wait]; } } @@ -410,21 +462,23 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { else { auto buffer = getHostBuffer(src->elementSize() * sizeof(float)); - [ctx wait];// make sure previous gpu task finished. for reuse mHostBuffer and mShapeH2D + if (needWait) { + wait(); + } auto size = getTensorShape(mShapeH2D, src); memcpy(buffer.contents, src->host(), src->size()); - auto encoder = [ctx encoder]; + auto encoder = [getCommandBufferForBufferCopy() computeCommandEncoder]; auto kernel = kernelForConvert(src->getType(), sfmt, dfmt, Down); MNN_ASSERT(kernel != nil); // unsupported sfmt to dfmt - auto bandwidth = [ctx load:kernel encoder:encoder]; + auto bandwidth = [ctx load:kernel encoder:encoder fp16:mUseFloatAsFp16]; [encoder setBuffer:buffer offset:0 atIndex:0]; [encoder setBuffer:device offset:TensorUtils::getDescribe(dst)->extra.offset atIndex:1]; [encoder setBuffer:mShapeH2D offset:0 atIndex:2]; [ctx dispatchEncoder:encoder threads:size bandwidth:bandwidth]; [encoder endEncoding]; - [ctx commit]; + commit(); //[ctx wait]; } } @@ -437,14 +491,14 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { auto floats = src->getType().code == halide_type_float; // cast if (sfmt == dfmt || src->dimensions() <= 1) { - if (floats) { + if (floats && mUseFloatAsFp16) { auto eleSize = dst->elementSize(); eleSize = UP_DIV(eleSize, 4) * 4; auto buffer = getHostBuffer(eleSize * dst->getType().bytes()); NSUInteger size = src->elementSize(); - auto encoder = [ctx encoder]; - auto bandwidth = [ctx load: @"upcast_float4" encoder:encoder]; + auto encoder = [getCommandBufferForBufferCopy() computeCommandEncoder]; + auto bandwidth = [ctx load: @"upcast_float4" encoder:encoder fp16:mUseFloatAsFp16]; [encoder setBuffer:device offset:TensorUtils::getDescribe(src)->extra.offset atIndex:0]; [encoder setBuffer:buffer offset:0 atIndex:1]; auto sizeC4 = UP_DIV(size, 4); @@ -465,32 +519,32 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { [encoder dispatchThreadgroups:threads.first threadsPerThreadgroup:threads.second]; [encoder endEncoding]; - [ctx commit]; - [ctx wait]; + commit(); + wait(); memcpy(dst->host(), buffer.contents, dst->size()); } else { - [ctx commit]; - [ctx wait]; - memcpy(dst->host(), device.contents, dst->size()); + commit(); + wait(); + memcpy(dst->host(), (uint8_t*)device.contents + TensorUtils::getDescribe(src)->extra.offset, dst->size()); } } // convert else { auto size = getTensorShape(mShapeD2H, src); auto buffer = getHostBuffer(dst->size()); - auto encoder = [ctx encoder]; + auto encoder = [getCommandBufferForBufferCopy() computeCommandEncoder]; auto kernel = kernelForConvert(src->getType(), sfmt, dfmt, Up); MNN_ASSERT(kernel != nil); // unsupported sfmt to dfmt - auto bandwidth = [ctx load:kernel encoder:encoder]; + auto bandwidth = [ctx load:kernel encoder:encoder fp16:mUseFloatAsFp16]; [encoder setBuffer:device offset:TensorUtils::getDescribe(src)->extra.offset atIndex:0]; [encoder setBuffer:buffer offset:0 atIndex:1]; [encoder setBuffer:mShapeD2H offset:0 atIndex:2]; [ctx dispatchEncoder:encoder threads:size bandwidth:bandwidth]; [encoder endEncoding]; - [ctx commit]; - [ctx wait]; + commit(); + wait(); memcpy(dst->host(), buffer.contents, dst->size()); } } @@ -499,7 +553,7 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { id encoder, id shape) const { auto ctx = (__bridge MNNMetalContext *)context(); auto standalone = encoder == nil; - encoder = encoder ?: [ctx encoder]; + encoder = encoder ?: [getCommandBufferForBufferCopy() computeCommandEncoder]; auto sfmt = TensorUtils::getDescribe(src)->dimensionFormat; auto dfmt = TensorUtils::getDescribe(dst)->dimensionFormat; @@ -507,7 +561,7 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { if (sfmt == dfmt || src->dimensions() <= 1) { auto flt = dst->getType().code == halide_type_float; auto size = flt ? dst->elementSize() : dst->size(); - auto bandwidth = [ctx load:flt ? @"copy_float" : @"copy_byte" encoder:encoder]; + auto bandwidth = [ctx load:flt ? @"copy_float" : @"copy_byte" encoder:encoder fp16:mUseFloatAsFp16]; [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)src->deviceId())->getBuffer() offset:TensorUtils::getDescribe(src)->extra.offset atIndex:0]; [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)dst->deviceId())->getBuffer() offset:TensorUtils::getDescribe(dst)->extra.offset atIndex:1]; [ctx dispatchEncoder:encoder threads:{(NSUInteger)size, 1, 1} bandwidth:bandwidth]; @@ -521,7 +575,7 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { } auto size = getTensorShape(shape, src); - auto bandwidth = [ctx load:kernel encoder:encoder]; + auto bandwidth = [ctx load:kernel encoder:encoder fp16:mUseFloatAsFp16]; [encoder setBuffer:( id)((MetalRuntimeAllocator::MetalBufferAlloc *)(src->buffer().device))->getBuffer() offset:TensorUtils::getDescribe(src)->extra.offset atIndex:0]; [encoder setBuffer:( id)((MetalRuntimeAllocator::MetalBufferAlloc *)(dst->buffer().device))->getBuffer() offset:TensorUtils::getDescribe(dst)->extra.offset atIndex:1]; [encoder setBuffer:shape offset:0 atIndex:2]; @@ -538,16 +592,15 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { flushEncoder(); auto ctx = (__bridge MNNMetalContext *)context(); if(!mFrameEncodeCache) { - [ctx commit_net]; + commit_net(); } onCopyBuffer(src, dst, nil, nil); } -id MetalBackend::encoder() const { +id MetalBackend::encoder_for_net() const { if (nil == mComputeEncoder) { - auto ctx = (__bridge MNNMetalContext *)context(); - mComputeEncoder = [ctx encoder_net];//TO DO :: use which cmdBuffer + mComputeEncoder = encoder_net();//TO DO :: use which cmdBuffer } return mComputeEncoder; } @@ -570,14 +623,99 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { int MetalBackend::onSync(Tensor::MapType mtype, bool toCpu, const Tensor* dstTensor) { flushEncoder(); auto ctx = (__bridge MNNMetalContext *)context(); - [ctx commit_net]; + commit_net(); if (toCpu) { - [ctx wait]; + wait(); } mFrameEncodeCache = false; mOpEncoderSet = false; return 0; } +id MetalBackend::getCommandBufferForBufferCopy() const { + if (nil == _commandBuffer) { + _commandBuffer = [_commandQueue commandBuffer]; + if (!mSupportDeferEncode) { + // In this case _commandBuffer should be the same as _commandBuffer_net + _commandBuffer_net = _commandBuffer; + } + } + return _commandBuffer; +} +id MetalBackend::getCommandBufferForNet() const { + if (nil == _commandBuffer_net) { + _commandBuffer_net = [_commandQueue commandBuffer]; + if (!mSupportDeferEncode) { + // In this case _commandBuffer should be the same as _commandBuffer_net + _commandBuffer = _commandBuffer_net; + } + } + return _commandBuffer_net; +} + +void MetalBackend::commit() const { + if (nil != _commandBuffer && _commandBuffer.status < MTLCommandBufferStatusCommitted) { + [_commandBuffer commit]; + _waiting = _commandBuffer; + _commandBuffer = nil; + if (!mSupportDeferEncode) { + // In this case _commandBuffer should be the same as _commandBuffer_net + _commandBuffer_net = nil; + } + } +} + +void MetalBackend::commit_net() const { + if (nil != _commandBuffer_net && _commandBuffer_net.status < MTLCommandBufferStatusCommitted) { + [_commandBuffer_net commit]; + _waiting = _commandBuffer_net; + _commandBuffer_net = nil; + if (!mSupportDeferEncode) { + // In this case _commandBuffer should be the same as _commandBuffer_net + _commandBuffer = nil; + } + } +} + +void MetalBackend::wait() const { + if (nil != _waiting) { + auto buffer = _waiting; + if (buffer.status >= MTLCommandBufferStatusCompleted) { + return; + } + +#if MNN_METAL_BENCHMARK + NSTimeInterval begin = [NSDate timeIntervalSinceReferenceDate]; + [buffer waitUntilCompleted]; + NSTimeInterval end = [NSDate timeIntervalSinceReferenceDate]; + if (@available(iOS 10.3, *)) { + printf("[METAL] commit costs: %.3fms\t(kernel: %.3fms, GPU: %.3fms)\n", (end - begin) * 1000.f, + (buffer.kernelEndTime - buffer.kernelStartTime) * 1000.f, + (buffer.GPUEndTime - buffer.GPUStartTime) * 1000.f); + } else { + printf("[METAL] commit costs: %.3fms\n", (end - begin) * 1000.f); + } +#else + [buffer waitUntilCompleted]; +#endif + +#if MNN_METAL_DEBUG + if (buffer.error) { + printf("[METAL] %s\n", buffer.error.localizedDescription.UTF8String); + } +#endif + } + _waiting = nil; +} + +id MetalBackend::makeComputePipelineWithSourceOption(const char* csource, const char* cname, MTLCompileOptions *options) const{ + auto ctx = (__bridge MNNMetalContext *)context(); + auto source = [[NSString alloc] initWithUTF8String:csource]; + auto name = [[NSString alloc] initWithUTF8String:cname]; + return [ctx pipelineWithSourceOption:source name:name options:options]; +} +void MetalRuntime::setCommandQueue(id queue) { + mQueue = queue; +} void MetalRuntime::setGpuMode(const int mode_num) { int totalSet = 0; @@ -642,9 +780,6 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { if (nil == sharedContext.device) { sharedContext.device = device; } - if (nil == sharedContext.queue) { - sharedContext.queue = [sharedContext.device newCommandQueue]; - } auto mContext = (__bridge_retained void *)[[MNNMetalContext alloc] init]; auto ctx = (__bridge MNNMetalContext *)mContext; BOOL res = [ctx initWithSharedContext:&sharedContext dev:device]; @@ -654,6 +789,18 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { } auto rt = new MetalRuntime(mContext); rt->setGpuMode(info.gpuMode); + if (nil != sharedContext.queue) { + rt->setCommandQueue(sharedContext.queue); + } +#ifdef MNN_METAL_TEST + else { + id queue = [sharedContext.device newCommandQueue]; + rt->setCommandQueue(queue); + } +#endif + if (nullptr != info.user) { + rt->mDefaultConfig = *info.user; + } return rt; } @@ -833,7 +980,12 @@ static bool _checkTensorInfo(const MetalCache::TensorInfoT* dst, const Tensor* s } Backend* MetalRuntime::onCreate(const BackendConfig* config) const { - return new MetalBackend(mStatic, this); + BackendConfig::PrecisionMode precision = mDefaultConfig.precision; + if (nullptr != config) { + precision = config->precision; + } + bool useFp16AsFp32 = precision != BackendConfig::Precision_High; + return new MetalBackend(mStatic, this, useFp16AsFp32); } void MetalRuntime::onGabageCollect(int level) { @@ -895,6 +1047,9 @@ void registerMetalRuntimeCreator() { id device = MTLCreateSystemDefaultDevice(); if (nil != device) { registerMetalOps(); +#ifdef MNN_SUPPORT_RENDER + registerMetalRenderOps(); +#endif MNNInsertExtraRuntimeCreator(MNN_FORWARD_METAL, new MetalRuntimeCreator(device), false); } else { MNN_ERROR("Init Metal Error\n"); diff --git a/source/backend/metal/MetalBinary.hpp b/source/backend/metal/MetalBinary.hpp index 375c93b76..7cba243ba 100644 --- a/source/backend/metal/MetalBinary.hpp +++ b/source/backend/metal/MetalBinary.hpp @@ -9,17 +9,16 @@ #ifndef MetalBinary_hpp #define MetalBinary_hpp -#import "core/Execution.hpp" -#import "MetalDefine.h" +#import "MetalExecution.hpp" #include #if MNN_METAL_ENABLED namespace MNN { -class MetalBinary : public Execution { +class MetalBinary : public MetalExecution { public: MetalBinary(Backend *backend, std::string type, const MNN::Op *op); virtual ~MetalBinary() = default; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; private: diff --git a/source/backend/metal/MetalBinary.mm b/source/backend/metal/MetalBinary.mm index d39f78a4e..3c7d85225 100755 --- a/source/backend/metal/MetalBinary.mm +++ b/source/backend/metal/MetalBinary.mm @@ -14,13 +14,13 @@ #if MNN_METAL_ENABLED namespace MNN { -MetalBinary::MetalBinary(Backend *backend, std::string type, const MNN::Op *op) : Execution(backend) { +MetalBinary::MetalBinary(Backend *backend, std::string type, const MNN::Op *op) : MetalExecution(backend) { auto mKernelName = "binary_" + type + "_x1"; auto mtbn = static_cast(backend); auto context = (__bridge MNNMetalContext *)mtbn->context(); mConstBuffer = [context newDeviceBuffer:4 * sizeof(int) access:CPUWriteOnly]; auto kn = [NSString stringWithCString:mKernelName.c_str() encoding:[NSString defaultCStringEncoding]]; - mPipeline = [context pipelineWithName:kn]; + mPipeline = [context pipelineWithName:kn fp16:mtbn->useFp16InsteadFp32()]; mActivationType = op->main_as_BinaryOp()->activationType(); } ErrorCode MetalBinary::onResize(const std::vector &inputs, const std::vector &outputs) { @@ -39,32 +39,14 @@ return NO_ERROR; } -ErrorCode MetalBinary::onExecute(const std::vector &inputs, const std::vector &outputs) { - auto backend = static_cast(this->backend()); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; - } - - auto func = [=](){ - auto input0 = inputs[0], input1 = inputs[1], output = outputs[0]; - auto encoder = backend->encoder(); - [encoder setComputePipelineState:mPipeline]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input0->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input0)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input1->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input1)->extra.offset atIndex:1]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:2]; - [encoder setBuffer:mConstBuffer offset:0 atIndex:3]; - [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; - - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - return NO_ERROR; +void MetalBinary::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { + auto input0 = inputs[0], input1 = inputs[1], output = outputs[0]; + [encoder setComputePipelineState:mPipeline]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input0->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input0)->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input1->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input1)->extra.offset atIndex:1]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:2]; + [encoder setBuffer:mConstBuffer offset:0 atIndex:3]; + [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; } #define CHECK(t, i) if (originOp == t) return i; diff --git a/source/backend/metal/MetalCast.hpp b/source/backend/metal/MetalCast.hpp index 9a14ab5de..8bcca3f29 100644 --- a/source/backend/metal/MetalCast.hpp +++ b/source/backend/metal/MetalCast.hpp @@ -9,22 +9,23 @@ #ifndef MetalCast_hpp #define MetalCast_hpp -#import "core/Execution.hpp" -#import "MetalDefine.h" +#import "MetalExecution.hpp" #import "Type_generated.h" #if MNN_METAL_ENABLED namespace MNN { -class MetalCast : public Execution { +class MetalCast : public MetalExecution { public: - MetalCast(Backend *backend, DataType srcType, DataType dstType); + MetalCast(Backend *backend, id pipeline); virtual ~MetalCast() = default; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; private: - DataType mSrcType; - DataType mDstType; + id mConstBuffer; + id mPipeline; + std::pair mThreads; }; } // namespace MNN diff --git a/source/backend/metal/MetalCast.mm b/source/backend/metal/MetalCast.mm index a7c162fbb..33c6feed5 100755 --- a/source/backend/metal/MetalCast.mm +++ b/source/backend/metal/MetalCast.mm @@ -13,40 +13,55 @@ #if MNN_METAL_ENABLED namespace MNN { +static const char* gCastTemplate = + R"glsl( + #include + using namespace metal; + kernel void main0(const device T0 *in [[buffer(0)]], + device T1 *out [[buffer(1)]], + device uint4& s [[buffer(2)]], + uint3 gid [[thread_position_in_grid]]) { + if (gid.x < (uint)s.x) { + int off = gid.x; + T0 x = in[off]; + T1 y; + y.x = x.x; + y.y = x.y; + y.z = x.z; + y.w = x.w; + TRANSOFRM; + out[off] = y; + } + } + )glsl"; -MetalCast::MetalCast(Backend *backend, DataType srcType, DataType dstType) - : Execution(backend), mSrcType(srcType), mDstType(dstType) { - // nothing to do +MetalCast::MetalCast(Backend *backend, id pipeline) + : MetalExecution(backend) { + auto mtbn = static_cast(backend); + auto context = (__bridge MNNMetalContext *)mtbn->context(); + mPipeline = pipeline; + mConstBuffer = [context newDeviceBuffer:4 * sizeof(int) access:CPUWriteOnly]; +} +ErrorCode MetalCast::onResize(const std::vector &inputs, const std::vector &outputs) { + auto mtbn = static_cast(backend()); + auto context = (__bridge MNNMetalContext *)mtbn->context(); + auto input = inputs[0]; + auto element = input->elementSize(); + auto sizeDiv4 = UP_DIV(element, 4); + ((int *)mConstBuffer.contents)[0] = sizeDiv4; + mThreads = [context computeBestGroupAndLocal:mPipeline threads:MTLSizeMake(sizeDiv4, 1, 1)]; + return NO_ERROR; } -ErrorCode MetalCast::onExecute(const std::vector &inputs, const std::vector &outputs) { +void MetalCast::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { auto backend = static_cast(this->backend()); auto context = (__bridge MNNMetalContext *)backend->context(); auto input = inputs[0], output = outputs[0]; - - NSString *kernel = nil; - if (mSrcType == DataType_DT_FLOAT && mDstType == DataType_DT_INT32) { - kernel = @"cast_float_to_int32"; - } else if (mSrcType == DataType_DT_INT32 && mDstType == DataType_DT_FLOAT) { - kernel = @"cast_int32_to_float"; - } else if (mSrcType == DataType_DT_UINT8 && mDstType == DataType_DT_FLOAT) { - kernel = @"cast_uint8_to_float"; - } else if (mSrcType == DataType_DT_UINT8 && mDstType == DataType_DT_INT32) { - kernel = @"cast_uint8_to_int"; - } else if (mSrcType == DataType_DT_FLOAT && mDstType == DataType_DT_UINT8) { - kernel = @"cast_float_to_uint8"; - } else { - return NOT_SUPPORT; - } - - auto encoder = backend->encoder(); - auto bandwidth = [context load:kernel encoder:encoder]; + [encoder setComputePipelineState:mPipeline]; [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; - [context dispatchEncoder:encoder - threads:{ (NSUInteger) output->elementSize(), (NSUInteger)1, (NSUInteger)1 } - bandwidth:bandwidth]; - return NO_ERROR; + [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; + [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; } static DataType _mapDataType(DataType src) { if (DataType_DT_BOOL == src) { @@ -63,27 +78,88 @@ static DataType _mapDataType(DataType src) { class MetalCastCreator : public MetalBackend::Creator { public: virtual Execution *onCreate(const std::vector &inputs, const MNN::Op *op, Backend *backend, const std::vector& outputs) const { - auto cast = op->main_as_CastParam(); - auto srcType = inputs[0]->getType(); - auto dst = _mapDataType(cast->dstT()); - - if (srcType.code == halide_type_float && dst == DataType_DT_INT32) { - return new MetalCast(backend, DataType_DT_FLOAT, dst); + auto mtbn = static_cast(backend); + MTLCompileOptions *compileOptions = [[MTLCompileOptions alloc] init]; + NSString* T0 = nil; + NSString* T1 = nil; + NSString* TRANSOFRM = @""; + auto dstT = op->main_as_CastParam()->dstT(); + if (dstT == DataType_DT_BOOL) { + TRANSOFRM = @"y=select(int4(0),int4(1),y>0);"; } - if (srcType.code == halide_type_int && srcType.bits == 32 && dst == DataType_DT_FLOAT) { - return new MetalCast(backend, DataType_DT_INT32, dst); + auto dstType = _mapDataType(dstT); + bool useFp16 = mtbn->useFp16InsteadFp32(); + switch (dstType) { + case DataType_DT_FLOAT: + if (useFp16) { + T1 = @"half4"; + } else { + T1 = @"float4"; + } + break; + case DataType_DT_INT8: + T1 = @"char4"; + break; + case DataType_DT_UINT8: + T1 = @"uchar4"; + break; + case DataType_DT_INT32: + T1 = @"int4"; + break; + default: + MNN_ERROR("Don't support cast dst : %d\n", dstType); + return nullptr; + break; } - if (srcType.code == halide_type_float && dst == DataType_DT_UINT8) { - return new MetalCast(backend, DataType_DT_FLOAT, dst); - } - if (srcType.code == halide_type_uint && srcType.bits == 8 && dst == DataType_DT_FLOAT) { - return new MetalCast(backend, DataType_DT_UINT8, dst); + auto srcType = inputs[0]->getType(); + switch (srcType.code) { + case halide_type_float: + if (useFp16) { + T0 = @"half4"; + } else { + T0 = @"float4"; + } + break; + case halide_type_int: + { + if (srcType.bits == 32) { + T0 = @"int4"; + } else if (srcType.bits == 8) { + T0 = @"char4"; + } else { + MNN_ERROR("Don't support cast src : %d\n", srcType.code); + return nullptr; + } + break; + } + case halide_type_uint: + { + if (srcType.bits == 32) { + T0 = @"uint4"; + } else if (srcType.bits == 8) { + T0 = @"uchar4"; + } else { + MNN_ERROR("Don't support cast src : %d\n", srcType.code); + return nullptr; + } + break; + } + default: + MNN_ERROR("Don't support cast src : %d\n", srcType.code); + return nullptr; } - if (srcType.code == halide_type_uint && srcType.bits == 8 && dst == DataType_DT_INT32) { - return new MetalCast(backend, DataType_DT_UINT8, dst); + + compileOptions.preprocessorMacros = @{ + @"T0" : T0, + @"T1" : T1, + @"TRANSOFRM" : TRANSOFRM + }; + auto pipeline = mtbn->makeComputePipelineWithSourceOption(gCastTemplate, "main0", compileOptions); + if (nil == pipeline) { + MNN_ERROR("Create Cast execution error for metal\n"); + return nullptr; } - MNN_PRINT("%d, %d - %d\n", srcType.code, srcType.bits, dst); - return NULL; + return new MetalCast(backend, pipeline); } }; REGISTER_METAL_OP_CREATOR(MetalCastCreator, OpType_Cast); diff --git a/source/backend/metal/MetalCodeGen.py b/source/backend/metal/MetalCodeGen.py index 6f120aace..59af20ef5 100644 --- a/source/backend/metal/MetalCodeGen.py +++ b/source/backend/metal/MetalCodeGen.py @@ -3,14 +3,15 @@ from os import listdir from os.path import isfile, join import makeshader -shaderPath=sys.argv[1] -cppPath= shaderPath + "/MetalOPRegister.mm" +metalSourcePath=sys.argv[1] +renderPath = os.path.join(metalSourcePath, "render") +cppPath= os.path.join(metalSourcePath, "MetalOPRegister.mm") +cppRenderPath = os.path.join(renderPath, 'MetalRenderOpRegister.mm') def genRegister(): shaders=[] - for root, dirs, files in os.walk(shaderPath): - for file in files: - if file.endswith('.mm'): - shaders.append(os.path.join(root,file)) + for file in os.listdir(metalSourcePath): + if file.endswith('.mm'): + shaders.append(os.path.join(metalSourcePath,file)) with open(cppPath,"w") as f: f.write("// This file is generated by Shell for ops register\n") f.write("#import \"backend/metal/MetalDefine.h\"\n") @@ -31,19 +32,48 @@ def genRegister(): for func in funcs: f.write(" "+func+"\n") f.write("}\n#endif\n}") + if os.path.isdir(renderPath): + shaders=[] + for file in os.listdir(renderPath): + if file.endswith('.mm'): + shaders.append(os.path.join(renderPath,file)) + with open(cppRenderPath,"w") as f: + f.write("// This file is generated by Shell for ops register\n") + f.write("#import \"backend/metal/MetalDefine.h\"\n") + f.write(" namespace MNN {\n") + f.write("#if MNN_METAL_ENABLED\n") + funcs=[] + for shapath in shaders: + with open(shapath,"r") as sha: + lines=sha.readlines() + for l in lines: + if l.startswith("REGISTER_METAL_OP_CREATOR("): + x=l.replace("REGISTER_METAL_OP_CREATOR(","").replace(")","").replace(" ","").replace(";","").replace("\n","").split(",") + funcname="___"+x[0]+"__"+x[1]+"__();" + funcs.append(funcname) + f.write(" extern void "+funcname+"\n") + pass + f.write("void registerMetalRenderOps() {\n") + for func in funcs: + f.write(" "+func+"\n") + f.write("}\n#endif\n}") def genSchema(): - FLATC = shaderPath + "/../../../3rd_party/flatbuffers/tmp/flatc" - sourceFile = shaderPath + "/schema/MetalCache.fbs" - destFile = shaderPath + "/" + FLATC = metalSourcePath + "/../../../3rd_party/flatbuffers/tmp/flatc" + sourceFile = metalSourcePath + "/schema/MetalCache.fbs" + destFile = metalSourcePath + "/" cmd = FLATC + " -c " + sourceFile +" --gen-object-api" +" --reflect-names" print(cmd) print(os.popen(cmd).read()) return def genShader(): + if os.path.isdir(renderPath): + print("Has Render") + shaders = makeshader.findAllShader("render/shader") + makeshader.generateFile(os.path.join(renderPath, "AllRenderShader.hpp"), os.path.join(renderPath, "AllRenderShader.cpp"), shaders) shaders = makeshader.findAllShader("shader") - makeshader.generateFile("AllShader.hpp", "AllShader.cpp", shaders) + makeshader.generateFile(os.path.join(metalSourcePath, "AllShader.hpp"), os.path.join(metalSourcePath, "AllShader.cpp"), shaders) if __name__ == '__main__': genRegister() diff --git a/source/backend/metal/MetalConvolution.hpp b/source/backend/metal/MetalConvolution.hpp index 20084e84e..a8f9a2743 100644 --- a/source/backend/metal/MetalConvolution.hpp +++ b/source/backend/metal/MetalConvolution.hpp @@ -21,7 +21,7 @@ class MetalConvolution : public MetalConvolutionCommon { virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; protected: - virtual ErrorCode onFloat(const Tensor *input, const Tensor *output) override; + virtual void onFloat(const Tensor *input, const Tensor *output, id encoder) override; private: std::string mParam; diff --git a/source/backend/metal/MetalConvolution.mm b/source/backend/metal/MetalConvolution.mm index 2163ec638..11b84c95a 100755 --- a/source/backend/metal/MetalConvolution.mm +++ b/source/backend/metal/MetalConvolution.mm @@ -10,7 +10,6 @@ #import "core/Macro.h" #import "backend/metal/MetalBackend.hpp" #import "backend/metal/MetalConvolution1x1.hpp" -#import "backend/metal/MetalConvolutionGEMM.hpp" #import "backend/metal/MetalConvolutionWinograd.hpp" #include @@ -26,6 +25,7 @@ // prepare auto backend = static_cast(this->backend()); + auto mtbn = backend; auto context = (__bridge MNNMetalContext *)backend->context(); auto input = inputs[0]; auto output = outputs[0]; @@ -92,13 +92,13 @@ NSUInteger gid_y = oh; NSUInteger gid_z = UP_DIV(oc_4, packC) * ob; - mPipeline = [context pipelineWithName:kernelName]; + mPipeline = [context pipelineWithName:kernelName fp16:backend->useFp16InsteadFp32()]; NSArray *arr = [NSArray arrayWithObjects:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer(), (id)(((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId()))->getBuffer(), mConstBuffer, mWeight, mBias, nil]; std::string name = [kernelName UTF8String] + mParam; - auto ret = [context getGridAndThreadgroup:mPipeline gid:MTLSizeMake(gid_x, gid_y, gid_z) loop:10 buffer:arr runtime:rt shaderName:name]; + auto ret = [context getGridAndThreadgroup:mPipeline gid:MTLSizeMake(gid_x, gid_y, gid_z) loop:10 buffer:arr runtime:rt shaderName:name queue:backend->queue()]; mThreads = std::make_pair(std::get<0>(ret), std::get<1>(ret)); } else { const int total_kernel = 5; @@ -130,13 +130,13 @@ mConstBuffer, mWeight, mBias, nil]; for(int knl_idx = 0; knl_idx < actual_kernel; knl_idx++) { - id pipeline = [context pipelineWithName:shaderName[knl_idx]]; + id pipeline = [context pipelineWithName:shaderName[knl_idx] fp16:mtbn->useFp16InsteadFp32()]; NSUInteger gid_x = UP_DIV(ow, itemW[knl_idx]); NSUInteger gid_y = UP_DIV(oh, itemH[knl_idx]); NSUInteger gid_z = UP_DIV(oc_4, itemC[knl_idx]) * ob; std::string name = [shaderName[knl_idx] UTF8String] + mParam; - auto ret = [context getGridAndThreadgroup:pipeline gid:MTLSizeMake(gid_x, gid_y, gid_z) loop:10 buffer:arr runtime:rt shaderName:name]; + auto ret = [context getGridAndThreadgroup:pipeline gid:MTLSizeMake(gid_x, gid_y, gid_z) loop:10 buffer:arr runtime:rt shaderName:name queue:backend->queue()]; if(min_cost.first > std::get<2>(ret)) { min_cost.first = std::get<2>(ret); @@ -148,45 +148,24 @@ // printf("conv idx:%d, min_cost:%d\n", (int)min_cost.second, (int)min_cost.first); // std::string tmp = [shaderName[min_cost.second] UTF8String]; // printf("!!~ %s\n", tmp.c_str()); - mPipeline = [context pipelineWithName:shaderName[min_cost.second]]; + mPipeline = [context pipelineWithName:shaderName[min_cost.second] fp16:mtbn->useFp16InsteadFp32()]; } return NO_ERROR; } -ErrorCode MetalConvolution::onFloat(const Tensor *input, const Tensor *output) { - auto backend = static_cast(this->backend()); - auto context = (__bridge MNNMetalContext *)backend->context(); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; - } +void MetalConvolution::onFloat(const Tensor *input, const Tensor *output, id encoder) { + auto oc_4 = UP_DIV(output->channel(), 4); - auto func = [=](){ - auto oc_4 = UP_DIV(output->channel(), 4); - auto encoder = backend->encoder(); - - auto bandwidth = (MetalBandwidth){mPipeline.threadExecutionWidth, mPipeline.maxTotalThreadsPerThreadgroup, NO}; + auto bandwidth = (MetalBandwidth){mPipeline.threadExecutionWidth, mPipeline.maxTotalThreadsPerThreadgroup, NO}; - [encoder setComputePipelineState:mPipeline]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; - [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; - [encoder setBuffer:mWeight offset:0 atIndex:3]; - [encoder setBuffer:mBias offset:0 atIndex:4]; + [encoder setComputePipelineState:mPipeline]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; + [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; + [encoder setBuffer:mWeight offset:0 atIndex:3]; + [encoder setBuffer:mBias offset:0 atIndex:4]; - [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; - - //need to commit - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - - func(); - backend->addOpEncoder(func); - - return NO_ERROR; + [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; } class MetalConvolutionCreator : public MetalBackend::Creator { @@ -207,9 +186,6 @@ if (MetalConvolutionWinograd::isValid(conv, inputs[0], outputs[0])) { return new MetalConvolutionWinograd(backend, input, op); } - if (MetalConvolutionGEMM::isValid(conv, input)) { - return new MetalConvolutionGEMM(backend, input, op); - } if (MetalConvolution1x1::isValid(conv, input)) { return new MetalConvolution1x1(backend, op); } diff --git a/source/backend/metal/MetalConvolution1x1.hpp b/source/backend/metal/MetalConvolution1x1.hpp index 6b470791c..7949db1e4 100644 --- a/source/backend/metal/MetalConvolution1x1.hpp +++ b/source/backend/metal/MetalConvolution1x1.hpp @@ -22,7 +22,7 @@ class MetalConvolution1x1 : public MetalConvolutionCommon { virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; protected: - virtual ErrorCode onFloat(const Tensor *input, const Tensor *output) override; + virtual void onFloat(const Tensor *input, const Tensor *output, id encoder) override; private: id mPipeline; std::pair mThreads; diff --git a/source/backend/metal/MetalConvolution1x1.mm b/source/backend/metal/MetalConvolution1x1.mm index e150e3856..c74c94954 100644 --- a/source/backend/metal/MetalConvolution1x1.mm +++ b/source/backend/metal/MetalConvolution1x1.mm @@ -57,7 +57,7 @@ NSUInteger gid_y = oc_4; NSUInteger gid_z = ob; - mPipeline = [context pipelineWithName:@"conv1x1_g1z8"]; + mPipeline = [context pipelineWithName:@"conv1x1_g1z8" fp16:backend->useFp16InsteadFp32()]; NSArray *arr = [NSArray arrayWithObjects:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer(), (id)(((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId()))->getBuffer(), @@ -65,14 +65,14 @@ std::string name = "conv1x1_g1z8"; MetalRuntime *rt = (MetalRuntime *)backend->runtime(); - auto ret = [context getGridAndThreadgroup:mPipeline gid:MTLSizeMake(gid_x, gid_y, gid_z) loop:10 buffer:arr runtime:rt shaderName:name]; + auto ret = [context getGridAndThreadgroup:mPipeline gid:MTLSizeMake(gid_x, gid_y, gid_z) loop:10 buffer:arr runtime:rt shaderName:name queue:backend->queue()]; mThreads = std::make_pair(std::get<0>(ret), std::get<1>(ret)); } else { NSUInteger gid_x = UP_DIV(ow * oh, 4); NSUInteger gid_y = oc_4; NSUInteger gid_z = ob; - mPipeline = [context pipelineWithName:@"conv1x1_g1z4"]; + mPipeline = [context pipelineWithName:@"conv1x1_g1z4" fp16:backend->useFp16InsteadFp32()]; NSArray *arr = [NSArray arrayWithObjects:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer(), (id)(((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId()))->getBuffer(), @@ -80,7 +80,7 @@ std::string name = "conv1x1_g1z4"; MetalRuntime *rt = (MetalRuntime *)backend->runtime(); - auto ret = [context getGridAndThreadgroup:mPipeline gid:MTLSizeMake(gid_x, gid_y, gid_z) loop:10 buffer:arr runtime:rt shaderName:name]; + auto ret = [context getGridAndThreadgroup:mPipeline gid:MTLSizeMake(gid_x, gid_y, gid_z) loop:10 buffer:arr runtime:rt shaderName:name queue:backend->queue()]; mThreads = std::make_pair(std::get<0>(ret), std::get<1>(ret)); //printf("conv1x1_z4, %d %d %d %d\n", ow, oh, oc_4, ic_4); } @@ -100,13 +100,13 @@ mConstBuffer, mWeight, mBias, nil]; for(int knl_idx = 0; knl_idx < actual_kernel; knl_idx++) { - id pipeline = [context pipelineWithName:shaderName[knl_idx]]; + id pipeline = [context pipelineWithName:shaderName[knl_idx] fp16:backend->useFp16InsteadFp32()]; NSUInteger gid_x = UP_DIV(ow, itemW[knl_idx]); NSUInteger gid_y = UP_DIV(oh, itemH[knl_idx]); NSUInteger gid_z = ob * UP_DIV(oc, itemC[knl_idx]); std::string name = [shaderName[knl_idx] UTF8String]; - auto ret = [context getGridAndThreadgroup:pipeline gid:MTLSizeMake(gid_x, gid_y, gid_z) loop:10 buffer:arr runtime:rt shaderName:name]; + auto ret = [context getGridAndThreadgroup:pipeline gid:MTLSizeMake(gid_x, gid_y, gid_z) loop:10 buffer:arr runtime:rt shaderName:name queue:backend->queue()]; if(min_cost.first > std::get<2>(ret)) { min_cost.first = std::get<2>(ret); @@ -116,39 +116,20 @@ //printf("conv1x1 idx:%d, global:%d %d %d, local:%d %d %d, min_cost:%d\n", knl_idx, (int)retTune.second.first.width, (int)retTune.second.first.height, (int)retTune.second.first.depth, (int)retTune.second.second.width, (int)retTune.second.second.height, (int)retTune.second.second.depth, (int)retTune.first); } //printf("conv1x1 idx:%d, min_cost:%d\n", (int)min_cost.second, (int)min_cost.first); - mPipeline = [context pipelineWithName:shaderName[min_cost.second]]; + mPipeline = [context pipelineWithName:shaderName[min_cost.second] fp16:backend->useFp16InsteadFp32()]; } return NO_ERROR; } -ErrorCode MetalConvolution1x1::onFloat(const Tensor *input, const Tensor *output) { - auto backend = static_cast(this->backend()); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; - } - - auto func = [=](){ - auto encoder = backend->encoder(); - [encoder setComputePipelineState:mPipeline]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; - [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; - [encoder setBuffer:mWeight offset:0 atIndex:3]; - [encoder setBuffer:mBias offset:0 atIndex:4]; - [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; - - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - - return NO_ERROR; +void MetalConvolution1x1::onFloat(const Tensor *input, const Tensor *output, id encoder) { + [encoder setComputePipelineState:mPipeline]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; + [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; + [encoder setBuffer:mWeight offset:0 atIndex:3]; + [encoder setBuffer:mBias offset:0 atIndex:4]; + [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; } } // namespace MNN #endif /* MNN_METAL_ENABLED */ diff --git a/source/backend/metal/MetalConvolutionCommon.hpp b/source/backend/metal/MetalConvolutionCommon.hpp index 49e2da485..12db325cf 100644 --- a/source/backend/metal/MetalConvolutionCommon.hpp +++ b/source/backend/metal/MetalConvolutionCommon.hpp @@ -11,21 +11,22 @@ #import "core/ConvolutionCommon.hpp" #import "MetalBackend.hpp" +#import "MetalExecution.hpp" #import "MNNMetalContext.h" #if MNN_METAL_ENABLED namespace MNN { -class MetalConvolutionCommon : public Execution { +class MetalConvolutionCommon : public MetalExecution { public: MetalConvolutionCommon(Backend *backend, const MNN::Op *op); virtual ~MetalConvolutionCommon() = default; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; protected: void loadWeight(const MNN::Convolution2D *conv); - virtual ErrorCode onFloat(const Tensor *input, const Tensor *output) = 0; + virtual void onFloat(const Tensor *input, const Tensor *output, id encoder) = 0; virtual id weightForFloat(int group, int oc, int ic, int kh, int kw, const float *src); private: diff --git a/source/backend/metal/MetalConvolutionCommon.mm b/source/backend/metal/MetalConvolutionCommon.mm index cfcaf3093..8566ab1b0 100644 --- a/source/backend/metal/MetalConvolutionCommon.mm +++ b/source/backend/metal/MetalConvolutionCommon.mm @@ -16,23 +16,32 @@ #if MNN_METAL_ENABLED namespace MNN { -static id biasForConv(MNNMetalContext *context, const Convolution2D *conv) { +static id biasForConv(MNNMetalContext *context, const Convolution2D *conv, bool fp16) { auto bias = conv->bias(); auto oc = conv->common()->outputCount(); - auto bias_size = UP_DIV(oc, 16) * 16 * sizeof(metal_float); + int bytes = 4; + if (fp16) { + bytes = 2; + } + auto bias_size = UP_DIV(oc, 16) * 16 *bytes; auto buffer = [context newDeviceBuffer:bias_size access:CPUWriteOnly]; auto src = bias->data(); - auto dst = (metal_float *)buffer.contents; - ::memset(dst, 0, bias_size); -#pragma clang loop vectorize(enable) unroll(enable) - for (int i = 0; i < oc; i++) { - dst[i] = src[i]; + ::memset(buffer.contents, 0, bias_size); + if (fp16) { + auto dst = (__fp16 *)buffer.contents; + #pragma clang loop vectorize(enable) unroll(enable) + for (int i = 0; i < oc; i++) { + dst[i] = src[i]; + } + } else { + ::memcpy(buffer.contents, src, oc * sizeof(float)); } return buffer; } -MetalConvolutionCommon::MetalConvolutionCommon(Backend *backend, const MNN::Op *op) : Execution(backend) { +MetalConvolutionCommon::MetalConvolutionCommon(Backend *backend, const MNN::Op *op) : MetalExecution(backend) { auto context = (__bridge MNNMetalContext *)static_cast(backend)->context(); + auto mtbn = static_cast(backend); auto conv = op->main_as_Convolution2D(); auto common = conv->common(); mOp = op; @@ -47,7 +56,7 @@ mStrideY = common->strideY(); mDilateX = common->dilateX(); mDilateY = common->dilateY(); - mBias = biasForConv(context, conv); + mBias = biasForConv(context, conv, mtbn->useFp16InsteadFp32()); mActivationType = common->relu() ? 1 : (common->relu6() ? 2 : 0); } @@ -55,8 +64,8 @@ return NO_ERROR; } -ErrorCode MetalConvolutionCommon::onExecute(const std::vector &inputs, const std::vector &outputs) { - return onFloat(inputs[0], outputs[0]); +void MetalConvolutionCommon::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { + return onFloat(inputs[0], outputs[0], encoder); } template @@ -103,8 +112,10 @@ id MetalConvolutionCommon::weightForFloat(int group, int oc, int ic, int kh, int kw, const float *src) { auto backend = static_cast(this->backend()); auto context = (__bridge MNNMetalContext *)static_cast(backend)->context(); - return weightInBlock(context, group, oc, ic, kh, kw, src); - + if (backend->useFp16InsteadFp32()) { + return weightInBlock(context, group, oc, ic, kh, kw, src); + } + return weightInBlock(context, group, oc, ic, kh, kw, src); } id MetalConvolutionCommon::weightForConv(const Convolution2D *conv, ConvolutionCommon::Int8Common *qnt, diff --git a/source/backend/metal/MetalConvolutionDepthwise.hpp b/source/backend/metal/MetalConvolutionDepthwise.hpp index 0fccf1a7b..2e2d2092d 100644 --- a/source/backend/metal/MetalConvolutionDepthwise.hpp +++ b/source/backend/metal/MetalConvolutionDepthwise.hpp @@ -21,7 +21,7 @@ class MetalConvolutionDepthwise : public MetalConvolutionCommon { virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; protected: - virtual ErrorCode onFloat(const Tensor *input, const Tensor *output) override; + virtual void onFloat(const Tensor *input, const Tensor *output, id encoder) override; virtual id weightForFloat(int group, int oc, int ic, int kh, int kw, const float *src) override; private: id mPipeline; diff --git a/source/backend/metal/MetalConvolutionDepthwise.mm b/source/backend/metal/MetalConvolutionDepthwise.mm index 870419462..604202b30 100755 --- a/source/backend/metal/MetalConvolutionDepthwise.mm +++ b/source/backend/metal/MetalConvolutionDepthwise.mm @@ -62,7 +62,7 @@ ::memcpy(mConstBuffer.contents, constants, sizeof(constants)); auto context = (__bridge MNNMetalContext *)backend->context(); - mPipeline = [context pipelineWithName:@"conv_depthwise"]; + mPipeline = [context pipelineWithName:@"conv_depthwise" fp16:backend->useFp16InsteadFp32()]; NSUInteger gid_x = ow; NSUInteger gid_y = oh; @@ -74,39 +74,21 @@ std::string name = "conv_depthwise"; MetalRuntime *rt = (MetalRuntime *)backend->runtime(); - auto ret = [context getGridAndThreadgroup:mPipeline gid:MTLSizeMake(gid_x, gid_y, gid_z) loop:10 buffer:arr runtime:rt shaderName:name]; + auto ret = [context getGridAndThreadgroup:mPipeline gid:MTLSizeMake(gid_x, gid_y, gid_z) loop:10 buffer:arr runtime:rt shaderName:name queue:backend->queue()]; mThreads = std::make_pair(std::get<0>(ret), std::get<1>(ret)); return NO_ERROR; } -ErrorCode MetalConvolutionDepthwise::onFloat(const Tensor *input, const Tensor *output) { - auto backend = static_cast(this->backend()); - if(backend->isCommandEncoderSet()) { - return NO_ERROR; - } - - auto func = [=](){ - auto encoder = backend->encoder(); - [encoder setComputePipelineState:mPipeline]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset: TensorUtils::getDescribe(input)->extra.offset +void MetalConvolutionDepthwise::onFloat(const Tensor *input, const Tensor *output, id encoder) { + [encoder setComputePipelineState:mPipeline]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset: TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset: TensorUtils::getDescribe(output)->extra.offset + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset: TensorUtils::getDescribe(output)->extra.offset atIndex:1]; - [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; - [encoder setBuffer:mWeight offset:0 atIndex:3]; - [encoder setBuffer:mBias offset:0 atIndex:4]; - [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; - - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - - return NO_ERROR; + [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; + [encoder setBuffer:mWeight offset:0 atIndex:3]; + [encoder setBuffer:mBias offset:0 atIndex:4]; + [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; } template @@ -132,7 +114,10 @@ id MetalConvolutionDepthwise::weightForFloat(int group, int oc, int ic, int kh, int kw, const float *src) { auto backend = static_cast(this->backend()); auto context = (__bridge MNNMetalContext *)static_cast(backend)->context(); - return weightInBlock(context, group, kh, kw, src); + if (backend->useFp16InsteadFp32()) { + return weightInBlock(context, group, kh, kw, src); + } + return weightInBlock(context, group, kh, kw, src); } class MetalConvolutionDepthwiseCreator : public MetalBackend::Creator { diff --git a/source/backend/metal/MetalConvolutionGEMM.hpp b/source/backend/metal/MetalConvolutionGEMM.hpp deleted file mode 100644 index 4d898b797..000000000 --- a/source/backend/metal/MetalConvolutionGEMM.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// -// MetalConvolutionGEMM.hpp -// MNN -// -// Created by MNN on 2019/01/31. -// Copyright © 2018, Alibaba Group Holding Limited -// - -#ifndef MetalConvolutionGEMM_hpp -#define MetalConvolutionGEMM_hpp - -#import "MetalConvolutionCommon.hpp" - -#if MNN_METAL_ENABLED -namespace MNN { - -class MetalConvolutionGEMM : public MetalConvolutionCommon { -public: - static bool isValid(const Convolution2D *conv, const Tensor *input); - MetalConvolutionGEMM(Backend *backend, const Tensor *input, const MNN::Op *op); - virtual ~MetalConvolutionGEMM() = default; - virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; - -protected: - virtual ErrorCode onFloat(const Tensor *input, const Tensor *output) override; - virtual id weightForFloat(int group, int oc, int ic, int kh, int kw, const float *src) override; - -private: - id mShapeBuffer = nil; - std::shared_ptr mTempInput; - std::shared_ptr mTempOutput; - id mPipelineGEMM; - std::pair mGemm; - id mPipelineIm2Col; - std::pair mIm2Col; - id mPipelineCol2Im; - std::pair mCol2Im; -}; - -} // namespace MNN -#endif /* MNN_METAL_ENABLED */ -#endif /* MetalConvolutionGEMM_hpp */ diff --git a/source/backend/metal/MetalConvolutionGEMM.mm b/source/backend/metal/MetalConvolutionGEMM.mm deleted file mode 100644 index 6065a4849..000000000 --- a/source/backend/metal/MetalConvolutionGEMM.mm +++ /dev/null @@ -1,214 +0,0 @@ -// -// MetalConvolutionGEMM.mm -// MNN -// -// Created by MNN on 2019/01/31. -// Copyright © 2018, Alibaba Group Holding Limited -// - -#import "backend/metal/MetalConvolutionGEMM.hpp" -#import "core/Macro.h" -#import "core/Macro.h" -#import "backend/metal/MetalBackend.hpp" -#import "backend/metal/MetalConvolution.hpp" - -#if MNN_METAL_ENABLED -namespace MNN { - -bool MetalConvolutionGEMM::isValid(const Convolution2D *conv, const Tensor *input) { - auto common = conv->common(); - auto kx = common->kernelX(), ky = common->kernelY(); - if (kx == 1 || ky == 1 || common->group() != 1) { - return false; - } - auto oc = common->outputCount(); - if (oc <= 16) { - return false; - } - auto iw = input->width(), ih = input->height(), ic = input->channel(); - if (iw * ih * ic <= 16384) { - return false; - } - auto sx = common->strideX(), ow = (iw - kx + 1) / sx; - auto sy = common->strideY(), oh = (ih - ky + 1) / sy; - if ((iw * ih * ic) / (ow * oh * oc) > 4) { - return false; - } - - auto unit = conv->quanParameter() != nullptr ? sizeof(float) : sizeof(metal_float); - auto iz = UP_DIV(ic, 4), oz = UP_DIV(oc, 4), batch = input->batch(); - return UP_DIV(ow * oh * batch, 4) * kx * ky * iz * 16 * sizeof(metal_float) < (2 << 20) && // tmp input - UP_DIV(ow * oh * batch, 4) * oz * 16 * unit < (2 << 20); // tmp output -} - -MetalConvolutionGEMM::MetalConvolutionGEMM(Backend *backend, const Tensor *input, const MNN::Op *op) - : MetalConvolutionCommon(backend, op) { - loadWeight(op->main_as_Convolution2D()); -} - -ErrorCode MetalConvolutionGEMM::onResize(const std::vector &inputs, const std::vector &outputs) { - // prepare - auto backend = static_cast(this->backend()); - auto context = (__bridge MNNMetalContext *)backend->context(); - auto input = inputs[0], output = outputs[0]; - auto iw = input->width(); - auto ih = input->height(); - auto ic_4 = UP_DIV(input->channel(), 4); - auto ow = output->width(); - auto oh = output->height(); - auto oc_4 = UP_DIV(output->channel(), 4); - auto ob = output->batch(); - - auto pads = ConvolutionCommon::convolutionPad(input, output, mOp->main_as_Convolution2D()->common()); - auto padX = pads.first; - auto padY = pads.second; - - // create const buffer - int constants[] = {iw, - ih, - iw * ih, - ic_4, - ow, - oh, - ow * oh, - oc_4, - ob, - - mKernelX, - mKernelY, - mKernelX * mKernelY, - mStrideX, - mStrideY, - padX, - padY, - mDilateX, - mDilateY, - mActivationType}; - mConstBuffer = backend->getConstBuffer(sizeof(constants)); - ::memcpy(mConstBuffer.contents, constants, sizeof(constants)); - - // create mat mul const buffer - int shapes[] = {UP_DIV(ow * oh * ob, 4), oc_4, mKernelX * mKernelY * ic_4, 1}; - mShapeBuffer = [context newDeviceBuffer:sizeof(shapes) bytes:shapes access:CPUWriteOnly]; - - // accquire space for source & dst - int is = UP_DIV(ow * oh * ob, 4) * mKernelX * mKernelY * ic_4 * 16 * sizeof(metal_float) / sizeof(uint8_t); - int os = UP_DIV(ow * oh * ob, 4) * oc_4 * 16 * sizeof(metal_float) / sizeof(uint8_t); - mTempInput.reset(Tensor::createDevice(std::vector{is})); - mTempOutput.reset(Tensor::createDevice(std::vector{os})); - - if (!backend->onAcquireBuffer(mTempInput.get(), Backend::DYNAMIC) || - !backend->onAcquireBuffer(mTempOutput.get(), Backend::DYNAMIC)) { - return OUT_OF_MEMORY; - } - backend->onReleaseBuffer(mTempInput.get(), Backend::DYNAMIC); - backend->onReleaseBuffer(mTempOutput.get(), Backend::DYNAMIC); - mPipelineGEMM = [context pipelineWithName:@"matmul4x4"]; - mPipelineIm2Col = [context pipelineWithName:@"conv_im2col"]; - mPipelineCol2Im = [context pipelineWithName:@"conv_col2im"]; - NSUInteger gw = UP_DIV(output->width() * output->height() * output->batch(), 4); - NSUInteger gh = UP_DIV(output->channel(), 4); - - { - NSUInteger gid_x = gw; - NSUInteger gid_y = gh; - NSUInteger gid_z = 1; - NSArray *arr = [NSArray arrayWithObjects:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)mTempInput->deviceId())->getBuffer(), - (id)(((MetalRuntimeAllocator::MetalBufferAlloc *)mTempOutput->deviceId()))->getBuffer(), mWeight, mShapeBuffer, nil]; - - std::string name = "matmul4x4"; - MetalRuntime *rt = (MetalRuntime *)backend->runtime(); - auto ret = [context getGridAndThreadgroup:mPipelineGEMM gid:MTLSizeMake(gid_x, gid_y, gid_z) loop:10 buffer:arr runtime:rt shaderName:name]; - mGemm = std::make_pair(std::get<0>(ret), std::get<1>(ret)); - } - mIm2Col = [context computeBestGroupAndLocal:mPipelineIm2Col threads:{(NSUInteger)ow, (NSUInteger)oh, (NSUInteger)ic_4*ob}]; - mCol2Im = [context computeBestGroupAndLocal:mPipelineCol2Im threads:{(NSUInteger)ow, (NSUInteger)oh, (NSUInteger)oc_4*ob}]; - return NO_ERROR; -} - -ErrorCode MetalConvolutionGEMM::onExecute(const std::vector &inputs, const std::vector &outputs) { - return onFloat(inputs[0], outputs[0]); -} - -ErrorCode MetalConvolutionGEMM::onFloat(const Tensor *input, const Tensor *output) { - auto backend = static_cast(this->backend()); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; - } - - auto func = [=](){ - auto encoder = backend->encoder(); - { // im2col - [encoder setComputePipelineState:mPipelineIm2Col]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)mTempInput->deviceId())->getBuffer() offset:TensorUtils::getDescribe(mTempInput.get())->extra.offset atIndex:1]; - [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; - [encoder dispatchThreadgroups:mIm2Col.first threadsPerThreadgroup:mIm2Col.second]; - } - { // gemm - [encoder setComputePipelineState:mPipelineGEMM]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)mTempInput->deviceId())->getBuffer() offset:TensorUtils::getDescribe(mTempInput.get())->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)mTempOutput->deviceId())->getBuffer() offset:TensorUtils::getDescribe(mTempOutput.get())->extra.offset atIndex:1]; - [encoder setBuffer:mWeight offset:0 atIndex:2]; - [encoder setBuffer:mShapeBuffer offset:0 atIndex:3]; - [encoder dispatchThreadgroups:mGemm.first threadsPerThreadgroup:mGemm.second]; - } - { // col2im - [encoder setComputePipelineState:mPipelineCol2Im]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)mTempOutput->deviceId())->getBuffer() offset:TensorUtils::getDescribe(mTempOutput.get())->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; - [encoder setBuffer:mBias offset:0 atIndex:2]; - [encoder setBuffer:mConstBuffer offset:0 atIndex:3]; - [encoder dispatchThreadgroups:mCol2Im.first threadsPerThreadgroup:mCol2Im.second]; - } - - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - - return NO_ERROR; -} - -template -static id weightInBlock(MNNMetalContext *context, int group, int oc, int ic, int kh, int kw, - const FType *src) { - auto oz = UP_DIV(oc, 4); - auto iz = UP_DIV(ic, 4); - auto buffer = [context newDeviceBuffer:oz * iz * kw * kh * 16 * sizeof(TType) access:CPUWriteOnly]; - auto dst = (TType *)buffer.contents; - - for (int o = 0; o < oc; o++) { - auto zo = o / 4, ro = o % 4; - auto o_dst = dst + zo * iz * kh * kw * 16 + ro; // o/4 x 4 -#pragma clang loop vectorize(enable) - for (int i = 0; i < ic; i++) { - auto zi = i / 4, ri = i % 4; - auto i_dst = o_dst + zi * kh * kw * 16 + ri * 4; // i/4 x 4 -#pragma clang loop vectorize(enable) - for (int h = 0; h < kh; h++) { -#pragma clang loop vectorize(enable) unroll(enable) - for (int w = 0; w < kw; w++) { - // to [g][o/4][i/4][h][w][16] - // from [g][o][i][h][w] - i_dst[(h * kw + w) * 16] = *src++; - } - } - } - } - return buffer; -} - -id MetalConvolutionGEMM::weightForFloat(int group, int oc, int ic, int kh, int kw, const float *src) { - auto backend = static_cast(this->backend()); - auto context = (__bridge MNNMetalContext *)static_cast(backend)->context(); - return weightInBlock(context, group, oc, ic, kh, kw, src); -} - -} // namespace MNN -#endif /* MNN_METAL_ENABLED */ diff --git a/source/backend/metal/MetalConvolutionWinograd.hpp b/source/backend/metal/MetalConvolutionWinograd.hpp index f8df4b669..e91078674 100644 --- a/source/backend/metal/MetalConvolutionWinograd.hpp +++ b/source/backend/metal/MetalConvolutionWinograd.hpp @@ -22,7 +22,7 @@ class MetalConvolutionWinograd : public MetalConvolutionCommon { virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; protected: - virtual ErrorCode onFloat(const Tensor *input, const Tensor *output) override; + virtual void onFloat(const Tensor *input, const Tensor *output, id encoder) override; virtual id weightForFloat(int group, int oc, int ic, int kh, int kw, const float *src) override; private: diff --git a/source/backend/metal/MetalConvolutionWinograd.mm b/source/backend/metal/MetalConvolutionWinograd.mm index 63f344609..9ac2ba62a 100644 --- a/source/backend/metal/MetalConvolutionWinograd.mm +++ b/source/backend/metal/MetalConvolutionWinograd.mm @@ -110,10 +110,11 @@ mOutputTransformThreads.width = uw; mOutputTransformThreads.height = uh; mOutputTransformThreads.depth = oz; + int bytes = backend->useFp16InsteadFp32() ? 2 : 4; // accquire space - int is = mSrcUnit * mSrcUnit * us * iz * 16 * sizeof(metal_float) / sizeof(uint8_t); - int os = mSrcUnit * mSrcUnit * us * oz * 16 * sizeof(metal_float) / sizeof(uint8_t); + int is = mSrcUnit * mSrcUnit * us * iz * 16 * bytes; + int os = mSrcUnit * mSrcUnit * us * oz * 16 * bytes; mTempSrc.reset(Tensor::createDevice(std::vector{is})); mTempDst.reset(Tensor::createDevice(std::vector{os})); backend->onAcquireBuffer(mTempSrc.get(), Backend::DYNAMIC); @@ -124,51 +125,33 @@ return NO_ERROR; } -ErrorCode MetalConvolutionWinograd::onFloat(const Tensor *input, const Tensor *output) { +void MetalConvolutionWinograd::onFloat(const Tensor *input, const Tensor *output, id encoder) { auto backend = static_cast(this->backend()); auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCommandEncoderSet()) { - return NO_ERROR; + { // transform + auto bandwidth = [context load:mKernelX == 3 ? @"winograd_transform_source2_3_1" : @"winograd_transform_source2_5_1" encoder:encoder fp16:backend->useFp16InsteadFp32()]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)mTempSrc->deviceId())->getBuffer() offset:TensorUtils::getDescribe(mTempSrc.get())->extra.offset atIndex:1]; + [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; + [context dispatchEncoder:encoder threads:mInputTransformThreads bandwidth:bandwidth]; + } + { // gemm + auto bandwidth = [context load:@"matmul4x4" encoder:encoder fp16:backend->useFp16InsteadFp32()]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)mTempSrc->deviceId())->getBuffer() offset:TensorUtils::getDescribe(mTempSrc.get())->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)mTempDst->deviceId())->getBuffer() offset:TensorUtils::getDescribe(mTempDst.get())->extra.offset atIndex:1]; + [encoder setBuffer:mWeight offset:0 atIndex:2]; + [encoder setBuffer:mShapeBuffer offset:0 atIndex:3]; + [context dispatchEncoder:encoder threads:mMatMulThreads bandwidth:bandwidth]; + } + { // transform + auto bandwidth = [context load:mKernelX == 3 ? @"winograd_transform_dest2_3_1" : @"winograd_transform_dest2_5_1" encoder:encoder fp16:backend->useFp16InsteadFp32()]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)mTempDst->deviceId())->getBuffer() offset:TensorUtils::getDescribe(mTempDst.get())->extra.offset atIndex:0]; + [encoder setBuffer:mBias offset:0 atIndex:1]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:2]; + [encoder setBuffer:mConstBuffer offset:0 atIndex:3]; + [context dispatchEncoder:encoder threads:mOutputTransformThreads bandwidth:bandwidth]; } - - auto func = [=](){ - auto encoder = backend->encoder(); - { // transform - auto bandwidth = [context load:mKernelX == 3 ? @"winograd_transform_source2_3_1" : @"winograd_transform_source2_5_1" encoder:encoder]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)mTempSrc->deviceId())->getBuffer() offset:TensorUtils::getDescribe(mTempSrc.get())->extra.offset atIndex:1]; - [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; - [context dispatchEncoder:encoder threads:mInputTransformThreads bandwidth:bandwidth]; - } - { // gemm - auto bandwidth = [context load:@"matmul4x4" encoder:encoder]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)mTempSrc->deviceId())->getBuffer() offset:TensorUtils::getDescribe(mTempSrc.get())->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)mTempDst->deviceId())->getBuffer() offset:TensorUtils::getDescribe(mTempDst.get())->extra.offset atIndex:1]; - [encoder setBuffer:mWeight offset:0 atIndex:2]; - [encoder setBuffer:mShapeBuffer offset:0 atIndex:3]; - [context dispatchEncoder:encoder threads:mMatMulThreads bandwidth:bandwidth]; - } - { // transform - auto bandwidth = [context load:mKernelX == 3 ? @"winograd_transform_dest2_3_1" : @"winograd_transform_dest2_5_1" encoder:encoder]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)mTempDst->deviceId())->getBuffer() offset:TensorUtils::getDescribe(mTempDst.get())->extra.offset atIndex:0]; - [encoder setBuffer:mBias offset:0 atIndex:1]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:2]; - [encoder setBuffer:mConstBuffer offset:0 atIndex:3]; - [context dispatchEncoder:encoder threads:mOutputTransformThreads bandwidth:bandwidth]; - } - MNN_PRINT_ENCODER(context, encoder); - - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - - return NO_ERROR; } id MetalConvolutionWinograd::weightForFloat(int group, int oc, int ic, int kh, int kw, const float *src) { auto backend = static_cast(this->backend()); @@ -179,18 +162,23 @@ std::shared_ptr dstWeight = generater.allocTransformWeight(srcWeight.get(), 4, 4); generater.transformWeight(dstWeight.get(), srcWeight.get()); -#if MNN_METAL_FULL_PRECISION - auto bytes = dstWeight->host(); -#else - std::shared_ptr dstWeightHalf(Tensor::create(dstWeight->shape())); - auto f32 = dstWeight->host(); - auto f16 = dstWeightHalf->host(); - for (int i = 0; i < dstWeight->elementSize(); ++i) { - f16[i] = f32[i]; + int bytenumber = 4; + void* bytes = nullptr; + std::shared_ptr dstWeightHalf; + if (backend->useFp16InsteadFp32()) { + dstWeightHalf.reset(Tensor::create(dstWeight->shape())); + auto f32 = dstWeight->host(); + auto f16 = dstWeightHalf->host<__fp16>(); + for (int i = 0; i < dstWeight->elementSize(); ++i) { + f16[i] = f32[i]; + } + bytes = dstWeightHalf->host(); + bytenumber = 2; + } else { + bytes = dstWeight->host(); + bytenumber = 4; } - auto bytes = dstWeightHalf->host(); -#endif - return [context newDeviceBuffer:4 * UP_DIV(ic, 4) * UP_DIV(oc, 4) * mSrcUnit * mSrcUnit * 4 * sizeof(metal_float) + return [context newDeviceBuffer:4 * UP_DIV(ic, 4) * UP_DIV(oc, 4) * mSrcUnit * mSrcUnit * 4 * bytenumber bytes:bytes access:CPUWriteOnly]; } diff --git a/source/backend/metal/MetalDeconvolution.hpp b/source/backend/metal/MetalDeconvolution.hpp index c7b54d30c..cc1c1d6b7 100644 --- a/source/backend/metal/MetalDeconvolution.hpp +++ b/source/backend/metal/MetalDeconvolution.hpp @@ -9,19 +9,17 @@ #ifndef MetalDeconvolution_hpp #define MetalDeconvolution_hpp -#import "core/Execution.hpp" -#import "MNN_generated.h" -#import "MetalDefine.h" - +#import "MetalExecution.hpp" +#include "MNN_generated.h" #if MNN_METAL_ENABLED namespace MNN { -class MetalDeconvolution : public Execution { +class MetalDeconvolution : public MetalExecution { public: MetalDeconvolution(Backend *backend, const MNN::Op *op); virtual ~MetalDeconvolution() = default; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; private: bool mDepthwise = false; diff --git a/source/backend/metal/MetalDeconvolution.mm b/source/backend/metal/MetalDeconvolution.mm index 52ef54cf5..27ac61b42 100755 --- a/source/backend/metal/MetalDeconvolution.mm +++ b/source/backend/metal/MetalDeconvolution.mm @@ -38,13 +38,9 @@ static int leastCommonMultiple(int m, int n) { auto dst = (TType *)buffer.contents; for (int g = 0; g < group; g++) { -#pragma clang loop vectorize(enable) for (int i = 0; i < gic; i++) { -#pragma clang loop vectorize(enable) for (int o = 0; o < goc; o++) { -#pragma clang loop vectorize(enable) for (int h = 0; h < kh; h++) { -#pragma clang loop vectorize(enable) unroll(enable) for (int w = 0; w < kw; w++) { auto zo = o / 4, ro = o % 4; auto zi = i / 4, ri = i % 4; @@ -85,7 +81,8 @@ static int leastCommonMultiple(int m, int n) { return buffer; } -static id weightForDeconv(MNNMetalContext *context, bool depthwise, const Convolution2D *deconv, +template +id weightForDeconv(MNNMetalContext *context, bool depthwise, const Convolution2D *deconv, ConvolutionCommon::Int8Common *qnt) { auto size = qnt ? qnt->weightFloat.size() : deconv->weight()->size(); auto common = deconv->common(); @@ -95,31 +92,43 @@ static int leastCommonMultiple(int m, int n) { auto oc = common->outputCount(); auto ic = size / kw / kh / (oc / group); if (depthwise) { - return weightForDepthwise(context, group, kh, kw, + return weightForDepthwise(context, group, kh, kw, qnt ? qnt->weightFloat.get() : deconv->weight()->data()); } else { - return weightForDeconv(context, group, oc, ic, kh, kw, + return weightForDeconv(context, group, oc, ic, kh, kw, qnt ? qnt->weightFloat.get() : deconv->weight()->data()); } } -static id biasForDeconv(MNNMetalContext *context, const Convolution2D *deconv) { +static id biasForDeconv(MNNMetalContext *context, const Convolution2D *deconv, bool fp16) { auto bias = deconv->bias(); if (!bias || bias->size() == 0) return [context newDeviceBuffer:0 access:CPUTransparent]; auto oc = deconv->common()->outputCount(); - auto buffer = [context newDeviceBuffer:UP_DIV(oc, 4) * 4 * sizeof(metal_float) access:CPUWriteOnly]; + int bytes = 4; + if (fp16) { + bytes = 2; + } + auto buffer = [context newDeviceBuffer:UP_DIV(oc, 4) * 4 * bytes access:CPUWriteOnly]; auto src = bias->data(); - auto dst = (metal_float *)buffer.contents; -#pragma clang loop vectorize(enable) unroll(enable) - for (int i = 0; i < oc; i++) - dst[i] = src[i]; + if (fp16) { + auto dst = (__fp16 *)buffer.contents; + for (int i = 0; i < oc; i++) { + dst[i] = src[i]; + } + } else { + auto dst = (float *)buffer.contents; + for (int i = 0; i < oc; i++) { + dst[i] = src[i]; + } + } return buffer; } -MetalDeconvolution::MetalDeconvolution(Backend *backend, const MNN::Op *op) : Execution(backend) { +MetalDeconvolution::MetalDeconvolution(Backend *backend, const MNN::Op *op) : MetalExecution(backend) { auto context = (__bridge MNNMetalContext *)static_cast(backend)->context(); + auto mtbn = static_cast(backend); auto deconv = op->main_as_Convolution2D(); auto common = deconv->common(); mOp = op; @@ -141,12 +150,16 @@ static int leastCommonMultiple(int m, int n) { if (deconv->quanParameter()) { qnt = ConvolutionCommon::load(deconv, backend, true); } - mWeight = weightForDeconv(context, mDepthwise, deconv, qnt.get()); - mBias = biasForDeconv(context, deconv); + if (mtbn->useFp16InsteadFp32()) { + mWeight = weightForDeconv<__fp16>(context, mDepthwise, deconv, qnt.get()); + } else { + mWeight = weightForDeconv(context, mDepthwise, deconv, qnt.get()); + } + mBias = biasForDeconv(context, deconv, mtbn->useFp16InsteadFp32()); if (mDepthwise) { - mPipeline = [context pipelineWithName:@"deconv_depthwise"]; + mPipeline = [context pipelineWithName:@"deconv_depthwise" fp16:mtbn->useFp16InsteadFp32()]; } else { - mPipeline = [context pipelineWithName:@"deconv"]; + mPipeline = [context pipelineWithName:@"deconv" fp16:mtbn->useFp16InsteadFp32()]; } } @@ -198,35 +211,15 @@ static int leastCommonMultiple(int m, int n) { return NO_ERROR; } -ErrorCode MetalDeconvolution::onExecute(const std::vector &inputs, const std::vector &outputs) { - auto backend = static_cast(this->backend()); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; - } - - auto func = [=](){ +void MetalDeconvolution::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { auto input = inputs[0], output = outputs[0]; - - auto encoder = backend->encoder(); - [encoder setComputePipelineState:mPipeline]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; - [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; - [encoder setBuffer:mWeight offset:0 atIndex:3]; - [encoder setBuffer:mBias offset:0 atIndex:4]; - [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; - - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - - return NO_ERROR; + [encoder setComputePipelineState:mPipeline]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; + [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; + [encoder setBuffer:mWeight offset:0 atIndex:3]; + [encoder setBuffer:mBias offset:0 atIndex:4]; + [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; } class MetalDeconvolutionCreator : public MetalBackend::Creator { diff --git a/source/backend/metal/MetalDefine.h b/source/backend/metal/MetalDefine.h index 9f11c2d4c..a3735dfb8 100644 --- a/source/backend/metal/MetalDefine.h +++ b/source/backend/metal/MetalDefine.h @@ -19,11 +19,6 @@ #import #endif -#if (TARGET_OS_IPHONE && TARGET_OS_SIMULATOR) -#undef MNN_METAL_ENABLED -#define MNN_METAL_ENABLED 0 -#endif - #endif #ifndef MNN_METAL_DEBUG #if DEBUG @@ -34,14 +29,6 @@ #endif #define MNN_METAL_BENCHMARK 0 -#define MNN_METAL_FULL_PRECISION 0 // should edit in metal too -#if MNN_METAL_FULL_PRECISION || !defined(__FLT16_EPSILON__) -typedef float metal_float; -#define MNNMetalPixelFormatRGBAFloat MTLPixelFormatRGBA32Float -#else -typedef __fp16 metal_float; -#define MNNMetalPixelFormatRGBAFloat MTLPixelFormatRGBA16Float -#endif #endif /* MetalDefine_h */ diff --git a/source/backend/metal/MetalEltwise.hpp b/source/backend/metal/MetalEltwise.hpp index 9fcb1ffdf..2066a1442 100644 --- a/source/backend/metal/MetalEltwise.hpp +++ b/source/backend/metal/MetalEltwise.hpp @@ -8,23 +8,21 @@ #ifndef MetalEltwise_hpp #define MetalEltwise_hpp - -#import "core/Execution.hpp" +#import "MetalExecution.hpp" #import "MNN_generated.h" -#import "MetalDefine.h" #if MNN_METAL_ENABLED namespace MNN { -class MetalEltwise : public Execution { +class MetalEltwise : public MetalExecution { public: MetalEltwise(Backend *backend, EltwiseType type); virtual ~MetalEltwise() = default; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; private: - void encode(const Tensor *input0, const Tensor *input1, const Tensor *output); + void encode(const Tensor *input0, const Tensor *input1, const Tensor *output, id encoder); id mPipeline; id mConst; std::pair mThreads; diff --git a/source/backend/metal/MetalEltwise.mm b/source/backend/metal/MetalEltwise.mm index 5d586c923..42876687b 100755 --- a/source/backend/metal/MetalEltwise.mm +++ b/source/backend/metal/MetalEltwise.mm @@ -14,7 +14,7 @@ #if MNN_METAL_ENABLED namespace MNN { -MetalEltwise::MetalEltwise(Backend *backend, EltwiseType type) : Execution(backend) { +MetalEltwise::MetalEltwise(Backend *backend, EltwiseType type) : MetalExecution(backend) { auto metal = static_cast(backend); auto context = (__bridge MNNMetalContext *)metal->context(); mConst = [context newDeviceBuffer:4 * sizeof(int) access:CPUWriteOnly]; @@ -32,7 +32,7 @@ default: break; } - mPipeline = [context pipelineWithName:kernel]; + mPipeline = [context pipelineWithName:kernel fp16:metal->useFp16InsteadFp32()]; } ErrorCode MetalEltwise::onResize(const std::vector &inputs, const std::vector &outputs) { ((int*)(mConst.contents))[0] = outputs[0]->elementSize(); @@ -43,9 +43,7 @@ return NO_ERROR; } -void MetalEltwise::encode(const Tensor *input0, const Tensor *input1, const Tensor *output) { - auto metal = static_cast(this->backend()); - auto encoder = metal->encoder(); +void MetalEltwise::encode(const Tensor *input0, const Tensor *input1, const Tensor *output, id encoder) { [encoder setComputePipelineState:mPipeline]; [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input0->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input0)->extra.offset atIndex:0]; [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input1->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input1)->extra.offset atIndex:1]; @@ -54,30 +52,12 @@ [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; } -ErrorCode MetalEltwise::onExecute(const std::vector &inputs, const std::vector &outputs) { - auto backend = static_cast(this->backend()); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; +void MetalEltwise::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { + auto output = outputs[0]; + encode(inputs[0], inputs[1], output, encoder); + for (int i = 2; i < inputs.size(); i++) { + encode(inputs[i], output, output, encoder); } - - auto func = [=](){ - auto output = outputs[0]; - encode(inputs[0], inputs[1], output); - for (int i = 2; i < inputs.size(); i++) { - encode(inputs[i], output, output); - } - - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - - return NO_ERROR; } class MetalEltwiseCreator : public MetalBackend::Creator { diff --git a/source/backend/metal/MetalExecution.hpp b/source/backend/metal/MetalExecution.hpp new file mode 100644 index 000000000..5aab8b7a4 --- /dev/null +++ b/source/backend/metal/MetalExecution.hpp @@ -0,0 +1,21 @@ +#ifndef MetalExecution_hpp +#define MetalExecution_hpp + +#include "core/Execution.hpp" +#import "MetalDefine.h" +#include +#if MNN_METAL_ENABLED +namespace MNN { + +class MetalExecution : public Execution { +public: + MetalExecution(Backend *backend); + virtual ~MetalExecution() = default; + virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) = 0; + +}; +} // namespace MNN +#endif /* MNN_METAL_ENABLED */ + +#endif diff --git a/source/backend/metal/MetalExecution.mm b/source/backend/metal/MetalExecution.mm new file mode 100644 index 000000000..9bb8ac161 --- /dev/null +++ b/source/backend/metal/MetalExecution.mm @@ -0,0 +1,32 @@ +#include "MetalExecution.hpp" +#import "backend/metal/MetalBackend.hpp" + +#if MNN_METAL_ENABLED +namespace MNN { +MetalExecution::MetalExecution(Backend *backend) : Execution(backend) { + // Do nothing +} + +ErrorCode MetalExecution::onExecute(const std::vector &inputs, const std::vector &outputs) { + auto backend = static_cast(this->backend()); + + if(backend->isCommandEncoderSet()) { + return NO_ERROR; + } + + auto func = [=](){ + auto encoder = backend->encoder_for_net(); + this->onEncode(inputs, outputs, encoder); + if(backend->isCmdBufferCommit()) { + backend->flushEncoder(); + backend->commit_net(); + } + }; + func(); + backend->addOpEncoder(func); + return NO_ERROR; +} + + +}; +#endif diff --git a/source/backend/metal/MetalFuse.hpp b/source/backend/metal/MetalFuse.hpp index 3111c2204..257e75dac 100644 --- a/source/backend/metal/MetalFuse.hpp +++ b/source/backend/metal/MetalFuse.hpp @@ -9,18 +9,17 @@ #ifndef MetalFuse_hpp #define MetalFuse_hpp -#import "core/Execution.hpp" +#import "MetalExecution.hpp" #import "MNN_generated.h" -#import "MetalDefine.h" #if MNN_METAL_ENABLED namespace MNN { -class MetalFuse : public Execution { +class MetalFuse : public MetalExecution { public: MetalFuse(Backend *backend, const Op* op); virtual ~MetalFuse() = default; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; private: diff --git a/source/backend/metal/MetalFuse.mm b/source/backend/metal/MetalFuse.mm index 8996b1087..21bf60eda 100755 --- a/source/backend/metal/MetalFuse.mm +++ b/source/backend/metal/MetalFuse.mm @@ -16,7 +16,7 @@ #if MNN_METAL_ENABLED namespace MNN { // #define MNN_FUSE_DEBUG -MetalFuse::MetalFuse(Backend *backend, const Op* op) : Execution(backend), mOp(op) { +MetalFuse::MetalFuse(Backend *backend, const Op* op) : MetalExecution(backend), mOp(op) { auto mtbn = static_cast(backend); auto context = (__bridge MNNMetalContext *)mtbn->context(); mConstBuffer = [context newDeviceBuffer:3 * sizeof(int) access:CPUWriteOnly]; @@ -27,9 +27,7 @@ #ifdef MNN_FUSE_DEBUG MNN_PRINT("MetalFuse srcCode:\n%s\n", srcCode); #endif - auto source = [[NSString alloc] initWithUTF8String:ss.str().c_str()]; - auto name = [[NSString alloc] initWithUTF8String:extra->type()->c_str()]; - mPipeline = [context pipelineWithSource:source name:name]; + mPipeline = mtbn->makeComputePipelineWithSourceOption(ss.str().c_str(), extra->type()->c_str(), nil); } ErrorCode MetalFuse::onResize(const std::vector &inputs, const std::vector &outputs) { @@ -43,61 +41,186 @@ return NO_ERROR; } -ErrorCode MetalFuse::onExecute(const std::vector &inputs, const std::vector &outputs) { - auto backend = static_cast(this->backend()); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; +void MetalFuse::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { + auto input = inputs[0], output = outputs[0]; + [encoder setComputePipelineState:mPipeline]; + int i = 0; + for (; i < inputs.size(); i++) { + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)inputs[i]->deviceId())->getBuffer() offset:TensorUtils::getDescribe(inputs[i])->extra.offset atIndex:i]; } - - auto func = [=](){ - auto input = inputs[0], output = outputs[0]; - auto encoder = backend->encoder(); - [encoder setComputePipelineState:mPipeline]; - int i = 0; - for (; i < inputs.size(); i++) { - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)inputs[i]->deviceId())->getBuffer() offset:TensorUtils::getDescribe(inputs[i])->extra.offset atIndex:i]; - } - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:i++]; - [encoder setBuffer:mConstBuffer offset:0 atIndex:i++]; - [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:i++]; + [encoder setBuffer:mConstBuffer offset:0 atIndex:i++]; + [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; #ifdef MNN_FUSE_DEBUG - auto dump = [&backend](const Tensor* t) { - auto outDimType = t->getDimensionType(); - auto expectTensor = new MNN::Tensor(t, outDimType); - backend->onCopyBuffer(t, expectTensor); - MNN_PRINT("[ "); - for (int i = 0; i < 10; i++) { - MNN_PRINT("%f, ", expectTensor->host()[i]); - } - MNN_PRINT(" ]\n"); - delete expectTensor; - }; - { - MNN_PRINT("=============================\n"); - for (int i = 0; i < inputs.size(); i++) { - inputs[i]->wait(Tensor::MAP_TENSOR_READ, true); - dump(inputs[i]); - } - output->wait(Tensor::MAP_TENSOR_READ, true); - dump(output); - MNN_PRINT("=============================\n"); + auto dump = [&backend](const Tensor* t) { + auto outDimType = t->getDimensionType(); + auto expectTensor = new MNN::Tensor(t, outDimType); + backend->onCopyBuffer(t, expectTensor); + MNN_PRINT("[ "); + for (int i = 0; i < 10; i++) { + MNN_PRINT("%f, ", expectTensor->host()[i]); } + MNN_PRINT(" ]\n"); + delete expectTensor; + }; + { + MNN_PRINT("=============================\n"); + for (int i = 0; i < inputs.size(); i++) { + inputs[i]->wait(Tensor::MAP_TENSOR_READ, true); + dump(inputs[i]); + } + output->wait(Tensor::MAP_TENSOR_READ, true); + dump(output); + MNN_PRINT("=============================\n"); + } #endif - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; +} + +static bool _isStandardFuse(const Op* op) { + if (op->type() != OpType_Extra) { + return false; + } + if (nullptr == op->main_as_Extra()) { + return false; + } + auto extra = op->main_as_Extra(); + if (nullptr == extra->attr()) { + return false; + } + for (int i=0; iattr()->size(); ++i) { + auto attr = extra->attr()->GetAs(i); + if (attr->key()->str() == "version") { + if (nullptr != attr->s()) { + std::string cont = attr->s()->str(); + return cont == "common"; + } + return false; } - }; - func(); - backend->addOpEncoder(func); - return NO_ERROR; + } + return false; } +class MetalFuseV2 : public MetalExecution { +public: + MetalFuseV2(Backend *backend, const Op* op, int outputSize, int inputSize) : MetalExecution(backend) { + mOutputBinding.resize(outputSize); + mInputBinding.resize(inputSize); + auto mtbn = static_cast(backend); + auto context = (__bridge MNNMetalContext *)mtbn->context(); + auto extra = op->main_as_Extra(); + // Find shader + const char* source = nil; + for (int i=0; iattr()->size(); ++i) { + auto attr = extra->attr()->GetAs(i); + if (attr->key()->str() == "metal") { + source = attr->s()->c_str(); + break; + } + } + mPipeline = mtbn->makeComputePipelineWithSourceOption(source, "main0", nil); + + // Init size + for (int i=0; iattr()->size(); ++i) { + auto attr = extra->attr()->GetAs(i); + if (attr->key()->str() == "group_size") { + auto ptr = attr->tensor()->int32s()->data(); + mGroupSize.width = ptr[0]; + mGroupSize.height = ptr[1]; + mGroupSize.depth = ptr[2]; + break; + } + } + for (int i=0; iattr()->size(); ++i) { + auto attr = extra->attr()->GetAs(i); + if (attr->key()->str() == "local_size") { + auto ptr = attr->tensor()->int32s()->data(); + mThreadSize.width = ptr[0]; + mThreadSize.height = ptr[1]; + mThreadSize.depth = ptr[2]; + break; + } + } + int maxIndex = -1; + for (int i=0; iattr()->size(); ++i) { + auto attr = extra->attr()->GetAs(i); + if (attr->key()->str() == "input") { + maxIndex = ALIMAX(maxIndex, attr->i()); + } else if (attr->key()->str() == "const") { + maxIndex = ALIMAX(maxIndex, attr->i()); + } + } + for (int i=0; iattr()->size(); ++i) { + auto attr = extra->attr()->GetAs(i); + if (attr->key()->str() == "input") { + auto list = attr->list()->i()->data(); + if (list[1] >= 0) { + if (0 == list[0]) { + mInputBinding[list[1]] = attr->i(); + } else { + mOutputBinding[list[1]] = attr->i(); + } + } + continue; + } + if (attr->key()->str() == "const") { + auto b = attr->tensor(); + void* result = nullptr; + size_t bufferSize = 0; + switch (b->dataType()) { + case DataType_DT_FLOAT: + result = (void*)b->float32s()->Data(); + bufferSize = b->float32s()->size() * sizeof(float); + break; + case DataType_DT_INT32: + result = (void*)b->int32s()->Data(); + bufferSize = b->int32s()->size() * sizeof(float); + break; + default: + MNN_ASSERT(false); + break; + } + // TODO: Fuse All Const Buffer to One buffer + id constBuffer = [context newDeviceBuffer:bufferSize access:CPUWriteOnly]; + ::memcpy([constBuffer contents], result, bufferSize); + + mConstIndides.emplace_back(std::make_pair(attr->i(), std::make_pair(constBuffer, 0))); + continue; + } + } + } + virtual ~MetalFuseV2() = default; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override { + [encoder setComputePipelineState:mPipeline]; + for (int i=0; i)((MetalRuntimeAllocator::MetalBufferAlloc *)inputs[i]->deviceId())->getBuffer() offset:TensorUtils::getDescribe(inputs[i])->extra.offset atIndex:mInputBinding[i]]; + } + for (int i=0; i)((MetalRuntimeAllocator::MetalBufferAlloc *)outputs[i]->deviceId())->getBuffer() offset:TensorUtils::getDescribe(outputs[i])->extra.offset atIndex:mOutputBinding[i]]; + } + for (int i=0; i &inputs, const std::vector &outputs) override { + auto backend = static_cast(this->backend()); + + return NO_ERROR; + } +private: + MTLSize mGroupSize; + MTLSize mThreadSize; + std::vector mInputBinding; + std::vector mOutputBinding; + std::vector, size_t>>> mConstIndides; + id mPipeline; +}; class MetalFuseCreator : public MetalBackend::Creator { public: virtual Execution *onCreate(const std::vector &inputs, const MNN::Op *op, Backend *backend, const std::vector& outputs) const { + if (_isStandardFuse(op)) { + return new MetalFuseV2(backend, op, (int)outputs.size(), (int)inputs.size()); + } return new MetalFuse(backend, op); } }; diff --git a/source/backend/metal/MetalGridSample.hpp b/source/backend/metal/MetalGridSample.hpp index f8b5ccc0f..b5c2f6493 100644 --- a/source/backend/metal/MetalGridSample.hpp +++ b/source/backend/metal/MetalGridSample.hpp @@ -9,18 +9,18 @@ #ifndef MetalGridSample_hpp #define MetalGridSample_hpp -#import "core/Execution.hpp" +#import "MetalExecution.hpp" #import "MNN_generated.h" #import "MetalBackend.hpp" #if MNN_METAL_ENABLED namespace MNN { -class MetalGridSample : public Execution { +class MetalGridSample : public MetalExecution { public: MetalGridSample(Backend *backend, const GridSample* gridSample); virtual ~MetalGridSample() = default; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; private: diff --git a/source/backend/metal/MetalGridSample.mm b/source/backend/metal/MetalGridSample.mm index d15c648c2..dafb4014e 100644 --- a/source/backend/metal/MetalGridSample.mm +++ b/source/backend/metal/MetalGridSample.mm @@ -13,7 +13,7 @@ namespace MNN { MetalGridSample::MetalGridSample(Backend *backend, const GridSample *gridSample) - : Execution(backend) { + : MetalExecution(backend) { mMode = gridSample->mode(); mPaddingMode = gridSample->paddingMode(); mAlignCorners = gridSample->alignCorners(); @@ -40,7 +40,7 @@ auto backend = static_cast(this->backend()); auto context = (__bridge MNNMetalContext *)backend->context(); - mPipeline = [context pipelineWithName:@"grid_sample"]; + mPipeline = [context pipelineWithName:@"grid_sample" fp16:backend->useFp16InsteadFp32()]; int batches = ((int *)mParams.contents)[0]; int channels = ((int *)mParams.contents)[1]; @@ -52,32 +52,13 @@ return NO_ERROR; } -ErrorCode MetalGridSample::onExecute(const std::vector &inputs, const std::vector &outputs) { - auto backend = static_cast(this->backend()); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; - } - - auto func = [=](){ - auto encoder = backend->encoder(); - [encoder setComputePipelineState:mPipeline]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)inputs[0]->deviceId())->getBuffer() offset:TensorUtils::getDescribe(inputs[0])->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)inputs[1]->deviceId())->getBuffer() offset:TensorUtils::getDescribe(inputs[1])->extra.offset atIndex:1]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)outputs[0]->deviceId())->getBuffer() offset:TensorUtils::getDescribe(outputs[0])->extra.offset atIndex:2]; - [encoder setBuffer:mParams offset:0 atIndex:3]; - [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; - - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - - return NO_ERROR; +void MetalGridSample::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { + [encoder setComputePipelineState:mPipeline]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)inputs[0]->deviceId())->getBuffer() offset:TensorUtils::getDescribe(inputs[0])->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)inputs[1]->deviceId())->getBuffer() offset:TensorUtils::getDescribe(inputs[1])->extra.offset atIndex:1]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)outputs[0]->deviceId())->getBuffer() offset:TensorUtils::getDescribe(outputs[0])->extra.offset atIndex:2]; + [encoder setBuffer:mParams offset:0 atIndex:3]; + [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; } class MetalGridSampleCreator : public MetalBackend::Creator { diff --git a/source/backend/metal/MetalInterp.hpp b/source/backend/metal/MetalInterp.hpp index 6b71390e5..5c9be7465 100644 --- a/source/backend/metal/MetalInterp.hpp +++ b/source/backend/metal/MetalInterp.hpp @@ -9,17 +9,16 @@ #ifndef MetalInterp_hpp #define MetalInterp_hpp -#include "core/Execution.hpp" -#include "MetalDefine.h" +#include "MetalExecution.hpp" #if MNN_METAL_ENABLED namespace MNN { -class MetalInterp : public Execution { +class MetalInterp : public MetalExecution { public: MetalInterp(Backend *backend, const Op* op); virtual ~MetalInterp() = default; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; private: diff --git a/source/backend/metal/MetalInterp.mm b/source/backend/metal/MetalInterp.mm index 684f5069f..6859059d6 100755 --- a/source/backend/metal/MetalInterp.mm +++ b/source/backend/metal/MetalInterp.mm @@ -15,7 +15,7 @@ namespace MNN { MetalInterp::MetalInterp(Backend *backend, const Op* op) - : Execution(backend) { + : MetalExecution(backend) { auto interpParam = op->main_as_Interp(); auto mBk = static_cast(this->backend()); auto context = (__bridge MNNMetalContext *)mBk->context(); @@ -43,12 +43,12 @@ ((int *)mShape.contents)[6] = slice; if (mReiszeType == 2 || mReiszeType == 1) { if (2 == mReiszeType) { - mPipeline = [context pipelineWithName:@"resize_bilinear"]; + mPipeline = [context pipelineWithName:@"resize_bilinear" fp16:backend->useFp16InsteadFp32()]; } else { - mPipeline = [context pipelineWithName:@"resize_nearest"]; + mPipeline = [context pipelineWithName:@"resize_nearest" fp16:backend->useFp16InsteadFp32()]; } } else if (mReiszeType == 3) { - mPipeline = [context pipelineWithName:@"resize_cubic"]; + mPipeline = [context pipelineWithName:@"resize_cubic" fp16:backend->useFp16InsteadFp32()]; } else { MNN_ASSERT(false); } @@ -57,36 +57,15 @@ return NO_ERROR; } - -ErrorCode MetalInterp::onExecute(const std::vector &inputs, const std::vector &outputs) { - auto backend = static_cast(this->backend()); - if(backend->isCommandEncoderSet()) { - return NO_ERROR; - } - - auto func = [=](){ - - auto input = inputs[0], output = outputs[0]; - // encode - auto encoder = backend->encoder(); - [encoder setComputePipelineState:mPipeline]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; - [encoder setBuffer:mShape offset:0 atIndex:2]; - [encoder setBuffer:mCordTransform offset:0 atIndex:3]; - [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; - - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - - func(); - backend->addOpEncoder(func); - - return NO_ERROR; +void MetalInterp::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { + auto input = inputs[0], output = outputs[0]; + // encode + [encoder setComputePipelineState:mPipeline]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; + [encoder setBuffer:mShape offset:0 atIndex:2]; + [encoder setBuffer:mCordTransform offset:0 atIndex:3]; + [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; } class MetalInterpCreator : public MetalBackend::Creator { diff --git a/source/backend/metal/MetalLayerNorm.hpp b/source/backend/metal/MetalLayerNorm.hpp index 05da66202..048977144 100644 --- a/source/backend/metal/MetalLayerNorm.hpp +++ b/source/backend/metal/MetalLayerNorm.hpp @@ -9,19 +9,18 @@ #ifndef MetalLayerNorm_hpp #define MetalLayerNorm_hpp -#import "core/Execution.hpp" +#import "MetalExecution.hpp" #import "MNN_generated.h" -#import "MetalDefine.h" #if MNN_METAL_ENABLED namespace MNN { -class MetalLayerNorm : public Execution { +class MetalLayerNorm : public MetalExecution { public: MetalLayerNorm(Backend *backend, const LayerNorm *layernorm); virtual ~MetalLayerNorm() = default; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; private: int mOutside; diff --git a/source/backend/metal/MetalLayerNorm.mm b/source/backend/metal/MetalLayerNorm.mm index 162c77910..62cdbf1d8 100755 --- a/source/backend/metal/MetalLayerNorm.mm +++ b/source/backend/metal/MetalLayerNorm.mm @@ -14,7 +14,7 @@ namespace MNN { MetalLayerNorm::MetalLayerNorm(Backend *backend, const LayerNorm *layernorm) - : Execution(backend), mGroup(layernorm->group()), + : MetalExecution(backend), mGroup(layernorm->group()), mEps(layernorm->epsilon()) { auto context = (__bridge MNNMetalContext *)static_cast(backend)->context(); @@ -69,10 +69,10 @@ } std::sort(mAxis.begin(), mAxis.end()); - for (int i = 0; i < rank - axis.size(); ++i) { + for (int i = 0; i < rank - (int)axis.size(); ++i) { mOutside *= input->length(i); } - for (int i = rank - axis.size(); i < rank; ++i) { + for (int i = rank - (int)axis.size(); i < rank; ++i) { mInside *= input->length(i); } @@ -84,44 +84,26 @@ bool parallel = (mInside > 32) && ((mInside & 3) == 0); - mPipeline = [context pipelineWithName:parallel ? @"layernorm_x4" : @"layernorm_x1"]; + mPipeline = [context pipelineWithName:parallel ? @"layernorm_x4" : @"layernorm_x1" fp16:backend->useFp16InsteadFp32()]; auto inside = parallel ? mInside/4 : mInside; mThreads = [context computeBestGroupAndLocal:mPipeline threads:MTLSizeMake((NSUInteger)inside, (NSUInteger)mOutside, 1)]; return NO_ERROR; } -ErrorCode MetalLayerNorm::onExecute(const std::vector &inputs, const std::vector &outputs) { +void MetalLayerNorm::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { auto backend = static_cast(this->backend()); auto context = (__bridge MNNMetalContext *)backend->context(); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; - } - - auto func = [=](){ - auto input = inputs[0], output = outputs[0]; - - auto encoder = backend->encoder(); - [encoder setComputePipelineState:mPipeline]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; - [encoder setBuffer:mShapeBuffer offset:0 atIndex:2]; - [encoder setBuffer:mGammaBuffer offset:0 atIndex:3]; - [encoder setBuffer:mBetaBuffer offset:0 atIndex:4]; - - [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; - MNN_PRINT_ENCODER(context, encoder); - - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - return NO_ERROR; + auto input = inputs[0], output = outputs[0]; + [encoder setComputePipelineState:mPipeline]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; + [encoder setBuffer:mShapeBuffer offset:0 atIndex:2]; + [encoder setBuffer:mGammaBuffer offset:0 atIndex:3]; + [encoder setBuffer:mBetaBuffer offset:0 atIndex:4]; + + [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; + MNN_PRINT_ENCODER(context, encoder); } class MetalLayerNormCreator : public MetalBackend::Creator { diff --git a/source/backend/metal/MetalMatMul.hpp b/source/backend/metal/MetalMatMul.hpp index a9a35494e..b0ead2f86 100644 --- a/source/backend/metal/MetalMatMul.hpp +++ b/source/backend/metal/MetalMatMul.hpp @@ -9,18 +9,18 @@ #ifndef MetalMatMul_hpp #define MetalMatMul_hpp -#import "core/Execution.hpp" +#import "MetalExecution.hpp" #import "MNN_generated.h" #import "MetalBackend.hpp" #if MNN_METAL_ENABLED namespace MNN { -class MetalMatMul : public Execution { +class MetalMatMul : public MetalExecution { public: MetalMatMul(Backend *backend, const MatMul *matmul); virtual ~MetalMatMul() = default; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; private: diff --git a/source/backend/metal/MetalMatMul.mm b/source/backend/metal/MetalMatMul.mm index b3a42b4a3..c73a8b99a 100755 --- a/source/backend/metal/MetalMatMul.mm +++ b/source/backend/metal/MetalMatMul.mm @@ -18,7 +18,7 @@ int size[4]; int stride[4]; }; -MetalMatMul::MetalMatMul(Backend *backend, const MatMul *matmul) : Execution(backend) { +MetalMatMul::MetalMatMul(Backend *backend, const MatMul *matmul) : MetalExecution(backend) { mTransposeA = matmul->transposeA(); mTransposeB = matmul->transposeB(); auto mkbn = static_cast(backend); @@ -57,51 +57,34 @@ return NO_ERROR; } -ErrorCode MetalMatMul::onExecute(const std::vector &inputs, const std::vector &outputs) { +void MetalMatMul::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { auto backend = static_cast(this->backend()); auto context = (__bridge MNNMetalContext *)static_cast(backend)->context(); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; - } - - auto func = [=](){ - auto input0 = inputs[0], input1 = inputs[1], output = outputs[0]; - Tensor* C = outputs[0]; - auto e = C->length(0); - auto h = C->length(1); - - auto encoder = backend->encoder(); - if (inputs.size() > 2) { - auto bandwidth = [context load:@"matmul_bias" encoder:encoder]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input0->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input0)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input1->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input1)->extra.offset atIndex:1]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)inputs[2]->deviceId())->getBuffer() offset:TensorUtils::getDescribe(inputs[2])->extra.offset atIndex:2]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:3]; - [encoder setBuffer:mConstBuffer offset:0 atIndex:4]; - [context dispatchEncoder:encoder - threads:{ (NSUInteger)h, (NSUInteger)e, (NSUInteger)1 } - bandwidth:bandwidth]; - } else { - auto bandwidth = [context load:@"matmul" encoder:encoder]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input0->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input0)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input1->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input1)->extra.offset atIndex:1]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:2]; - [encoder setBuffer:mConstBuffer offset:0 atIndex:3]; - [context dispatchEncoder:encoder - threads:{ (NSUInteger)h, (NSUInteger)e, (NSUInteger)1 } - bandwidth:bandwidth]; - } - - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); + auto input0 = inputs[0], input1 = inputs[1], output = outputs[0]; + Tensor* C = outputs[0]; + auto e = C->length(0); + auto h = C->length(1); - return NO_ERROR; + if (inputs.size() > 2) { + auto bandwidth = [context load:@"matmul_bias" encoder:encoder fp16:backend->useFp16InsteadFp32()]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input0->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input0)->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input1->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input1)->extra.offset atIndex:1]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)inputs[2]->deviceId())->getBuffer() offset:TensorUtils::getDescribe(inputs[2])->extra.offset atIndex:2]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:3]; + [encoder setBuffer:mConstBuffer offset:0 atIndex:4]; + [context dispatchEncoder:encoder + threads:{ (NSUInteger)h, (NSUInteger)e, (NSUInteger)1 } + bandwidth:bandwidth]; + } else { + auto bandwidth = [context load:@"matmul" encoder:encoder fp16:backend->useFp16InsteadFp32()]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input0->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input0)->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input1->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input1)->extra.offset atIndex:1]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:2]; + [encoder setBuffer:mConstBuffer offset:0 atIndex:3]; + [context dispatchEncoder:encoder + threads:{ (NSUInteger)h, (NSUInteger)e, (NSUInteger)1 } + bandwidth:bandwidth]; + } } class MetalMatMulCreator : public MetalBackend::Creator { diff --git a/source/backend/metal/MetalPReLU.hpp b/source/backend/metal/MetalPReLU.hpp index c06b49c6d..8f3145831 100644 --- a/source/backend/metal/MetalPReLU.hpp +++ b/source/backend/metal/MetalPReLU.hpp @@ -9,18 +9,16 @@ #ifndef MetalPReLU_hpp #define MetalPReLU_hpp -#import "core/Execution.hpp" -#import "MetalDefine.h" - +#import "MetalExecution.hpp" #if MNN_METAL_ENABLED namespace MNN { -class MetalPReLU : public Execution { +class MetalPReLU : public MetalExecution { public: MetalPReLU(Backend *backend, const float *slope, int count); virtual ~MetalPReLU() = default; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; private: id mSlope; diff --git a/source/backend/metal/MetalPReLU.mm b/source/backend/metal/MetalPReLU.mm index 71319a415..15fae170b 100755 --- a/source/backend/metal/MetalPReLU.mm +++ b/source/backend/metal/MetalPReLU.mm @@ -14,14 +14,15 @@ #if MNN_METAL_ENABLED namespace MNN { -MetalPReLU::MetalPReLU(Backend *backend, const float *slope, int count) : Execution(backend) { +MetalPReLU::MetalPReLU(Backend *backend, const float *slope, int count) : MetalExecution(backend) { auto context = (__bridge MNNMetalContext *)static_cast(backend)->context(); mSlope = [context newDeviceBuffer:UP_DIV(count, 4) * 4 * sizeof(float) bytes:slope access:CPUWriteOnly]; mShareChannel = 1 == count; if (!mShareChannel) { mShape = [context newDeviceBuffer:3 * sizeof(int) access:CPUWriteOnly]; } - mPipeline = [context pipelineWithName:mShareChannel ? @"prelu" : @"prelu_slopes"]; + auto mtbn = static_cast(backend); + mPipeline = [context pipelineWithName:mShareChannel ? @"prelu" : @"prelu_slopes" fp16:mtbn->useFp16InsteadFp32()]; } ErrorCode MetalPReLU::onResize(const std::vector &inputs, const std::vector &outputs) { @@ -40,35 +41,16 @@ return NO_ERROR; } -ErrorCode MetalPReLU::onExecute(const std::vector &inputs, const std::vector &outputs) { - auto backend = static_cast(this->backend()); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; +void MetalPReLU::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { + auto input = inputs[0], output = outputs[0]; + [encoder setComputePipelineState:mPipeline]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; + [encoder setBuffer:mSlope offset:0 atIndex:2]; + if (!mShareChannel) { + [encoder setBuffer:mShape offset:0 atIndex:3]; } - - auto func = [=](){ - auto input = inputs[0], output = outputs[0]; - - auto encoder = backend->encoder(); - [encoder setComputePipelineState:mPipeline]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; - [encoder setBuffer:mSlope offset:0 atIndex:2]; - if (!mShareChannel) { - [encoder setBuffer:mShape offset:0 atIndex:3]; - } - [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; - - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - return NO_ERROR; + [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; } class MetalPReLUCreator : public MetalBackend::Creator { diff --git a/source/backend/metal/MetalPooling.hpp b/source/backend/metal/MetalPooling.hpp index 04f009da2..7c9e50ab3 100644 --- a/source/backend/metal/MetalPooling.hpp +++ b/source/backend/metal/MetalPooling.hpp @@ -9,19 +9,18 @@ #ifndef MetalPooling_hpp #define MetalPooling_hpp -#import "core/Execution.hpp" +#import "MetalExecution.hpp" #import "MNN_generated.h" -#import "MetalDefine.h" #if MNN_METAL_ENABLED namespace MNN { -class MetalPooling : public Execution { +class MetalPooling : public MetalExecution { public: MetalPooling(Backend *backend, const Pool *pooling); virtual ~MetalPooling() = default; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; private: bool mGlobal; diff --git a/source/backend/metal/MetalPooling.mm b/source/backend/metal/MetalPooling.mm index 2128b4cc9..c95a93bd8 100755 --- a/source/backend/metal/MetalPooling.mm +++ b/source/backend/metal/MetalPooling.mm @@ -15,7 +15,7 @@ namespace MNN { MetalPooling::MetalPooling(Backend *backend, const Pool *pooling) - : Execution(backend), + : MetalExecution(backend), mGlobal(pooling->isGlobal()), mPoolType(pooling->type()), mKernelX(pooling->kernelX()), @@ -60,38 +60,20 @@ ((int *)mConstBuffer.contents)[9] = padWidth; ((int *)mConstBuffer.contents)[10] = padHeight; auto ow = output->width(), oh = output->height(), slice = UP_DIV(output->channel(), 4) * output->batch(); - mPipeline = [context pipelineWithName:(mPoolType == PoolType_MAXPOOL) ? @"pooling_max" : @"pooling_avg"]; + mPipeline = [context pipelineWithName:(mPoolType == PoolType_MAXPOOL) ? @"pooling_max" : @"pooling_avg" fp16:backend->useFp16InsteadFp32()]; auto size = [context computeBestGroupAndLocal:mPipeline threads:MTLSizeMake(ow, oh, slice)]; mLocal = size.second; mGroup = size.first; return NO_ERROR; } -ErrorCode MetalPooling::onExecute(const std::vector &inputs, const std::vector &outputs) { - auto backend = static_cast(this->backend()); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; - } - - auto func = [=](){ - auto input = inputs[0], output = outputs[0]; - auto encoder = backend->encoder(); - [encoder setComputePipelineState:mPipeline]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; - [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; - [encoder dispatchThreadgroups:mGroup threadsPerThreadgroup:mLocal]; - - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - return NO_ERROR; +void MetalPooling::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { + auto input = inputs[0], output = outputs[0]; + [encoder setComputePipelineState:mPipeline]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; + [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; + [encoder dispatchThreadgroups:mGroup threadsPerThreadgroup:mLocal]; } class MetalPoolingCreator : public MetalBackend::Creator { diff --git a/source/backend/metal/MetalROIPooling.hpp b/source/backend/metal/MetalROIPooling.hpp index 674bbd36b..4b707864e 100644 --- a/source/backend/metal/MetalROIPooling.hpp +++ b/source/backend/metal/MetalROIPooling.hpp @@ -9,20 +9,21 @@ #ifndef MetalROIPooling_hpp #define MetalROIPooling_hpp -#import "core/Execution.hpp" -#import "MetalDefine.h" +#import "MetalExecution.hpp" #if MNN_METAL_ENABLED namespace MNN { -class MetalROIPooling : public Execution { +class MetalROIPooling : public MetalExecution { public: MetalROIPooling(Backend *backend, float spatialScale); virtual ~MetalROIPooling() = default; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; private: float mSpatialScale; + id mShape; }; } // namespace MNN diff --git a/source/backend/metal/MetalROIPooling.mm b/source/backend/metal/MetalROIPooling.mm index 4eedc2db2..786b3f49d 100755 --- a/source/backend/metal/MetalROIPooling.mm +++ b/source/backend/metal/MetalROIPooling.mm @@ -15,11 +15,10 @@ namespace MNN { MetalROIPooling::MetalROIPooling(Backend *backend, float spatialScale) - : Execution(backend), mSpatialScale(spatialScale) { + : MetalExecution(backend), mSpatialScale(spatialScale) { // nothing to do } - -ErrorCode MetalROIPooling::onExecute(const std::vector &inputs, const std::vector &outputs) { +ErrorCode MetalROIPooling::onResize(const std::vector &inputs, const std::vector &outputs) { auto backend = static_cast(this->backend()); auto context = (__bridge MNNMetalContext *)backend->context(); auto input = inputs[0], roi = inputs[1], output = outputs[0]; @@ -35,18 +34,23 @@ ((int *)shape.contents)[5] = ow * oh; ((int *)shape.contents)[6] = oz; ((float *)shape.contents)[7] = mSpatialScale; + mShape = shape; + return NO_ERROR; +} + +void MetalROIPooling::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { + auto backend = static_cast(this->backend()); + auto context = (__bridge MNNMetalContext *)backend->context(); + auto input = inputs[0], roi = inputs[1], output = outputs[0]; + int iw = input->width(), ih = input->height(); + int ow = output->width(), oh = output->height(), oz = UP_DIV(output->channel(), 4), ob = output->batch(); + + auto bandwidth = [context load:@"ROI_pooling" encoder:encoder fp16:backend->useFp16InsteadFp32()]; - auto encoder = backend->encoder(); - auto bandwidth = [context load:@"ROI_pooling" encoder:encoder]; [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)roi->deviceId())->getBuffer() offset:TensorUtils::getDescribe(roi)->extra.offset atIndex:1]; [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:2]; - [encoder setBuffer:shape offset:0 atIndex:3]; - [context dispatchEncoder:encoder - threads:{ (NSUInteger) ow, (NSUInteger)oh, (NSUInteger)oz *ob } - bandwidth:bandwidth]; - MNN_PRINT_ENCODER(context, encoder); - return NO_ERROR; + [encoder setBuffer:mShape offset:0 atIndex:3]; } class MetalROIPoolingCreator : public MetalBackend::Creator { diff --git a/source/backend/metal/MetalRaster.hpp b/source/backend/metal/MetalRaster.hpp index acb91c74a..20b873362 100644 --- a/source/backend/metal/MetalRaster.hpp +++ b/source/backend/metal/MetalRaster.hpp @@ -9,19 +9,18 @@ #ifndef MetalRaster_hpp #define MetalRaster_hpp -#import "core/Execution.hpp" -#import "MetalDefine.h" +#import "MetalExecution.hpp" #include #if MNN_METAL_ENABLED namespace MNN { -class MetalRaster : public Execution { +class MetalRaster : public MetalExecution { public: MetalRaster(Backend *backend); virtual ~MetalRaster() = default; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; private: std::map> mTempInput; std::vector, id, MTLSize, MTLSize, int> > mTempInputCopy; @@ -31,6 +30,8 @@ class MetalRaster : public Execution { bool mFast = false; id mBlitPipeline; std::vector> mShapeTemp; + id mZeroCopy = nil; + id mZeroPipeline; }; } // namespace MNN diff --git a/source/backend/metal/MetalRaster.mm b/source/backend/metal/MetalRaster.mm index 68bfc8b83..b65b7b9e2 100644 --- a/source/backend/metal/MetalRaster.mm +++ b/source/backend/metal/MetalRaster.mm @@ -35,9 +35,13 @@ static void writeSamplerInfo(SamplerInfo& info, const Tensor::InsideDescribe::Re info.stride[3] = sampler.src.offset; info.extent[3] = sampler.dst.offset; } -MetalRaster::MetalRaster(Backend *backend) : Execution(backend) { +MetalRaster::MetalRaster(Backend *backend) : MetalExecution(backend) { // Do nothing } +struct MemsetInfo { + int value[4]; + uint32_t size[4]; +}; ErrorCode MetalRaster::onResize(const std::vector &____inputs, const std::vector &outputs) { MNN_ASSERT(outputs.size() == 1); OpCommonUtils::rasterInputReset(____inputs, outputs[0]); @@ -46,8 +50,14 @@ static void writeSamplerInfo(SamplerInfo& info, const Tensor::InsideDescribe::Re auto des = outputDes; mNeedZero = !TensorUtils::regionIsFull(output); auto context = (__bridge MNNMetalContext *)static_cast(backend())->context(); + auto mtbn = static_cast(backend()); auto bytes = outputs[0]->getType().bytes(); - + if (mNeedZero) { + MemsetInfo meminfo; + ::memset(&meminfo, 0, sizeof(MemsetInfo)); + mZeroCopy = [context newDeviceBuffer:sizeof(MemsetInfo) bytes:&meminfo access:CPUWriteOnly]; + mZeroPipeline = [context pipelineWithName:@"fill_intx4" fp16:mtbn->useFp16InsteadFp32()]; + } mTempInput.clear(); mTempOutput = nullptr; mOutputPtr = (id)((MetalRuntimeAllocator::MetalBufferAlloc *)(output->deviceId()))->getBuffer(); @@ -82,13 +92,13 @@ static void writeSamplerInfo(SamplerInfo& info, const Tensor::InsideDescribe::Re break; } if (outputs[0]->getType().code == halide_type_float) { -#if MNN_METAL_FULL_PRECISION - kernelName = @"blit_intx4"; -#else - kernelName = @"blit_int64"; -#endif + if (mtbn->useFp16InsteadFp32()) { + kernelName = @"blit_int64"; + } else { + kernelName = @"blit_intx4"; + } } - mBlitPipeline = [context pipelineWithName:kernelName]; + mBlitPipeline = [context pipelineWithName:kernelName fp16:mtbn->useFp16InsteadFp32()]; for (int i=0; i< des->regions.size(); ++i) { auto& slice = des->regions[i]; @@ -161,13 +171,13 @@ static void writeSamplerInfo(SamplerInfo& info, const Tensor::InsideDescribe::Re break; } if (outputs[0]->getType().code == halide_type_float) { -#if MNN_METAL_FULL_PRECISION - kernelName = @"blit_int"; -#else - kernelName = @"blit_int16"; -#endif + if (mtbn->useFp16InsteadFp32()) { + kernelName = @"blit_int16"; + } else { + kernelName = @"blit_int"; + } } - mBlitPipeline = [context pipelineWithName:kernelName]; + mBlitPipeline = [context pipelineWithName:kernelName fp16:mtbn->useFp16InsteadFp32()]; for (int i=0; i< des->regions.size(); ++i) { auto& slice = des->regions[i]; if (nullptr == slice.origin) { @@ -196,55 +206,43 @@ static void writeSamplerInfo(SamplerInfo& info, const Tensor::InsideDescribe::Re return NO_ERROR; } -ErrorCode MetalRaster::onExecute(const std::vector &____inputs, const std::vector &outputs) { +void MetalRaster::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { auto backend = static_cast(this->backend()); auto context = (__bridge MNNMetalContext *)backend->context(); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; + int out_offset = TensorUtils::getDescribe(outputs[0])->extra.offset; + if (nullptr != mTempOutput) { + out_offset = TensorUtils::getDescribe(mTempOutput.get())->extra.offset; } - - auto func = [=](){ - int out_offset = TensorUtils::getDescribe(outputs[0])->extra.offset; - if (nullptr != mTempOutput) { - out_offset = TensorUtils::getDescribe(mTempOutput.get())->extra.offset; - } - if (mNeedZero) { - backend->flushEncoder(); - auto size = outputs[0]->elementSize(); - if (mTempOutput != nullptr) { - size = mTempOutput->elementSize(); - } - size = ((size + 3) / 4) * 4 * sizeof(metal_float); - auto blitEncode = [context encoderBlit_net]; - [blitEncode fillBuffer:mOutputPtr range:NSMakeRange(out_offset, size) value:0]; - [blitEncode endEncoding]; - } - auto encoder = backend->encoder(); - int index = 0; - for (auto& iter : mTempInput) { - backend->onCopyBuffer(iter.first, iter.second.get(), encoder, mShapeTemp[index++]); - } - - [encoder setComputePipelineState:mBlitPipeline]; - for (auto& iter : mTempInputCopy) { - [encoder setBuffer: std::get<0>(iter) offset: std::get<4>(iter) atIndex: 0]; - [encoder setBuffer: mOutputPtr offset:out_offset atIndex: 1]; - [encoder setBuffer: std::get<1>(iter) offset:0 atIndex: 2]; - [encoder dispatchThreadgroups:std::get<2>(iter) threadsPerThreadgroup:std::get<3>(iter)]; - } - if (nullptr != mTempOutput) { - backend->onCopyBuffer(mTempOutput.get(), outputs[0], encoder, mShapeTemp[index]); + if (mNeedZero) { + size_t sizeInBytes; + if (mTempOutput != nullptr) { + sizeInBytes = backend->getTensorSizeInBytes(mTempOutput.get()); + } else { + sizeInBytes = backend->getTensorSizeInBytes(outputs[0]); } + size_t size = sizeInBytes / (4 * sizeof(int32_t)); + auto ptr = (MemsetInfo*)[mZeroCopy contents]; + ptr->size[0] = (uint32_t)size; + [encoder setComputePipelineState:mZeroPipeline]; + [encoder setBuffer: mOutputPtr offset:out_offset atIndex: 0]; + [encoder setBuffer: mZeroCopy offset:0 atIndex: 1]; + [encoder dispatchThreadgroups:MTLSizeMake(UP_DIV(size, 256), 1, 1) threadsPerThreadgroup:MTLSizeMake(256, 1, 1)]; + } + int index = 0; + for (auto& iter : mTempInput) { + backend->onCopyBuffer(iter.first, iter.second.get(), encoder, mShapeTemp[index++]); + } - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - return NO_ERROR; + [encoder setComputePipelineState:mBlitPipeline]; + for (auto& iter : mTempInputCopy) { + [encoder setBuffer: std::get<0>(iter) offset: std::get<4>(iter) atIndex: 0]; + [encoder setBuffer: mOutputPtr offset:out_offset atIndex: 1]; + [encoder setBuffer: std::get<1>(iter) offset:0 atIndex: 2]; + [encoder dispatchThreadgroups:std::get<2>(iter) threadsPerThreadgroup:std::get<3>(iter)]; + } + if (nullptr != mTempOutput) { + backend->onCopyBuffer(mTempOutput.get(), outputs[0], encoder, mShapeTemp[index]); + } } class MetalRasterCreator : public MetalBackend::Creator { diff --git a/source/backend/metal/MetalReLU.hpp b/source/backend/metal/MetalReLU.hpp index ddeb77231..1b968e05e 100644 --- a/source/backend/metal/MetalReLU.hpp +++ b/source/backend/metal/MetalReLU.hpp @@ -9,17 +9,15 @@ #ifndef MetalReLU_hpp #define MetalReLU_hpp -#import "core/Execution.hpp" -#import "MetalDefine.h" - +#import "MetalExecution.hpp" #if MNN_METAL_ENABLED namespace MNN { -class MetalReLU : public Execution { +class MetalReLU : public MetalExecution { public: MetalReLU(Backend *backend, float slope); virtual ~MetalReLU() = default; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; private: id mSlope; diff --git a/source/backend/metal/MetalReLU.mm b/source/backend/metal/MetalReLU.mm index 9974c2d33..9f60ab335 100755 --- a/source/backend/metal/MetalReLU.mm +++ b/source/backend/metal/MetalReLU.mm @@ -15,45 +15,29 @@ #if MNN_METAL_ENABLED namespace MNN { -MetalReLU::MetalReLU(Backend *backend, float slope) : Execution(backend) { +MetalReLU::MetalReLU(Backend *backend, float slope) : MetalExecution(backend) { auto context = (__bridge MNNMetalContext *)static_cast(backend)->context(); mSlope = [context newDeviceBuffer:sizeof(float) bytes:&slope access:CPUWriteOnly]; } -ErrorCode MetalReLU::onExecute(const std::vector &inputs, const std::vector &outputs) { +void MetalReLU::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { auto backend = static_cast(this->backend()); auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCommandEncoderSet()) { - return NO_ERROR; + auto input = inputs[0], output = outputs[0]; + NSUInteger size = output->elementSize(); + auto simd = size % 4 == 0; + if (simd) { + size /= 4; } - auto func = [=](){ - auto input = inputs[0], output = outputs[0]; - NSUInteger size = output->elementSize(); - auto simd = size % 4 == 0; - if (simd) { - size /= 4; - } - - MNN_ASSERT(mSlope.length == sizeof(float)); - auto encoder = backend->encoder(); - auto bandwidth = [context load:simd ? @"relu_x4" : @"relu_x1" encoder:encoder]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; - [encoder setBuffer:mSlope offset:0 atIndex:2]; - [context dispatchEncoder:encoder threads:{ size, 1, 1 } bandwidth:bandwidth]; - MNN_PRINT_ENCODER(context, encoder); - - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - return NO_ERROR; + MNN_ASSERT(mSlope.length == sizeof(float)); + auto bandwidth = [context load:simd ? @"relu_x4" : @"relu_x1" encoder:encoder fp16:backend->useFp16InsteadFp32()]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; + [encoder setBuffer:mSlope offset:0 atIndex:2]; + [context dispatchEncoder:encoder threads:{ size, 1, 1 } bandwidth:bandwidth]; + MNN_PRINT_ENCODER(context, encoder); } class MetalReLUCreator : public MetalBackend::Creator { diff --git a/source/backend/metal/MetalReLU6.hpp b/source/backend/metal/MetalReLU6.hpp index 82174c6b5..96b1929be 100644 --- a/source/backend/metal/MetalReLU6.hpp +++ b/source/backend/metal/MetalReLU6.hpp @@ -9,17 +9,16 @@ #ifndef MetalReLU6_hpp #define MetalReLU6_hpp -#import "core/Execution.hpp" -#import "MetalDefine.h" +#import "MetalExecution.hpp" #if MNN_METAL_ENABLED namespace MNN { -class MetalReLU6 : public Execution { +class MetalReLU6 : public MetalExecution { public: MetalReLU6(Backend *backend, float minValue, float maxValue); virtual ~MetalReLU6() = default; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; private: id mConst; }; diff --git a/source/backend/metal/MetalReLU6.mm b/source/backend/metal/MetalReLU6.mm index 25764fba3..cd95e1975 100755 --- a/source/backend/metal/MetalReLU6.mm +++ b/source/backend/metal/MetalReLU6.mm @@ -15,44 +15,28 @@ #if MNN_METAL_ENABLED namespace MNN { -MetalReLU6::MetalReLU6(Backend *backend, float minV, float maxV) : Execution(backend) { +MetalReLU6::MetalReLU6(Backend *backend, float minV, float maxV) : MetalExecution(backend) { auto metal = static_cast(backend); auto context = (__bridge MNNMetalContext *)metal->context(); mConst = [context newDeviceBuffer:4 * sizeof(float) access:CPUWriteOnly]; ((float*)mConst.contents)[0] = minV; ((float*)mConst.contents)[1] = maxV; } -ErrorCode MetalReLU6::onExecute(const std::vector &inputs, const std::vector &outputs) { +void MetalReLU6::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { auto backend = static_cast(this->backend()); auto context = (__bridge MNNMetalContext *)backend->context(); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; + auto input = inputs[0], output = outputs[0]; + NSUInteger size = output->elementSize(); + auto simd = size % 4 == 0; + if (simd) { + size /= 4; } - auto func = [=](){ - auto input = inputs[0], output = outputs[0]; - NSUInteger size = output->elementSize(); - auto simd = size % 4 == 0; - if (simd) { - size /= 4; - } - - auto encoder = backend->encoder(); - auto bandwidth = [context load:simd ? @"relu6_x4" : @"relu6_x1" encoder:encoder]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; - [encoder setBuffer:mConst offset:0 atIndex:2]; - [context dispatchEncoder:encoder threads:{ size, 1, 1 } bandwidth:bandwidth]; - - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - return NO_ERROR; + auto bandwidth = [context load:simd ? @"relu6_x4" : @"relu6_x1" encoder:encoder fp16:backend->useFp16InsteadFp32()]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; + [encoder setBuffer:mConst offset:0 atIndex:2]; + [context dispatchEncoder:encoder threads:{ size, 1, 1 } bandwidth:bandwidth]; } class MetalReLU6Creator : public MetalBackend::Creator { diff --git a/source/backend/metal/MetalReduction.hpp b/source/backend/metal/MetalReduction.hpp index 59a6b8c66..cf0556026 100644 --- a/source/backend/metal/MetalReduction.hpp +++ b/source/backend/metal/MetalReduction.hpp @@ -9,19 +9,18 @@ #ifndef MetalReduction_hpp #define MetalReduction_hpp -#import "core/Execution.hpp" +#import "MetalExecution.hpp" #import "MNN_generated.h" -#import "MetalDefine.h" #if MNN_METAL_ENABLED namespace MNN { -class MetalReduction : public Execution { +class MetalReduction : public MetalExecution { public: MetalReduction(Backend *backend, const ReductionParam *reduction, halide_type_t type); virtual ~MetalReduction() = default; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; private: int mAxis; diff --git a/source/backend/metal/MetalReduction.mm b/source/backend/metal/MetalReduction.mm index 430d7e280..e7e43e57b 100755 --- a/source/backend/metal/MetalReduction.mm +++ b/source/backend/metal/MetalReduction.mm @@ -16,7 +16,7 @@ #if MNN_METAL_ENABLED namespace MNN { -MetalReduction::MetalReduction(Backend *backend, const ReductionParam *p, halide_type_t type) : Execution(backend) { +MetalReduction::MetalReduction(Backend *backend, const ReductionParam *p, halide_type_t type) : MetalExecution(backend) { auto integer = type.code == halide_type_int; NSString *kernel; switch (p->operation()) { @@ -47,7 +47,7 @@ auto mkbn = static_cast(backend); auto context = (__bridge MNNMetalContext *)mkbn->context(); mConst = [context newDeviceBuffer:4 * sizeof(int) access:CPUWriteOnly]; - mPipeline = [context pipelineWithName:kernel]; + mPipeline = [context pipelineWithName:kernel fp16:mkbn->useFp16InsteadFp32()]; } ErrorCode MetalReduction::onResize(const std::vector &inputs, const std::vector &outputs) { @@ -69,31 +69,13 @@ return NO_ERROR; } -ErrorCode MetalReduction::onExecute(const std::vector &inputs, const std::vector &outputs) { - auto backend = static_cast(this->backend()); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; - } - - auto func = [=](){ - auto &input = inputs[0], &output = outputs[0]; - auto encoder = backend->encoder(); - [encoder setComputePipelineState:mPipeline]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; - [encoder setBuffer:mConst offset:0 atIndex:2]; - [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; - - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - return NO_ERROR; +void MetalReduction::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { + auto &input = inputs[0], &output = outputs[0]; + [encoder setComputePipelineState:mPipeline]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; + [encoder setBuffer:mConst offset:0 atIndex:2]; + [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; } class MetalReductionCreator : public MetalBackend::Creator { diff --git a/source/backend/metal/MetalScale.hpp b/source/backend/metal/MetalScale.hpp index a32952d6c..a4d00b330 100644 --- a/source/backend/metal/MetalScale.hpp +++ b/source/backend/metal/MetalScale.hpp @@ -9,19 +9,18 @@ #ifndef MetalScale_hpp #define MetalScale_hpp -#import "core/Execution.hpp" +#import "MetalExecution.hpp" #import "MNN_generated.h" -#import "MetalDefine.h" #if MNN_METAL_ENABLED namespace MNN { -class MetalScale : public Execution { +class MetalScale : public MetalExecution { public: MetalScale(Backend *backend, const Scale *scale); virtual ~MetalScale() = default; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; private: id mScale; diff --git a/source/backend/metal/MetalScale.mm b/source/backend/metal/MetalScale.mm index 68f051434..4dc1fe5d4 100755 --- a/source/backend/metal/MetalScale.mm +++ b/source/backend/metal/MetalScale.mm @@ -14,15 +14,16 @@ #if MNN_METAL_ENABLED namespace MNN { -MetalScale::MetalScale(Backend *backend, const Scale *scale) : Execution(backend) { +MetalScale::MetalScale(Backend *backend, const Scale *scale) : MetalExecution(backend) { auto context = (__bridge MNNMetalContext *)static_cast(backend)->context(); + auto mtbn = static_cast(backend); auto channel4 = UP_DIV(scale->channels(), 4) * 4; mScale = [context newDeviceBuffer:channel4 * sizeof(float) bytes:scale->scaleData()->data() access:CPUWriteOnly]; mBias = scale->biasData() ? [context newDeviceBuffer:channel4 * sizeof(float) bytes:scale->biasData()->data() access:CPUWriteOnly] : [context newDeviceBuffer:channel4 * sizeof(float) access:CPUTransparent]; mConst = [context newDeviceBuffer:4 * sizeof(int) access:CPUWriteOnly]; - mPipeline = [context pipelineWithName:@"scale_ca"]; + mPipeline = [context pipelineWithName:@"scale_ca" fp16:mtbn->useFp16InsteadFp32()]; } ErrorCode MetalScale::onResize(const std::vector &inputs, const std::vector &outputs) { @@ -42,34 +43,16 @@ return NO_ERROR; } -ErrorCode MetalScale::onExecute(const std::vector &inputs, const std::vector &outputs) { - auto backend = static_cast(this->backend()); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; - } +void MetalScale::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { + auto input = inputs[0], output = outputs[0]; + [encoder setComputePipelineState:mPipeline]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; + [encoder setBuffer:mConst offset:0 atIndex:2]; + [encoder setBuffer:mScale offset:0 atIndex:3]; + [encoder setBuffer:mBias offset:0 atIndex:4]; + [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; - auto func = [=](){ - auto input = inputs[0], output = outputs[0]; - - auto encoder = backend->encoder(); - [encoder setComputePipelineState:mPipeline]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; - [encoder setBuffer:mConst offset:0 atIndex:2]; - [encoder setBuffer:mScale offset:0 atIndex:3]; - [encoder setBuffer:mBias offset:0 atIndex:4]; - [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; - - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - return NO_ERROR; } class MetalScaleCreator : public MetalBackend::Creator { diff --git a/source/backend/metal/MetalSoftmax.hpp b/source/backend/metal/MetalSoftmax.hpp index ad8853098..6c7e009bc 100644 --- a/source/backend/metal/MetalSoftmax.hpp +++ b/source/backend/metal/MetalSoftmax.hpp @@ -9,17 +9,16 @@ #ifndef MetalSoftmax_hpp #define MetalSoftmax_hpp -#import "core/Execution.hpp" - +#import "MetalExecution.hpp" #if MNN_METAL_ENABLED namespace MNN { -class MetalSoftmax : public Execution { +class MetalSoftmax : public MetalExecution { public: MetalSoftmax(Backend *backend, int32_t axis); virtual ~MetalSoftmax() = default; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; private: int32_t mAxis; diff --git a/source/backend/metal/MetalSoftmax.mm b/source/backend/metal/MetalSoftmax.mm index 424c50372..268d11774 100644 --- a/source/backend/metal/MetalSoftmax.mm +++ b/source/backend/metal/MetalSoftmax.mm @@ -15,7 +15,7 @@ #if MNN_METAL_ENABLED namespace MNN { -MetalSoftmax::MetalSoftmax(Backend *backend, int32_t axis) : Execution(backend), mAxis(axis) { +MetalSoftmax::MetalSoftmax(Backend *backend, int32_t axis) : MetalExecution(backend), mAxis(axis) { // nothing to do } @@ -59,43 +59,21 @@ // encode auto plane = !(TensorUtils::getDescribe(input)->dimensionFormat == MNN_DATA_FORMAT_NC4HW4); auto kernel = plane ? @"softmax_plane" : reorder ? @"softmax_on_reorder" : @"softmax_off_reorder"; - mPipeline = [context pipelineWithName:kernel]; + mPipeline = [context pipelineWithName:kernel fp16:backend->useFp16InsteadFp32()]; mThreads = [context computeBestGroupAndLocal:mPipeline threads:MTLSizeMake((NSUInteger)inside, (NSUInteger)outside, 1)]; return NO_ERROR; } -ErrorCode MetalSoftmax::onExecute(const std::vector &inputs, const std::vector &outputs) { - auto backend = static_cast(this->backend()); - auto context = (__bridge MNNMetalContext *)backend->context(); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; - } - - auto func = [=](){ - - auto input = inputs[0], output = outputs[0]; - - auto encoder = backend->encoder(); - [encoder setComputePipelineState:mPipeline]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; - [encoder setBuffer:mShapeBuffer offset:0 atIndex:2]; - - [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; - MNN_PRINT_ENCODER(context, encoder); +void MetalSoftmax::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { + auto input = inputs[0], output = outputs[0]; + [encoder setComputePipelineState:mPipeline]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; + [encoder setBuffer:mShapeBuffer offset:0 atIndex:2]; - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - return NO_ERROR; - + [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; + MNN_PRINT_ENCODER(context, encoder); } class MetalSoftmaxCreator : public MetalBackend::Creator { diff --git a/source/backend/metal/MetalUnary.hpp b/source/backend/metal/MetalUnary.hpp index 9488ac5cf..7953eead0 100644 --- a/source/backend/metal/MetalUnary.hpp +++ b/source/backend/metal/MetalUnary.hpp @@ -9,19 +9,18 @@ #ifndef MetalUnary_hpp #define MetalUnary_hpp -#import "core/Execution.hpp" +#import "MetalExecution.hpp" #import "MNN_generated.h" -#import "MetalDefine.h" #if MNN_METAL_ENABLED namespace MNN { -class MetalUnary : public Execution { +class MetalUnary : public MetalExecution { public: MetalUnary(Backend *backend, UnaryOpOperation optype); virtual ~MetalUnary() = default; - virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; private: UnaryOpOperation mOpType; diff --git a/source/backend/metal/MetalUnary.mm b/source/backend/metal/MetalUnary.mm index c722114b1..102976346 100755 --- a/source/backend/metal/MetalUnary.mm +++ b/source/backend/metal/MetalUnary.mm @@ -54,11 +54,11 @@ } } -MetalUnary::MetalUnary(Backend *backend, UnaryOpOperation optype) : Execution(backend), mOpType(optype) { +MetalUnary::MetalUnary(Backend *backend, UnaryOpOperation optype) : MetalExecution(backend), mOpType(optype) { auto mtbn = static_cast(backend); auto context = (__bridge MNNMetalContext *)mtbn->context(); mConstBuffer = [context newDeviceBuffer:3 * sizeof(int) access:CPUWriteOnly]; - mPipeline = [context pipelineWithName:kernelForType(mOpType)]; + mPipeline = [context pipelineWithName:kernelForType(mOpType) fp16:mtbn->useFp16InsteadFp32()]; } ErrorCode MetalUnary::onResize(const std::vector &inputs, const std::vector &outputs) { auto mtbn = static_cast(backend()); @@ -71,31 +71,13 @@ return NO_ERROR; } -ErrorCode MetalUnary::onExecute(const std::vector &inputs, const std::vector &outputs) { - auto backend = static_cast(this->backend()); - - if(backend->isCommandEncoderSet()) { - return NO_ERROR; - } - - auto func = [=](){ - auto input = inputs[0], output = outputs[0]; - auto encoder = backend->encoder(); - [encoder setComputePipelineState:mPipeline]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; - [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; - [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; - - auto context = (__bridge MNNMetalContext *)backend->context(); - if(backend->isCmdBufferCommit()) { - backend->flushEncoder(); - [context commit_net]; - } - }; - func(); - backend->addOpEncoder(func); - return NO_ERROR; +void MetalUnary::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { + auto input = inputs[0], output = outputs[0]; + [encoder setComputePipelineState:mPipeline]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; + [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; + [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; + [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; } class MetalUnaryCreator : public MetalBackend::Creator { diff --git a/source/backend/metal/ShaderMap.cpp b/source/backend/metal/ShaderMap.cpp index b67a2d342..03b92b58d 100644 --- a/source/backend/metal/ShaderMap.cpp +++ b/source/backend/metal/ShaderMap.cpp @@ -18,7 +18,6 @@ mMaps.insert(std::make_pair("shader_MetalScale_metal", shader_MetalScale_metal)) mMaps.insert(std::make_pair("shader_MetalDeconvolution_metal", shader_MetalDeconvolution_metal)); mMaps.insert(std::make_pair("shader_MetalPooling_metal", shader_MetalPooling_metal)); mMaps.insert(std::make_pair("shader_MetalROIPooling_metal", shader_MetalROIPooling_metal)); -mMaps.insert(std::make_pair("shader_MetalCast_metal", shader_MetalCast_metal)); mMaps.insert(std::make_pair("shader_MetalConvolution1x1_metal", shader_MetalConvolution1x1_metal)); mMaps.insert(std::make_pair("shader_MetalConvolutionGEMM_metal", shader_MetalConvolutionGEMM_metal)); mMaps.insert(std::make_pair("shader_MetalResize_metal", shader_MetalResize_metal)); diff --git a/source/backend/metal/makeshader.py b/source/backend/metal/makeshader.py index 0a0381afc..ef3ef9bb9 100755 --- a/source/backend/metal/makeshader.py +++ b/source/backend/metal/makeshader.py @@ -19,8 +19,11 @@ def getName(fileName): return s1 def generateFile(headfile, sourcefile, shaders): + lasthead = headfile.split('/') + lasthead = lasthead[len(lasthead)-1] + h = "#ifndef MNN_METAL_SHADER_AUTO_GENERATE_H\n#define MNN_METAL_SHADER_AUTO_GENERATE_H\n" - cpp = "#include \"AllShader.hpp\"\n" + cpp = "#include \"" + lasthead +"\"\n" mapcpp = "#include \"ShaderMap.hpp\"\n" mapcpp += '#include \"AllShader.hpp\"\n' mapcpp += 'namespace MNN {\n' @@ -38,6 +41,8 @@ def generateFile(headfile, sourcefile, shaders): continue if l.find('#include') >= 0: continue + if l.find('#pragma clang') >= 0: + continue if l.find('\\') >= 0: l = l.replace('\\', '') else: @@ -67,6 +72,10 @@ def generateFile(headfile, sourcefile, shaders): f.write(mapcpp) if __name__ == '__main__': - gDefaultPath = sys.argv[1]#"glsl" + renderPath = "render" + if os.path.isdir(renderPath): + shaders = findAllShader("render/shader") + generateFile(os.path.join(renderPath, "AllRenderShader.hpp"), os.path.join(renderPath, "AllRenderShader.cpp"), shaders) + gDefaultPath = "shader" shaders = findAllShader(gDefaultPath) generateFile(gOutputHeadFile, gOutputSourceFile, shaders); diff --git a/source/backend/metal/shader/MetalBackend.metal b/source/backend/metal/shader/MetalBackend.metal index b8eb85815..0b7e36c83 100644 --- a/source/backend/metal/shader/MetalBackend.metal +++ b/source/backend/metal/shader/MetalBackend.metal @@ -216,6 +216,17 @@ struct SamplerInfo { uint4 extent;//dstStride[3]+dstOffset uint4 imageSize; }; +struct MemsetInfo { + int4 value; + uint4 size; +}; +kernel void fill_intx4(device int4 *out [[buffer(0)]], + constant MemsetInfo &info [[buffer(1)]], + uint3 gid [[thread_position_in_grid]]) { + if (gid.x < info.size.x) { + out[gid.x] = info.value; + } +} kernel void blit_intx4(const device int4 *in [[buffer(0)]], device int4 *out [[buffer(1)]], diff --git a/source/backend/metal/shader/MetalCast.metal b/source/backend/metal/shader/MetalCast.metal deleted file mode 100644 index e1ed4cd29..000000000 --- a/source/backend/metal/shader/MetalCast.metal +++ /dev/null @@ -1,30 +0,0 @@ -using namespace metal; -kernel void cast_float_to_int32(const device ftype *in [[buffer(0)]], - device int *out [[buffer(1)]], - uint gid [[thread_position_in_grid]]) { - out[int(gid)] = int(in[int(gid)]); -} - -kernel void cast_int32_to_float(const device int *in [[buffer(0)]], - device ftype *out [[buffer(1)]], - uint gid [[thread_position_in_grid]]) { - out[int(gid)] = ftype(in[int(gid)]); -} - -kernel void cast_uint8_to_float(const device uchar *in [[buffer(0)]], - device ftype *out [[buffer(1)]], - uint gid [[thread_position_in_grid]]) { - out[int(gid)] = ftype(in[int(gid)]); -} - -kernel void cast_uint8_to_int(const device uchar *in [[buffer(0)]], - device int *out [[buffer(1)]], - uint gid [[thread_position_in_grid]]) { - out[int(gid)] = ftype(in[int(gid)]); -} - -kernel void cast_float_to_uint8(const device ftype *in [[buffer(0)]], - device uchar *out [[buffer(1)]], - uint gid [[thread_position_in_grid]]) { - out[int(gid)] = uchar(in[int(gid)]); -} diff --git a/source/backend/metal/shader/MetalConvolutionGEMM.metal b/source/backend/metal/shader/MetalConvolutionGEMM.metal index f08bb56e5..9d061815f 100644 --- a/source/backend/metal/shader/MetalConvolutionGEMM.metal +++ b/source/backend/metal/shader/MetalConvolutionGEMM.metal @@ -1,67 +1,3 @@ -struct conv_im2col_cst { - int input_width; - int input_height; - int input_size; - int input_slice; - int output_width; - int output_height; - int output_size; - int output_slice; - int batch; - - int kernel_x; - int kernel_y; - int kernel_size; - int stride_x; - int stride_y; - int pad_x; - int pad_y; - int dilation_x; - int dilation_y; - conv_activation_type activation; -}; - -kernel void conv_im2col(const device ftype4 *im [[buffer(0)]], - device ftype4 *cols [[buffer(1)]], - constant conv_im2col_cst& cst [[buffer(2)]], - uint3 gid [[thread_position_in_grid]]) { - auto z = gid.z % cst.input_slice; - auto b = gid.z / cst.input_slice; - if ((int)gid.x < cst.output_width && (int)gid.y < cst.output_height && (int)b < cst.batch) { - int offset_x = gid.x * cst.stride_x - cst.pad_x; - int offset_y = gid.y * cst.stride_y - cst.pad_y; - int index = b * cst.output_size + gid.y * cst.output_width + gid.x; - int cols_y = index / 4; - int cols_x = index % 4 + z * cst.kernel_size * 4; - - auto xy_cols = cols + cols_y * cst.kernel_size * cst.input_slice * 4 + cols_x; - auto xy_im = im + b * cst.input_size * cst.input_slice + z * cst.input_size; - for (int ky = 0, src_y = offset_y; ky < cst.kernel_y; ky++, src_y += cst.dilation_y) { - for (int kx = 0, src_x = offset_x; kx < cst.kernel_x; kx++, src_x += cst.dilation_x) { - auto pad = src_x < 0 || src_y < 0 || src_x >= cst.input_width || src_y >= cst.input_height; - xy_cols[(ky * cst.kernel_x + kx) * 4] = pad ? 0 : xy_im[src_y * cst.input_width + src_x]; - } - } - } -} - -kernel void conv_col2im(const device ftype4 *cols [[buffer(0)]], - device ftype4 *im [[buffer(1)]], - const device ftype4 *biasTerms [[buffer(2)]], - constant conv_im2col_cst& cst [[buffer(3)]], - uint3 gid [[thread_position_in_grid]]) { - auto z = gid.z % cst.output_slice; - auto b = gid.z / cst.output_slice; - if ((int)gid.x < cst.output_width && (int)gid.y < cst.output_height && (int)b < cst.batch) { - int index = b * cst.output_size + gid.y * cst.output_width + gid.x; - auto src_x = index / 4; - auto src_y = index % 4 + z * 4; - auto src_y_stride = UP_DIV(cst.output_size * cst.batch, 4); - - auto v = cols[(int)src_y * src_y_stride + (int)src_x] + biasTerms[(int)z]; - im[(int)gid.z * cst.output_size + (int)gid.y * cst.output_width + (int)gid.x] = activate(v, cst.activation); - } -} struct matmul4x4_const { int output_width; diff --git a/source/backend/metal/shader/MetalDefine.metal b/source/backend/metal/shader/MetalDefine.metal index a10d93eb3..c953acb57 100644 --- a/source/backend/metal/shader/MetalDefine.metal +++ b/source/backend/metal/shader/MetalDefine.metal @@ -8,9 +8,6 @@ using namespace metal; #define UP_DIV(x, y) ( ((x) + (y) - 1) / (y) ) #define ROUND_UP(x, y) ( ((x) + (y) - 1) / (y) * (y) ) -// whether store with float32 -#define MNN_METAL_FULL_PRECISION 0 // should edit in .h too - // whether computer with float32 when store with float16 #define MNN_METAL_FLOAT32_COMPUTER 1 // diff --git a/source/backend/opencl/CMakeLists.txt b/source/backend/opencl/CMakeLists.txt index 1dd579dc0..aac892701 100644 --- a/source/backend/opencl/CMakeLists.txt +++ b/source/backend/opencl/CMakeLists.txt @@ -19,6 +19,10 @@ IF (MNN_OPENCL_SIZE_CUT) add_definitions(-DMNN_OPENCL_BUFFER_CLOSED) ENDIF() +IF (MNN_LOW_MEMORY) + add_definitions(-DMNN_LOW_MEMORY) +ENDIF() + if (${CMAKE_SYSTEM_NAME} MATCHES "Android") add_definitions(-DMNN_USE_LIB_WRAPPER) add_definitions(-DMNN_OPENCL_SVM_ENABLE) @@ -36,6 +40,7 @@ else() endif() endif() IF(MNN_SEP_BUILD) + add_definitions(-DMNN_OPENCL_SEP_BUILD) if (MNN_BUILD_FOR_ANDROID_COMMAND) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "../../../") endif() diff --git a/source/backend/opencl/core/BufferConvertor.cpp b/source/backend/opencl/core/BufferConvertor.cpp index 68dac63c4..b92deb83e 100644 --- a/source/backend/opencl/core/BufferConvertor.cpp +++ b/source/backend/opencl/core/BufferConvertor.cpp @@ -309,7 +309,7 @@ bool convertNC4HW4OrNC16HW16BufferToNCHWOrNHWCBuffer(const Tensor *input, Tensor return true; } -bool BufferConvertor::convertToNC4HW4Buffer(const Tensor *buffer, const OpenCLBufferFormat type, Tensor *image, bool needTrans, bool needWait) { +bool BufferConvertor::convertToNC4HW4Buffer(const Tensor *buffer, const OpenCLBufferFormat type, Tensor *image, bool needTrans, bool needWait, bool lowMemory, int quantBit) { #ifdef LOG_VERBOSE MNN_PRINT("start convertBufferToNC4HW4Buffer !\n"); #endif @@ -323,7 +323,23 @@ bool BufferConvertor::convertToNC4HW4Buffer(const Tensor *buffer, const OpenCLBu std::string kernelName; switch (type) { case CONV2D_FILTER: - kernelName = "conv2d_filter_buffer_to_nc4hw4_buffer";//NC4HW4 (1, 4*ic/4, kw*kh*oc/4, 1)*4 +#ifdef MNN_LOW_MEMORY + if (lowMemory) { + if (quantBit != 8 && quantBit != 4) { + MNN_ERROR("For Opencl Backend, only support low memory mode of int8 or int4 dequantization currently.\n"); + MNN_ASSERT(false); + } + // shared part for all cases + if (quantBit == 8) { + kernelName = "conv2d_filter_buffer_to_nc4hw4_buffer_int8"; //NC4HW4 (1, 4*ic/4, kw*kh*oc/4, 1)*4 + } else if (quantBit == 4){ + kernelName = "conv2d_filter_buffer_to_nc4hw4_buffer_int4"; //NC4HW4 (1, 4*ic/4, kw*kh*oc/4, 1)*4 + } else {/* More types to be supported. */} + } else +#endif + { + kernelName = "conv2d_filter_buffer_to_nc4hw4_buffer";//NC4HW4 (1, 4*ic/4, kw*kh*oc/4, 1)*4 + } break; case DW_CONV2D_FILTER: kernelName = "dw_filter_buffer_to_nc4hw4_buffer";//NC4HW4 (1, kw*kh, oc/4, 1)*4 @@ -341,6 +357,17 @@ bool BufferConvertor::convertToNC4HW4Buffer(const Tensor *buffer, const OpenCLBu //buildOptions.emplace("-DBUFFER_FORMAT_INP_TRANS"); kernelName += "_floatin"; } +#ifdef MNN_LOW_MEMORY + if (lowMemory) { + if (quantBit == 8) { + // int8 case + buildOptions.emplace("-DUSE_LOW_BIT_WEIGHT_INT8"); + } else if (quantBit == 4){ + // int4 case + buildOptions.emplace("-DUSE_LOW_BIT_WEIGHT_INT4"); + } else {/* More types to be supported. */} + } +#endif mBufferToImageKernel = runtime->buildKernel("buffer_convert_buf", kernelName, buildOptions); } diff --git a/source/backend/opencl/core/BufferConvertor.hpp b/source/backend/opencl/core/BufferConvertor.hpp index 45c8c28de..a0067fc4f 100644 --- a/source/backend/opencl/core/BufferConvertor.hpp +++ b/source/backend/opencl/core/BufferConvertor.hpp @@ -40,7 +40,7 @@ class BufferConvertor { explicit BufferConvertor(OpenCLRuntime *opencl_runtime) : mOpenCLRuntime(opencl_runtime) { } bool convertToNC4HW4Buffer(const Tensor *input, const OpenCLBufferFormat type, Tensor *output, - bool needTrans, bool needWait = false); + bool needTrans, bool needWait = false, bool lowMemory = false, int quantBit = 0); private: OpenCLRuntime *mOpenCLRuntime; diff --git a/source/backend/opencl/core/BufferPool.cpp b/source/backend/opencl/core/BufferPool.cpp index 0e2fcddd4..e36d05199 100644 --- a/source/backend/opencl/core/BufferPool.cpp +++ b/source/backend/opencl/core/BufferPool.cpp @@ -20,6 +20,7 @@ cl::Buffer* BufferPool::alloc(int size, bool separate) { } std::shared_ptr node(new Node); cl_int ret = CL_SUCCESS; + mTotalSize += size; node->size = size; node->buffer.reset(new cl::Buffer(mContext, mFlag, size, NULL, &ret)); if (nullptr == node->buffer.get() || ret != CL_SUCCESS) { @@ -47,6 +48,7 @@ void BufferPool::recycle(cl::Buffer* buffer, bool release) { void BufferPool::clear() { mFreeList.clear(); mAllBuffer.clear(); + mTotalSize = 0; } void BufferPool::releaseFreeList() { diff --git a/source/backend/opencl/core/BufferPool.hpp b/source/backend/opencl/core/BufferPool.hpp index 4e20f5551..0dbc9b199 100644 --- a/source/backend/opencl/core/BufferPool.hpp +++ b/source/backend/opencl/core/BufferPool.hpp @@ -27,6 +27,7 @@ class BufferPool : public NonCopyable { void recycle(cl::Buffer* buffer, bool release = false); void clear(); void releaseFreeList(); + size_t totalSize() { return mTotalSize; } struct Node { int size; @@ -39,6 +40,7 @@ class BufferPool : public NonCopyable { cl::Context& mContext; cl_mem_flags mFlag; + size_t mTotalSize = 0; }; } // namespace OpenCL diff --git a/source/backend/opencl/core/ImageBufferConvertor.cpp b/source/backend/opencl/core/ImageBufferConvertor.cpp index fff0a5f8f..5a9d29df1 100644 --- a/source/backend/opencl/core/ImageBufferConvertor.cpp +++ b/source/backend/opencl/core/ImageBufferConvertor.cpp @@ -59,7 +59,7 @@ bool convertNCHWBufferToImage(const Tensor *input, Tensor *output, cl::Kernel &b } #ifdef ENABLE_OPENCL_TIME_PROFILER - runtime->pushEvent({"inputFormatTransform", event}); + runtime->pushEvent({"inputFormatTransform", event}); #endif return true; } @@ -414,7 +414,9 @@ bool ImageBufferConvertor::convertImageToBuffer(const Tensor *image, const OpenC cl::NDRange(lws[0], lws[1]), nullptr, &event); MNN_CHECK_CL_SUCCESS(res, "convertImageToBuffer"); - +#ifdef ENABLE_OPENCL_TIME_PROFILER + runtime->pushEvent({"convertBufferToImage", event}); +#endif if (needWait) { event.wait(); } @@ -521,7 +523,9 @@ bool ImageBufferConvertor::convertBufferToImage(const Tensor *buffer, const Open cl::NDRange(roundUpGroupWorkSize[0], roundUpGroupWorkSize[1]), cl::NDRange(lws[0], lws[1]), nullptr, &event); MNN_CHECK_CL_SUCCESS(res, "convertBufferToImage"); - +#ifdef ENABLE_OPENCL_TIME_PROFILER + runtime->pushEvent({"convertBufferToImage", event}); +#endif if (needWait) { event.wait(); } diff --git a/source/backend/opencl/core/OpenCLBackend.cpp b/source/backend/opencl/core/OpenCLBackend.cpp index 91a168d98..742a2edb7 100644 --- a/source/backend/opencl/core/OpenCLBackend.cpp +++ b/source/backend/opencl/core/OpenCLBackend.cpp @@ -17,18 +17,23 @@ #include #include "core/Macro.h" #include "runtime/OpenCLTuneInfo.hpp" - +//#define OPENCL_FALLBACK_LOG namespace MNN { namespace OpenCL { +#ifndef MNN_OPENCL_SEP_BUILD +void registerOpenCLOps(); +#endif CLRuntime::CLRuntime(const Backend::Info& info, int platformSize, int platformId, int deviceId){ mInfo = info; BackendConfig::PrecisionMode precision = BackendConfig::Precision_Normal; BackendConfig::PowerMode power = BackendConfig::Power_Normal; + BackendConfig::MemoryMode memory = BackendConfig::Memory_Normal; if (nullptr != mInfo.user) { precision = mInfo.user->precision; power = mInfo.user->power; + memory = mInfo.user->memory; } // Shader precision @@ -36,6 +41,7 @@ CLRuntime::CLRuntime(const Backend::Info& info, int platformSize, int platformId //Whether runtimeError mCLRuntimeError = mOpenCLRuntime->isCreateError(); mPrecision = precision; + mMemory = memory; mTunedInfo = new TuneInfo; mImagePool.reset(new ImagePool(mOpenCLRuntime->context())); @@ -231,6 +237,11 @@ void CLRuntime::onGabageCollect(int level) { mBufferPool->releaseFreeList(); } +float CLRuntime::onGetMemoryInMB() { + auto staticMemoryInMB = mBufferPool->totalSize() / 1024.0f / 1024.0f; + return staticMemoryInMB; +} + bool CLRuntime::isCLRuntimeError() { return mCLRuntimeError; } @@ -248,6 +259,7 @@ OpenCLBackend::OpenCLBackend(std::shared_ptrimgPool, std::shared_ptr< mCLRuntime = runtime; mOpenCLRuntime = mCLRuntime->mOpenCLRuntime; mPrecision = mCLRuntime->mPrecision; + mMemory = mCLRuntime->mMemory; mStaticImagePool = imgPool; mStaticBufferPool = bufPool; if(mOpenCLRuntime.get()){ @@ -259,12 +271,17 @@ OpenCLBackend::OpenCLBackend(std::shared_ptrimgPool, std::shared_ptr< mBufferPool.reset(new BufferPool(mOpenCLRuntime->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR)); } mMapMem = std::make_pair(0, nullptr); + mUseRecordQueue = mOpenCLRuntime->isSupportRecordQueue(); + mDevideOpRecord = mOpenCLRuntime->isDevideOpRecord(); + mUseRecordableQueueSize = mOpenCLRuntime->getUseRecordableQueueSize(); } OpenCLBackend::~OpenCLBackend() { #ifdef LOG_VERBOSE MNN_PRINT("enter OpenCLBackend::~OpenCLBackend \n"); #endif + releaseRecord(); + mRecordings.clear(); mImagePool = nullptr; mBufferPool = nullptr; if(mMapMem.second != nullptr) { @@ -370,8 +387,23 @@ Backend::MemObj* OpenCLBackend::onAcquire(const Tensor* nativeTensor, StorageTyp return new CLMemReleaseBuffer(buffer, mBufferPool.get()); } MNN_ASSERT(storageType == STATIC); +#ifdef MNN_LOW_MEMORY + // for weight quant model's weight + if ((nativeTensor->getType().code == halide_type_int) && + (nativeTensor->getType().bits == 8 || nativeTensor->getType().bits == 4)) { + // int8 quant + size_t alloc_size = size; + if (nativeTensor->getType().bits == 4) { + // int4 quant + alloc_size = size / 2; + } + auto buffer = mStaticBufferPool->alloc(alloc_size); + ((Tensor*)nativeTensor)->buffer().device = (uint64_t)buffer; + return new CLMemReleaseBuffer(buffer, mStaticBufferPool.get()); + } +#endif auto buffer = mStaticBufferPool->alloc(size* - (dataType==CL_HALF_FLOAT?sizeof(half_float::half):sizeof(float))); + (dataType == CL_HALF_FLOAT ? sizeof(half_float::half) : sizeof(float))); ((Tensor*)nativeTensor)->buffer().device = (uint64_t)buffer; // fix return new CLMemReleaseBuffer(buffer, mStaticBufferPool.get()); } @@ -430,14 +462,14 @@ Execution* OpenCLBackend::onCreate(const std::vector& inputs, const std auto creators = gCreator(); auto iter = creators->find(std::make_pair(op->type(), mOpenCLRuntime->getGpuMemType())); if (0 != inputs.size() && (getDataType(inputs[0]) == DataType_DT_INT8 || inputs[0]->getType().bytes() == 1)) { - #if 0//close log + #ifdef OPENCL_FALLBACK_LOG MNN_PRINT("Don't support type %s for int8 input\n", EnumNameOpType(op->type())); #endif return NULL; } if (iter == creators->end()) { - mOpenCLRuntime->setDevideOpRecord(); - #if 0//close log + mDevideOpRecord = true; + #ifdef OPENCL_FALLBACK_LOG if (nullptr != op->name()) { MNN_PRINT("Don't support type %s memObject:%d, %s\n", EnumNameOpType(op->type()), mOpenCLRuntime->getGpuMemType(), op->name()->c_str()); } else { @@ -470,8 +502,8 @@ Execution* OpenCLBackend::onCreate(const std::vector& inputs, const std } if (!valid) { - mOpenCLRuntime->setDevideOpRecord(); - #if 0//close log + mDevideOpRecord = true; + #ifdef OPENCL_FALLBACK_LOG for (auto t : inputs) { auto tensorShape = OpenCL::tensorShapeFormat(t); MNN_PRINT("input n:%d, h:%d, w:%d, c:%d\n", tensorShape[0], tensorShape[1], tensorShape[2], tensorShape[3]); @@ -488,8 +520,8 @@ Execution* OpenCLBackend::onCreate(const std::vector& inputs, const std auto exe = iter->second->onCreate(inputs, outputs, op, this); if (NULL == exe) { - mOpenCLRuntime->setDevideOpRecord(); - #if 0//close log + mDevideOpRecord = true; + #ifdef OPENCL_FALLBACK_LOG if (nullptr != op->name()) { MNN_PRINT("The Creator Don't support type %s, memObject:%d, %s\n", MNN::EnumNameOpType(op->type()), mOpenCLRuntime->getGpuMemType(), op->name()->c_str()); } else { @@ -508,27 +540,29 @@ void OpenCLBackend::onResizeBegin() { #ifndef ENABLE_OPENCL_TIME_PROFILER mOpenCLRuntime->setCommandQueueProfileEnable(); #endif - mOpenCLRuntime->releaseRecord(); + releaseRecord(); } ErrorCode OpenCLBackend::onResizeEnd() { #ifndef ENABLE_OPENCL_TIME_PROFILER mOpenCLRuntime->setCommandQueueProfileDisable(); #endif - mOpenCLRuntime->endRecord(); + if(!mRecordings.empty()){ + endRecord(mRecordings.back(), true); + } return NO_ERROR; } void OpenCLBackend::onExecuteBegin() const { mOpenCLRuntime->mQueueCount = 0; - mOpenCLRuntime->clearRecord(); - mOpenCLRuntime->clearEvent(); + clearRecord(); + mOpenCLRuntime->clearEvent(); } void OpenCLBackend::onExecuteEnd() const { mOpenCLRuntime->mQueueCount = 0; - mOpenCLRuntime->clearRecord(); - mOpenCLRuntime->enqeueRecord(); + clearRecord(); + enqeueRecord(); mOpenCLRuntime->printEventTime(); } @@ -703,7 +737,6 @@ void OpenCLBackend::copyFromDevice(const Tensor* srcTensor, const Tensor* dstTen MNN_DATA_FORMAT data_format = TensorUtils::getDescribe(dstTensor)->dimensionFormat; - mOpenCLRuntime->clearRecord(); //Convert format mCLRuntime->convertFromDevice(srcTensor, (const Tensor*)&interTensor, data_format, false); mOpenCLRuntime->printEventTime(); @@ -868,7 +901,6 @@ void OpenCLBackend::copyToDevice(const Tensor* srcTensor, const Tensor* dstTenso mOpenCLRuntime->commandQueue().enqueueWriteBuffer(*mHostBuffer.second, CL_TRUE, 0, srcTensor->elementSize()*sizeof(float), hostPtr); } #else - mOpenCLRuntime->clearRecord(); mOpenCLRuntime->commandQueue().enqueueWriteBuffer(*mHostBuffer.second, CL_TRUE, 0, srcTensor->elementSize()*sizeof(float), hostPtr); #endif @@ -887,7 +919,6 @@ void OpenCLBackend::copyToDevice(const Tensor* srcTensor, const Tensor* dstTenso } void CLRuntime::copyBetweenDevice(const Tensor* srcTensor, const Tensor* dstTensor) const{ - mOpenCLRuntime->clearRecord(); #ifndef MNN_OPENCL_BUFFER_CLOSED if(mOpenCLRuntime->getGpuMemType() == BUFFER) { @@ -912,6 +943,7 @@ void OpenCLBackend::onCopyBuffer(const Tensor* srcTensor, const Tensor* dstTenso #ifdef LOG_VERBOSE MNN_PRINT("Start onCopyBuffer !\n"); #endif + clearRecord(); auto srcDevice = (srcTensor->deviceId() != 0 && srcTensor->deviceId() != 1); auto dstDevice = (dstTensor->deviceId() != 0 && dstTensor->deviceId() != 1); if (!srcDevice && dstDevice) { @@ -968,7 +1000,7 @@ void* OpenCLBackend::allocMapTensorMemory(int length, bool svmFlag, cl_device_sv void* OpenCLBackend::onMapTensor(Tensor::MapType mtype, Tensor::DimensionType dtype, const Tensor* srcTensor) { auto needSize = srcTensor->size(); - mOpenCLRuntime->clearRecord(); + clearRecord(); #ifdef MNN_OPENCL_SVM_ENABLE auto svm_cap_ = mOpenCLRuntime->getSvmCapabilities(); bool use_svm = (svm_cap_ & CL_DEVICE_SVM_FINE_GRAIN_BUFFER);//support fine grain svm @@ -1120,14 +1152,6 @@ class CLRuntimeCreator : public RuntimeCreator { } }; -bool placeholder = []() { - static std::once_flag createOnce; - std::call_once(createOnce, []() { - MNNInsertExtraRuntimeCreator(MNN_FORWARD_OPENCL, new CLRuntimeCreator, false); - }); - return true; -}(); - DataType OpenCLBackend::getDataType(const Tensor* tensor) { auto des = TensorUtils::getDescribe(tensor); if (nullptr == des->quantAttr.get()) { @@ -1136,5 +1160,209 @@ DataType OpenCLBackend::getDataType(const Tensor* tensor) { return des->type; } +cl_channel_type OpenCLBackend::fpType() { + if (getOpenCLRuntime()->isSupportedFP16() && + mPrecision != BackendConfig::Precision_High) { + return CL_HALF_FLOAT; + } + return CL_FLOAT; +} + +int OpenCLBackend::fpBytes() { + return (fpType() == CL_FLOAT ? sizeof(float) : sizeof(half_float::half)); +} + +void OpenCLBackend::clearRecord() const{ +#if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) + if(mUseRecordQueue && mDevideOpRecord){ + for(int i = 0; i < mRecordings.size(); ++i){ + cl_int res = mOpenCLRuntime->commandQueue().EnqueueRecordingQCOM(mRecordings[i], 0, nullptr, 0, nullptr, + 0, nullptr, 0, nullptr, 0, nullptr, nullptr); + MNN_CHECK_CL_SUCCESS(res, "EnqueueRecordingQCOM"); + } + mOpenCLRuntime->commandQueue().finish(); + mRecordings.clear(); + } +#endif +} + +void OpenCLBackend::enqeueRecord() const{ +#if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) + if(mUseRecordQueue && !mDevideOpRecord){ + for(int i = 0; i < mRecordings.size(); ++i){ + cl_int res = mOpenCLRuntime->commandQueue().EnqueueRecordingQCOM(mRecordings[i], 0, nullptr, 0, nullptr, + 0, nullptr, 0, nullptr, 0, nullptr, nullptr); + MNN_CHECK_CL_SUCCESS(res, "EnqueueRecordingQCOM"); + } + mOpenCLRuntime->commandQueue().finish(); + } +#endif +} + +void OpenCLBackend::releaseRecord(){ +#if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) + if(mUseRecordQueue && !mDevideOpRecord){ + for(int i = 0; i < mRecordings.size(); ++i){ + cl_int res = clReleaseRecordingQCOM(mRecordings[i]); + MNN_CHECK_CL_SUCCESS(res, "clReleaseRecordingQCOM"); + } + mRecordings.clear(); + } +#endif +} + +void OpenCLBackend::startRecord(cl_recording_qcom &recording){ +#if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) + if(!mUseRecordQueue){ + return; + } +#ifdef LOG_VERBOSE + MNN_PRINT("start startRecord !\n"); +#endif + cl_int res = CL_SUCCESS; + if(mDevideOpRecord){ + if(recording != NULL){ + clReleaseRecordingQCOM(recording); + } + recording = mOpenCLRuntime->recordableQueue().NewRecordingQCOM(&res); + MNN_CHECK_CL_SUCCESS(res, "clNewRecordingQCOM"); + } +#ifdef LOG_VERBOSE + MNN_PRINT("end startRecord !\n"); +#endif +#endif //ENABLE_OPENCL_TIME_PROFILER +} + +void OpenCLBackend::endRecord(cl_recording_qcom &recording, bool flag){ +#if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) + if(!mUseRecordQueue){ + return; + } +#ifdef LOG_VERBOSE + MNN_PRINT("start endRecord !\n"); +#endif + if(mDevideOpRecord){ + cl_int res = CL_SUCCESS; + res = clEndRecordingQCOM(recording); + MNN_CHECK_CL_SUCCESS(res, "clEndRecordingQCOM"); + } else if(flag) { + if(!mRecordings.empty()){ + cl_int res = clEndRecordingQCOM(mRecordings.back()); + mRecordNums = 0; + MNN_CHECK_CL_SUCCESS(res, "clEndRecordingQCOM"); + } + } +#ifdef LOG_VERBOSE + MNN_PRINT("end endRecord !\n"); +#endif +#endif //ENABLE_OPENCL_TIME_PROFILER +} + +void OpenCLBackend::recordKernel2d(const ::cl::Kernel &kernel, const std::vector &gws, const std::vector &lws) { +#if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) + if(!mUseRecordQueue){ + return; + } +#ifdef LOG_VERBOSE + MNN_PRINT("start record2dKernel !\n"); +#endif + cl_int res = CL_SUCCESS; + if(!mDevideOpRecord){ + if(mRecordNums == 0){ + cl_recording_qcom recording = mOpenCLRuntime->recordableQueue().NewRecordingQCOM(&res); + MNN_CHECK_CL_SUCCESS(res, "clNewRecordingQCOM"); + mRecordings.emplace_back(recording); + }else if(mRecordNums == mUseRecordableQueueSize){ + res = clEndRecordingQCOM(mRecordings.back()); + MNN_CHECK_CL_SUCCESS(res, "clEndRecordingQCOM"); + cl_recording_qcom recording = mOpenCLRuntime->recordableQueue().NewRecordingQCOM(&res); + MNN_CHECK_CL_SUCCESS(res, "clNewRecordingQCOM"); + mRecordings.emplace_back(recording); + mRecordNums = 0; + } + mRecordNums++; + } + + std::vector internalGlobalWS = gws; + for (size_t i = 0; i < 2; ++i) { + internalGlobalWS[i] = ROUND_UP(gws[i], std::max((uint32_t)1, lws[i])); + } + + if(lws[0]==0 || lws[1]==0){ + res = mOpenCLRuntime->recordableQueue().enqueueNDRangeKernel( + kernel, cl::NullRange, cl::NDRange(internalGlobalWS[0], internalGlobalWS[1]), cl::NullRange, nullptr, nullptr); + + }else{ + res = mOpenCLRuntime->recordableQueue().enqueueNDRangeKernel( + kernel, cl::NullRange, cl::NDRange(internalGlobalWS[0], internalGlobalWS[1]), cl::NDRange(lws[0], lws[1]), nullptr, nullptr); + } + MNN_CHECK_CL_SUCCESS(res, "recordKernel2d"); + +#ifdef LOG_VERBOSE + MNN_PRINT("end record2dKernel !\n"); +#endif +#endif //ENABLE_OPENCL_TIME_PROFILER +} + +void OpenCLBackend::recordKernel3d(const ::cl::Kernel &kernel, const std::vector &gws, const std::vector &lws) { +#if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) + if(!mUseRecordQueue){ + return; + } +#ifdef LOG_VERBOSE + MNN_PRINT("start record3dKernel !\n"); +#endif + cl_int res = CL_SUCCESS; + std::vector internalGlobalWS = gws; + for (size_t i = 0; i < 3; ++i) { + internalGlobalWS[i] = ROUND_UP(gws[i], std::max((uint32_t)1, lws[i])); + } + if(!mDevideOpRecord){ + if(mRecordNums == 0){ + cl_recording_qcom recording = mOpenCLRuntime->recordableQueue().NewRecordingQCOM(&res); + MNN_CHECK_CL_SUCCESS(res, "clNewRecordingQCOM"); + mRecordings.emplace_back(recording); + }else if(mRecordNums == mUseRecordableQueueSize){ + res = clEndRecordingQCOM(mRecordings.back()); + MNN_CHECK_CL_SUCCESS(res, "clEndRecordingQCOM"); + cl_recording_qcom recording = mOpenCLRuntime->recordableQueue().NewRecordingQCOM(&res); + MNN_CHECK_CL_SUCCESS(res, "clNewRecordingQCOM"); + mRecordings.emplace_back(recording); + mRecordNums = 0; + } + mRecordNums++; + } + + if(lws[0]==0 || lws[1]==0 || lws[2]==0){ + res = mOpenCLRuntime->recordableQueue().enqueueNDRangeKernel( + kernel, cl::NullRange, cl::NDRange(internalGlobalWS[0], internalGlobalWS[1], internalGlobalWS[2]), cl::NullRange, nullptr, nullptr); + + }else{ + res = mOpenCLRuntime->recordableQueue().enqueueNDRangeKernel( + kernel, cl::NullRange, cl::NDRange(internalGlobalWS[0], internalGlobalWS[1], internalGlobalWS[2]), cl::NDRange(lws[0], lws[1], lws[2]), nullptr, nullptr); + } + MNN_CHECK_CL_SUCCESS(res, "recordKernel3d"); + +#ifdef LOG_VERBOSE + MNN_PRINT("end record3dKernel !\n"); +#endif +#endif //ENABLE_OPENCL_TIME_PROFILER +} + +#ifdef MNN_OPENCL_SEP_BUILD +bool placeholder = []() { + static std::once_flag createOnce; + std::call_once(createOnce, []() { + MNNInsertExtraRuntimeCreator(MNN_FORWARD_OPENCL, new CLRuntimeCreator, false); + }); + return true; +}(); +#else +void registerOpenCLRuntimeCreator() { + registerOpenCLOps(); + MNNInsertExtraRuntimeCreator(MNN_FORWARD_OPENCL, new CLRuntimeCreator, false); +} +#endif } // namespace OpenCL + } // namespace MNN diff --git a/source/backend/opencl/core/OpenCLBackend.hpp b/source/backend/opencl/core/OpenCLBackend.hpp index c20795b8d..f254d5a97 100644 --- a/source/backend/opencl/core/OpenCLBackend.hpp +++ b/source/backend/opencl/core/OpenCLBackend.hpp @@ -41,6 +41,7 @@ class CLRuntime : public Runtime { virtual Backend* onCreate(const BackendConfig* config) const override; virtual void onGabageCollect(int level) override; + virtual float onGetMemoryInMB() override; virtual std::pair onGetCache() override; virtual bool onSetCache(const void* buffer, size_t size) override; bool isCLRuntimeError(); @@ -59,6 +60,7 @@ class CLRuntime : public Runtime { std::shared_ptr mImagePool; std::shared_ptr mBufferPool; BackendConfig::PrecisionMode mPrecision; + BackendConfig::MemoryMode mMemory; bool mCLRuntimeError = false; friend class OpenCLBackend; @@ -127,9 +129,33 @@ class OpenCLBackend : public Backend { BackendConfig::PrecisionMode getPrecision() const { return mPrecision; } + + BackendConfig::MemoryMode getMemory() const { + return mMemory; + } DataType getDataType(const Tensor* tensor); + cl_channel_type fpType(); + int fpBytes(); + + void clearRecord() const; + void enqeueRecord() const; + void releaseRecord(); + bool isUseRecordQueue(){ + return mUseRecordQueue; + } + bool isDevideOpRecord(){ + return mDevideOpRecord; + } + void addRecord(cl_recording_qcom &record){ + mRecordings.emplace_back(record); + } + void recordKernel2d(const ::cl::Kernel &kernel, const std::vector &gws, const std::vector &lws); + void recordKernel3d(const ::cl::Kernel &kernel, const std::vector &gws, const std::vector &lws); + void startRecord(cl_recording_qcom &recording); + void endRecord(cl_recording_qcom &recording, bool flag = false); + bool isCreateError() const; virtual void* onMapTensor(Tensor::MapType mtype, Tensor::DimensionType dtype, const Tensor* srcTensor) override; virtual bool onUnmapTensor(Tensor::MapType mtype, Tensor::DimensionType dtype, const Tensor* dstTensor, void* mapPtr) override; @@ -153,8 +179,13 @@ class OpenCLBackend : public Backend { mutable std::pair> mHostBuffer; BackendConfig::PrecisionMode mPrecision; + BackendConfig::MemoryMode mMemory; bool mIsCreateError{false}; - + mutable std::vector mRecordings; + bool mUseRecordQueue = false; + bool mDevideOpRecord = false; + uint32_t mRecordNums = 0; + uint32_t mUseRecordableQueueSize; private: void* svmPtr = nullptr; @@ -174,6 +205,18 @@ class OpenCLCreatorRegister { ~OpenCLCreatorRegister() = default; }; +#ifdef MNN_OPENCL_SEP_BUILD +#define REGISTER_OPENCL_OP_CREATOR(name, opType, memObj) \ + OpenCLCreatorRegister ___OpenCL##name##__##opType##__##memObj##__(opType, memObj) +#else +#define REGISTER_OPENCL_OP_CREATOR(name, opType, memObj) \ + void ___OpenCL##name##__##opType##__##memObj##__() { \ + static name _temp; \ + OpenCLBackend::addCreator(std::make_pair(opType, memObj), &_temp); \ + } +#endif + + template class TypedCreator : public OpenCLBackend::Creator { public: diff --git a/source/backend/opencl/core/OpenCLOPRegister.cpp b/source/backend/opencl/core/OpenCLOPRegister.cpp new file mode 100644 index 000000000..9af375e4c --- /dev/null +++ b/source/backend/opencl/core/OpenCLOPRegister.cpp @@ -0,0 +1,123 @@ +// This file is generated by Shell for ops register +#ifndef MNN_OPENCL_SEP_BUILD + +namespace MNN { +namespace OpenCL { +extern void ___OpenCLArgMaxBufCreator__OpType_ArgMax__BUFFER__(); +extern void ___OpenCLArgMaxBufCreator__OpType_ArgMin__BUFFER__(); +extern void ___OpenCLScaleCreator__OpType_Scale__IMAGE__(); +extern void ___OpenCLScaleBufCreator__OpType_Scale__BUFFER__(); +extern void ___OpenCLSelectBufCreator__OpType_Select__BUFFER__(); +extern void ___OpenCLSoftmaxCreator__OpType_Softmax__IMAGE__(); +extern void ___OpenCLSoftmaxBufCreator__OpType_Softmax__BUFFER__(); +extern void ___OpenCLCastBufCreator__OpType_Cast__BUFFER__(); +extern void ___OpenCLInterpCreator__OpType_Interp__IMAGE__(); +extern void ___OpenCLInterpBufCreator__OpType_Interp__BUFFER__(); +extern void ___OpenCLGridSampleCreator__OpType_GridSample__IMAGE__(); +extern void ___OpenCLGridSampleBufCreator__OpType_GridSample__BUFFER__(); +extern void ___OpenCLMatMulCreator__OpType_MatMul__IMAGE__(); +extern void ___OpenCLMatMulBufCreator__OpType_MatMul__BUFFER__(); +extern void ___OpenCLDeconvolutionCreator__OpType_Deconvolution__IMAGE__(); +extern void ___OpenCLDeconvolutionBufCreator__OpType_Deconvolution__BUFFER__(); +extern void ___OpenCLEltwiseCreator__OpType_BinaryOp__IMAGE__(); +extern void ___OpenCLBinaryBufCreator__OpType_BinaryOp__BUFFER__(); +extern void ___OpenCLEltwiseCreator__OpType_Eltwise__IMAGE__(); +extern void ___OpenCLBinaryBufCreator__OpType_Eltwise__BUFFER__(); +extern void ___OpenCLPoolCreator__OpType_Pooling__IMAGE__(); +extern void ___OpenCLPoolBufCreator__OpType_Pooling__BUFFER__(); +extern void ___OpenCLRoiPoolingCreator__OpType_ROIPooling__IMAGE__(); +extern void ___OpenCLUnaryCreator__OpType_UnaryOp__IMAGE__(); +extern void ___OpenCLUnaryCreator__OpType_Sigmoid__IMAGE__(); +extern void ___OpenCLUnaryCreator__OpType_TanH__IMAGE__(); +extern void ___OpenCLUnaryBufCreator__OpType_UnaryOp__BUFFER__(); +extern void ___OpenCLUnaryBufCreator__OpType_Sigmoid__BUFFER__(); +extern void ___OpenCLUnaryBufCreator__OpType_TanH__BUFFER__(); +extern void ___OpenCLReductionCreator__OpType_Reduction__IMAGE__(); +extern void ___OpenCLReductionBufCreator__OpType_Reduction__BUFFER__(); +extern void ___OpenCLReluCreator__OpType_ReLU__IMAGE__(); +extern void ___OpenCLReluCreator__OpType_PReLU__IMAGE__(); +extern void ___OpenCLReluCreator__OpType_ReLU6__IMAGE__(); +extern void ___OpenCLReluBufCreator__OpType_ReLU__BUFFER__(); +extern void ___OpenCLReluBufCreator__OpType_PReLU__BUFFER__(); +extern void ___OpenCLReluBufCreator__OpType_ReLU6__BUFFER__(); +extern void ___OpenCLDepthwiseDeconvolutionCreator__OpType_DeconvolutionDepthwise__IMAGE__(); +extern void ___OpenCLRasterCreator__OpType_Raster__IMAGE__(); +extern void ___OpenCLRasterBufCreator__OpType_Raster__BUFFER__(); +extern void ___OpenCLDepthwiseConvolutionCreator__OpType_ConvolutionDepthwise__IMAGE__(); +extern void ___OpenCLDepthwiseConvolutionBufCreator__OpType_ConvolutionDepthwise__BUFFER__(); +extern void ___OpenCLRangeBufCreator__OpType_Range__BUFFER__(); +extern void ___OpenCLInterp3DCreator__OpType_Interp3D__IMAGE__(); +extern void ___OpenCLInterp3DBufCreator__OpType_Interp3D__BUFFER__(); +extern void ___OpenCLConvolutionCreator__OpType_Convolution__IMAGE__(); +extern void ___OpenCLConvolutionBufCreator__OpType_Convolution__BUFFER__(); +extern void ___OpenCLLayerNormCreator__OpType_LayerNorm__IMAGE__(); +extern void ___OpenCLLayerNormBufCreator__OpType_LayerNorm__BUFFER__(); +extern void ___OpenCLLoopCreator__OpType_While__IMAGE__(); +extern void ___OpenCLLoopBufCreator__OpType_While__BUFFER__(); +extern void ___OpenCLTrainableParamCreator__OpType_TrainableParam__IMAGE__(); +extern void ___OpenCLFuseCreator__OpType_Extra__IMAGE__(); +extern void ___OpenCLRangeCreator__OpType_Range__IMAGE__(); +extern void ___OpenCLCastCreator__OpType_Cast__IMAGE__(); +extern void ___OpenCLSelectCreator__OpType_Select__IMAGE__(); + +void registerOpenCLOps() { + ___OpenCLArgMaxBufCreator__OpType_ArgMax__BUFFER__(); + ___OpenCLArgMaxBufCreator__OpType_ArgMin__BUFFER__(); + ___OpenCLScaleCreator__OpType_Scale__IMAGE__(); + ___OpenCLScaleBufCreator__OpType_Scale__BUFFER__(); + ___OpenCLSelectBufCreator__OpType_Select__BUFFER__(); + ___OpenCLSoftmaxCreator__OpType_Softmax__IMAGE__(); + ___OpenCLSoftmaxBufCreator__OpType_Softmax__BUFFER__(); + ___OpenCLCastBufCreator__OpType_Cast__BUFFER__(); + ___OpenCLInterpCreator__OpType_Interp__IMAGE__(); + ___OpenCLInterpBufCreator__OpType_Interp__BUFFER__(); + ___OpenCLGridSampleCreator__OpType_GridSample__IMAGE__(); + ___OpenCLGridSampleBufCreator__OpType_GridSample__BUFFER__(); + ___OpenCLMatMulCreator__OpType_MatMul__IMAGE__(); + ___OpenCLMatMulBufCreator__OpType_MatMul__BUFFER__(); + ___OpenCLDeconvolutionCreator__OpType_Deconvolution__IMAGE__(); + ___OpenCLDeconvolutionBufCreator__OpType_Deconvolution__BUFFER__(); + ___OpenCLEltwiseCreator__OpType_BinaryOp__IMAGE__(); + ___OpenCLBinaryBufCreator__OpType_BinaryOp__BUFFER__(); + ___OpenCLEltwiseCreator__OpType_Eltwise__IMAGE__(); + ___OpenCLBinaryBufCreator__OpType_Eltwise__BUFFER__(); + ___OpenCLPoolCreator__OpType_Pooling__IMAGE__(); + ___OpenCLPoolBufCreator__OpType_Pooling__BUFFER__(); + ___OpenCLRoiPoolingCreator__OpType_ROIPooling__IMAGE__(); + ___OpenCLUnaryCreator__OpType_UnaryOp__IMAGE__(); + ___OpenCLUnaryCreator__OpType_Sigmoid__IMAGE__(); + ___OpenCLUnaryCreator__OpType_TanH__IMAGE__(); + ___OpenCLUnaryBufCreator__OpType_UnaryOp__BUFFER__(); + ___OpenCLUnaryBufCreator__OpType_Sigmoid__BUFFER__(); + ___OpenCLUnaryBufCreator__OpType_TanH__BUFFER__(); + ___OpenCLReductionCreator__OpType_Reduction__IMAGE__(); + ___OpenCLReductionBufCreator__OpType_Reduction__BUFFER__(); + ___OpenCLReluCreator__OpType_ReLU__IMAGE__(); + ___OpenCLReluCreator__OpType_PReLU__IMAGE__(); + ___OpenCLReluCreator__OpType_ReLU6__IMAGE__(); + ___OpenCLReluBufCreator__OpType_ReLU__BUFFER__(); + ___OpenCLReluBufCreator__OpType_PReLU__BUFFER__(); + ___OpenCLReluBufCreator__OpType_ReLU6__BUFFER__(); + ___OpenCLDepthwiseDeconvolutionCreator__OpType_DeconvolutionDepthwise__IMAGE__(); + ___OpenCLRasterCreator__OpType_Raster__IMAGE__(); + ___OpenCLRasterBufCreator__OpType_Raster__BUFFER__(); + ___OpenCLDepthwiseConvolutionCreator__OpType_ConvolutionDepthwise__IMAGE__(); + ___OpenCLDepthwiseConvolutionBufCreator__OpType_ConvolutionDepthwise__BUFFER__(); + ___OpenCLRangeBufCreator__OpType_Range__BUFFER__(); + ___OpenCLInterp3DCreator__OpType_Interp3D__IMAGE__(); + ___OpenCLInterp3DBufCreator__OpType_Interp3D__BUFFER__(); + ___OpenCLConvolutionCreator__OpType_Convolution__IMAGE__(); + ___OpenCLConvolutionBufCreator__OpType_Convolution__BUFFER__(); + ___OpenCLLayerNormCreator__OpType_LayerNorm__IMAGE__(); + ___OpenCLLayerNormBufCreator__OpType_LayerNorm__BUFFER__(); + ___OpenCLLoopCreator__OpType_While__IMAGE__(); + ___OpenCLLoopBufCreator__OpType_While__BUFFER__(); + ___OpenCLTrainableParamCreator__OpType_TrainableParam__IMAGE__(); + ___OpenCLFuseCreator__OpType_Extra__IMAGE__(); + ___OpenCLRangeCreator__OpType_Range__IMAGE__(); + ___OpenCLCastCreator__OpType_Cast__IMAGE__(); + ___OpenCLSelectCreator__OpType_Select__IMAGE__(); +} +} +} +#endif diff --git a/source/backend/opencl/core/OpenCLRunningUtils.cpp b/source/backend/opencl/core/OpenCLRunningUtils.cpp index 83381221b..55bb5417d 100644 --- a/source/backend/opencl/core/OpenCLRunningUtils.cpp +++ b/source/backend/opencl/core/OpenCLRunningUtils.cpp @@ -570,146 +570,6 @@ void copyBufferToImage(OpenCLRuntime *runtime, const cl::Buffer &buffer, const c comandQueue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(w, h, 1)); } -void startRecord(OpenCLRuntime *runtime, cl_recording_qcom &recording){ -#if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) - if(!runtime->isUseRecordQueue()){ - return; - } -#ifdef LOG_VERBOSE - MNN_PRINT("start startRecord !\n"); -#endif - cl_int res = CL_SUCCESS; - if(runtime->isDevideOpRecord()){ - if(recording != NULL){ - clReleaseRecordingQCOM(recording); - } - recording = runtime->recordableQueue().NewRecordingQCOM(&res); - MNN_CHECK_CL_SUCCESS(res, "clNewRecordingQCOM"); - } -#ifdef LOG_VERBOSE - MNN_PRINT("end startRecord !\n"); -#endif -#endif //ENABLE_OPENCL_TIME_PROFILER -} - -void endRecord(OpenCLRuntime *runtime, cl_recording_qcom &recording){ -#if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) - if(!runtime->isUseRecordQueue()){ - return; - } -#ifdef LOG_VERBOSE - MNN_PRINT("start endRecord !\n"); -#endif - if(runtime->isDevideOpRecord()){ - cl_int res = CL_SUCCESS; - res = clEndRecordingQCOM(recording); - MNN_CHECK_CL_SUCCESS(res, "clEndRecordingQCOM"); - } -#ifdef LOG_VERBOSE - MNN_PRINT("end endRecord !\n"); -#endif -#endif //ENABLE_OPENCL_TIME_PROFILER -} - -void recordKernel2d(const ::cl::Kernel &kernel, const std::vector &gws, const std::vector &lws, - OpenCLRuntime *runtime) { -#if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) - if(!runtime->isUseRecordQueue()){ - return; - } -#ifdef LOG_VERBOSE - MNN_PRINT("start recordKernel !\n"); -#endif - cl_int res = CL_SUCCESS; - if(!runtime->isDevideOpRecord()){ - auto RecordNum = runtime->getRecordNum(); - auto maxRecordNum = runtime->getUseRecordableQueueSize(); - if(RecordNum == 0){ - cl_recording_qcom recording = runtime->recordableQueue().NewRecordingQCOM(&res); - MNN_CHECK_CL_SUCCESS(res, "clNewRecordingQCOM"); - runtime->getRecordings()->emplace_back(recording); - }else if(RecordNum == maxRecordNum){ - res = clEndRecordingQCOM( runtime->getRecordings()->back()); - MNN_CHECK_CL_SUCCESS(res, "clEndRecordingQCOM"); - cl_recording_qcom recording = runtime->recordableQueue().NewRecordingQCOM(&res); - MNN_CHECK_CL_SUCCESS(res, "clNewRecordingQCOM"); - runtime->getRecordings()->emplace_back(recording); - RecordNum = 0; - } - RecordNum++; - runtime->setRecordNum(RecordNum); - } - - std::vector internalGlobalWS = gws; - for (size_t i = 0; i < 2; ++i) { - internalGlobalWS[i] = ROUND_UP(gws[i], std::max((uint32_t)1, lws[i])); - } - - if(lws[0]==0 || lws[1]==0){ - res = runtime->recordableQueue().enqueueNDRangeKernel( - kernel, cl::NullRange, cl::NDRange(internalGlobalWS[0], internalGlobalWS[1]), cl::NullRange, nullptr, nullptr); - - }else{ - res = runtime->recordableQueue().enqueueNDRangeKernel( - kernel, cl::NullRange, cl::NDRange(internalGlobalWS[0], internalGlobalWS[1]), cl::NDRange(lws[0], lws[1]), nullptr, nullptr); - } - MNN_CHECK_CL_SUCCESS(res, "recordKernel2d"); - -#ifdef LOG_VERBOSE - MNN_PRINT("end recordKernel !\n"); -#endif -#endif //ENABLE_OPENCL_TIME_PROFILER -} - -void recordKernel3d(const ::cl::Kernel &kernel, const std::vector &gws, const std::vector &lws, - OpenCLRuntime *runtime) { -#if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) - if(!runtime->isUseRecordQueue()){ - return; - } -#ifdef LOG_VERBOSE - MNN_PRINT("start recordKernel !\n"); -#endif - cl_int res = CL_SUCCESS; - std::vector internalGlobalWS = gws; - for (size_t i = 0; i < 3; ++i) { - internalGlobalWS[i] = ROUND_UP(gws[i], std::max((uint32_t)1, lws[i])); - } - if(!runtime->isDevideOpRecord()){ - auto maxRecordNum = runtime->getUseRecordableQueueSize(); - auto RecordNum = runtime->getRecordNum(); - if(RecordNum == 0){ - cl_recording_qcom recording = runtime->recordableQueue().NewRecordingQCOM(&res); - MNN_CHECK_CL_SUCCESS(res, "clNewRecordingQCOM"); - runtime->getRecordings()->emplace_back(recording); - }else if(RecordNum == maxRecordNum){ - res = clEndRecordingQCOM( runtime->getRecordings()->back()); - MNN_CHECK_CL_SUCCESS(res, "clEndRecordingQCOM"); - cl_recording_qcom recording = runtime->recordableQueue().NewRecordingQCOM(&res); - MNN_CHECK_CL_SUCCESS(res, "clNewRecordingQCOM"); - runtime->getRecordings()->emplace_back(recording); - RecordNum = 0; - } - RecordNum++; - runtime->setRecordNum(RecordNum); - } - - if(lws[0]==0 || lws[1]==0 || lws[2]==0){ - res = runtime->recordableQueue().enqueueNDRangeKernel( - kernel, cl::NullRange, cl::NDRange(internalGlobalWS[0], internalGlobalWS[1], internalGlobalWS[2]), cl::NullRange, nullptr, nullptr); - - }else{ - res = runtime->recordableQueue().enqueueNDRangeKernel( - kernel, cl::NullRange, cl::NDRange(internalGlobalWS[0], internalGlobalWS[1], internalGlobalWS[2]), cl::NDRange(lws[0], lws[1], lws[2]), nullptr, nullptr); - } - MNN_CHECK_CL_SUCCESS(res, "recordKernel3d"); - -#ifdef LOG_VERBOSE - MNN_PRINT("end recordKernel !\n"); -#endif -#endif //ENABLE_OPENCL_TIME_PROFILER -} - bool localWSTune(const std::map, std::pair, uint32_t>>>> &tuneMap, const std::vector &gws, const std::string &kernelName, std::pair, uint32_t>& res){ float minScale = 0.1; auto iter = tuneMap.find(kernelName); diff --git a/source/backend/opencl/core/OpenCLRunningUtils.hpp b/source/backend/opencl/core/OpenCLRunningUtils.hpp index e29696b42..aebb302bd 100644 --- a/source/backend/opencl/core/OpenCLRunningUtils.hpp +++ b/source/backend/opencl/core/OpenCLRunningUtils.hpp @@ -127,16 +127,6 @@ std::pair, uint32_t> localWS2DDefault(const std::vector &gws, const std::vector &lws, - OpenCLRuntime *runtime); - -void recordKernel3d(const ::cl::Kernel &kernel, const std::vector &gws, const std::vector &lws, - OpenCLRuntime *runtime); - -void startRecord(OpenCLRuntime *runtime, cl_recording_qcom &recording); - -void endRecord(OpenCLRuntime *runtime, cl_recording_qcom &recording); - } // namespace OpenCL } // namespace MNN #endif /* OpenCLRunningUtils_hpp */ diff --git a/source/backend/opencl/core/runtime/OpenCLRuntime.cpp b/source/backend/opencl/core/runtime/OpenCLRuntime.cpp index f12e6a534..c860d5ba5 100644 --- a/source/backend/opencl/core/runtime/OpenCLRuntime.cpp +++ b/source/backend/opencl/core/runtime/OpenCLRuntime.cpp @@ -237,7 +237,7 @@ OpenCLRuntime::OpenCLRuntime(const BackendConfig::PrecisionMode precision, const if((false == OpenCLSymbolsOperator::getOpenclSymbolsPtr()->isQcomError()) && getDeviceSupportsExtension(*(mFirstGPUDevicePtr.get()), "cl_qcom_recordable_queues")){ uint32_t MaxRecordableQueueSize = mFirstGPUDevicePtr->getInfo(); cl_int err; - if(MaxRecordableQueueSize > 0 && IMAGE == mMemType){ + if(MaxRecordableQueueSize > 0){ // TODO: Use setSessionHint to set the number of mUseRecordableQueueSize mUseRecordableQueueSize = 10; mUseRecordableQueueSize = MaxRecordableQueueSize < mUseRecordableQueueSize ? MaxRecordableQueueSize : mUseRecordableQueueSize; @@ -369,9 +369,7 @@ OpenCLRuntime::~OpenCLRuntime() { MNN_PRINT("start ~OpenCLRuntime !\n"); #endif clearEvent(); - releaseRecord(); mBuildProgramMap.clear(); - mRecordings.clear(); mCommandQueuePtr.reset(); mRecordableQueuePtr.reset(); mContext.reset(); @@ -488,9 +486,9 @@ cl::Kernel OpenCLRuntime::buildKernel(const std::string &programName, const std: const std::set &buildOptions) { std::string buildOptionsStr; if (mIsSupportedFP16) { - buildOptionsStr = "-DFLOAT=half -DFLOAT2=half2 -DFLOAT3=half3 -DFLOAT4=half4 -DFLOAT8=half8 -DFLOAT16=half16 -DRI_F=read_imageh -DWI_F=write_imageh -DCONVERT_FLOAT4=convert_half4 -DMNN_SUPPORT_FP16"; + buildOptionsStr = "-DFLOAT=half -DFLOAT2=half2 -DFLOAT3=half3 -DFLOAT4=half4 -DFLOAT8=half8 -DFLOAT16=half16 -DRI_F=read_imageh -DWI_F=write_imageh -DCONVERT_FLOAT4=convert_half4 -DCONVERT_FLOAT8=convert_half8 -DCONVERT_FLOAT16=convert_half16 -DMNN_SUPPORT_FP16"; } else { - buildOptionsStr = "-DFLOAT=float -DFLOAT2=float2 -DFLOAT3=float3 -DFLOAT4=float4 -DFLOAT8=float8 -DRI_F=read_imagef -DFLOAT16=float16 -DWI_F=write_imagef -DCONVERT_FLOAT4=convert_float4"; + buildOptionsStr = "-DFLOAT=float -DFLOAT2=float2 -DFLOAT3=float3 -DFLOAT4=float4 -DFLOAT8=float8 -DRI_F=read_imagef -DFLOAT16=float16 -DWI_F=write_imagef -DCONVERT_FLOAT4=convert_float4 -DCONVERT_FLOAT8=convert_float8 -DCONVERT_FLOAT16=convert_float16"; } if(isSetWorkGroupAttribute) { @@ -736,56 +734,6 @@ bool OpenCLRuntime::setCache(std::pair cache) { return true; } -void OpenCLRuntime::clearRecord(){ -#if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) - if(mUseRecordQueue && mDevideOpRecord){ - for(int i = 0; i < mRecordings.size(); ++i){ - cl_int res = mCommandQueuePtr->EnqueueRecordingQCOM(mRecordings[i], 0, nullptr, 0, nullptr, - 0, nullptr, 0, nullptr, 0, nullptr, nullptr); - MNN_CHECK_CL_SUCCESS(res, "EnqueueRecordingQCOM"); - } - mCommandQueuePtr->finish(); - mRecordings.clear(); - } -#endif -} - -void OpenCLRuntime::enqeueRecord(){ -#if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) - if(mUseRecordQueue && !mDevideOpRecord){ - for(int i = 0; i < mRecordings.size(); ++i){ - cl_int res = mCommandQueuePtr->EnqueueRecordingQCOM(mRecordings[i], 0, nullptr, 0, nullptr, - 0, nullptr, 0, nullptr, 0, nullptr, nullptr); - MNN_CHECK_CL_SUCCESS(res, "EnqueueRecordingQCOM"); - } - mCommandQueuePtr->finish(); - } -#endif -} - -void OpenCLRuntime::endRecord(){ -#if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) - if(mUseRecordQueue && !mDevideOpRecord){ - if(!mRecordings.empty()){ - cl_int res = clEndRecordingQCOM(mRecordings.back()); - MNN_CHECK_CL_SUCCESS(res, "clEndRecordingQCOM"); - } - } -#endif -} - -void OpenCLRuntime::releaseRecord(){ -#if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) - if(mUseRecordQueue && !mDevideOpRecord){ - for(int i = 0; i < mRecordings.size(); ++i){ - cl_int res = clReleaseRecordingQCOM(mRecordings[i]); - MNN_CHECK_CL_SUCCESS(res, "clReleaseRecordingQCOM"); - } - mRecordings.clear(); - } -#endif -} - void OpenCLRuntime::printEventTime(){ #ifdef ENABLE_OPENCL_TIME_PROFILER if(mEvents.empty()){ diff --git a/source/backend/opencl/core/runtime/OpenCLRuntime.hpp b/source/backend/opencl/core/runtime/OpenCLRuntime.hpp index e14abc724..6bf5cb90b 100644 --- a/source/backend/opencl/core/runtime/OpenCLRuntime.hpp +++ b/source/backend/opencl/core/runtime/OpenCLRuntime.hpp @@ -69,27 +69,15 @@ class OpenCLRuntime { uint64_t GetKernelWaveSize(const cl::Kernel &kernel); std::vector getMaxWorkItemSizes(); uint64_t getMaxLocalMem() const; - std::vector *getRecordings(){ - return &mRecordings; - } uint32_t getUseRecordableQueueSize(){ return mUseRecordableQueueSize; } - bool isUseRecordQueue(){ + bool isSupportRecordQueue(){ return mUseRecordQueue; } bool isDevideOpRecord(){ return mDevideOpRecord; } - void setDevideOpRecord(){ - mDevideOpRecord = true; - } - void setRecordNum(int num){ - mRecordNums = num; - } - uint32_t getRecordNum(){ - return mRecordNums; - } GpuType getGpuType() { return mGpuType; } @@ -124,10 +112,6 @@ class OpenCLRuntime { uint64_t maxAllocSize() const; void setCommandQueueProfileEnable(); void setCommandQueueProfileDisable(); - void clearRecord(); - void enqeueRecord(); - void endRecord(); - void releaseRecord(); unsigned int mQueueCount = 0; unsigned int getQueueNum(); @@ -170,7 +154,6 @@ class OpenCLRuntime { std::shared_ptr<::cl::CommandQueue> mCommandQueuePtr; std::map, ::cl::Program> mBuildProgramMap; std::shared_ptr<::cl::CommandQueue> mRecordableQueuePtr; - std::vector mRecordings; uint64_t mGPUGlobalMemeryCacheSize; uint32_t mGPUComputeUnits; uint32_t mMaxFreq; @@ -179,7 +162,6 @@ class OpenCLRuntime { uint32_t mMaxThreadsPerDevice; uint32_t mMaxWorkGroupSize; uint32_t mUseRecordableQueueSize; - uint32_t mRecordNums = 0; bool mUseRecordQueue = false; bool mDevideOpRecord = true; bool mIsSupportedFP16 = false; diff --git a/source/backend/opencl/execution/buffer/ArgMaxBufExecution.cpp b/source/backend/opencl/execution/buffer/ArgMaxBufExecution.cpp index b0245ce5d..1b4b57a26 100644 --- a/source/backend/opencl/execution/buffer/ArgMaxBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/ArgMaxBufExecution.cpp @@ -23,6 +23,7 @@ ArgMaxBufExecution::ArgMaxBufExecution(const std::string &compute, Backend* back ErrorCode ArgMaxBufExecution::onResize(const std::vector& inputs, const std::vector& outputs) { auto openCLBackend = static_cast(backend()); auto runtime = openCLBackend->getOpenCLRuntime(); + openCLBackend->startRecord(mRecording); auto input = inputs[0]; auto output = outputs[0]; if(mAxis < 0){ @@ -93,6 +94,8 @@ ErrorCode ArgMaxBufExecution::onResize(const std::vector& inputs, const std::string kernelName = "gargmax_buf"; mLocalSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, openCLBackend->getOpenCLRuntime(), kernelName, mKernel).first; + openCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalSize); + openCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -109,6 +112,14 @@ ErrorCode ArgMaxBufExecution::onExecute(const std::vector& inputs, cons mOpenCLBackend->getOpenCLRuntime()->pushEvent({"ArgMax", event}); #else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End ArgMaxBufExecution onExecute... \n"); +#endif + return NO_ERROR; + } run3DKernelDefault(mKernel, mGlobalWorkSize, mLocalSize, mOpenCLBackend->getOpenCLRuntime()); #endif @@ -142,8 +153,9 @@ class ArgMaxBufCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __ArgMaxBuf__(OpType_ArgMax, BUFFER); -OpenCLCreatorRegister __ArgMinBuf__(OpType_ArgMin, BUFFER); +REGISTER_OPENCL_OP_CREATOR(ArgMaxBufCreator, OpType_ArgMax, BUFFER); +REGISTER_OPENCL_OP_CREATOR(ArgMaxBufCreator, OpType_ArgMin, BUFFER); + } // namespace OpenCL } // namespace MNN #endif /* MNN_OPENCL_BUFFER_CLOSED */ diff --git a/source/backend/opencl/execution/buffer/ArgMaxBufExecution.hpp b/source/backend/opencl/execution/buffer/ArgMaxBufExecution.hpp index 11f5a7ed0..de00a3591 100644 --- a/source/backend/opencl/execution/buffer/ArgMaxBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/ArgMaxBufExecution.hpp @@ -16,11 +16,12 @@ #include "MNN_generated.h" #include "backend/opencl/core/OpenCLBackend.hpp" #include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" namespace MNN { namespace OpenCL { -class ArgMaxBufExecution : public Execution { +class ArgMaxBufExecution : public Execution, public CommonExtension { public: ArgMaxBufExecution(const std::string &compute, Backend *backend, const int axis); virtual ~ArgMaxBufExecution() = default; diff --git a/source/backend/opencl/execution/buffer/BinaryBufExecution.cpp b/source/backend/opencl/execution/buffer/BinaryBufExecution.cpp index 73610c99f..25a45f129 100644 --- a/source/backend/opencl/execution/buffer/BinaryBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/BinaryBufExecution.cpp @@ -40,6 +40,7 @@ ErrorCode BinaryBufExecution::SubgroupOnResize(const std::vector &inpu auto inputShape1 = tensorShapeFormat(inputs[1]); auto outputShape = tensorShapeFormat(output); auto runTime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); + openCLBackend->startRecord(mRecording); int shape[4] = {outputShape[0], outputShape[1], outputShape[2], outputShape[3]}; int fullCount[2] = {1, 1}; @@ -89,6 +90,7 @@ ErrorCode BinaryBufExecution::SubgroupOnResize(const std::vector &inpu ret |= unit.kernel.setArg(index++, static_cast(outputpad.left)); ret |= unit.kernel.setArg(index++, static_cast(outputpad.right)); MNN_CHECK_CL_SUCCESS(ret, "setArg BinaryBufExecution C16"); + openCLBackend->recordKernel3d(unit.kernel, mGlobalWorkSize, mLocalWorkSize); } else { mGlobalWorkSize = {(uint32_t)outputShape[2] * outputShape[1], (uint32_t)UP_DIV(outputShape[3], 4), (uint32_t)outputShape[0]}; @@ -114,6 +116,7 @@ ErrorCode BinaryBufExecution::SubgroupOnResize(const std::vector &inpu unit.globalWorkSize = {mGlobalWorkSize[0], mGlobalWorkSize[1], mGlobalWorkSize[2]}; unit.localWorkSize = {mLocalWorkSize[0], mLocalWorkSize[1], mLocalWorkSize[2]}; + openCLBackend->recordKernel3d(unit.kernel, mGlobalWorkSize, mLocalWorkSize); } for (int i = 2; i < inputs.size(); ++i) { @@ -156,6 +159,7 @@ ErrorCode BinaryBufExecution::SubgroupOnResize(const std::vector &inpu ret |= unit.kernel.setArg(index++, static_cast(outputpadtmp.left)); ret |= unit.kernel.setArg(index++, static_cast(outputpadtmp.right)); MNN_CHECK_CL_SUCCESS(ret, "setArg BinaryBufExecution C16 MultiInput"); + openCLBackend->recordKernel3d(unit.kernel, mGlobalWorkSize, mLocalWorkSize); } else { mGlobalWorkSize = {(uint32_t)outputShape[2] * outputShape[1], (uint32_t)UP_DIV(outputShape[3], 4), (uint32_t)outputShape[0]}; @@ -181,8 +185,10 @@ ErrorCode BinaryBufExecution::SubgroupOnResize(const std::vector &inpu unit.globalWorkSize = {mGlobalWorkSize[0], mGlobalWorkSize[1], mGlobalWorkSize[2]}; unit.localWorkSize = {mLocalWorkSize[0], mLocalWorkSize[1], mLocalWorkSize[2]}; + openCLBackend->recordKernel3d(unit.kernel, mGlobalWorkSize, mLocalWorkSize); } } + openCLBackend->endRecord(mRecording); return NO_ERROR; } #endif /* MNN_SUPPORT_INTEL_SUBGROUP */ @@ -202,6 +208,7 @@ ErrorCode BinaryBufExecution::onResize(const std::vector &inputs, cons return SubgroupOnResize(inputs, outputs); } #endif /* MNN_SUPPORT_INTEL_SUBGROUP */ + openCLBackend->startRecord(mRecording); int shape[4] = {outputShape[0], outputShape[1], outputShape[2], UP_DIV(outputShape[3], 4)}; int fullCount[2] = {1, 1}; @@ -235,6 +242,7 @@ ErrorCode BinaryBufExecution::onResize(const std::vector &inputs, cons unit.globalWorkSize = {mGlobalWorkSize[0], mGlobalWorkSize[1]}; unit.localWorkSize = {mLocalWorkSize[0], mLocalWorkSize[1]}; + openCLBackend->recordKernel2d(unit.kernel, mGlobalWorkSize, mLocalWorkSize); for (int i = 2; i < inputs.size(); ++i) { fullCount[0] = 1; fullCount[1] = realSize(inputs[i]) == 1 ? 0 : 1; @@ -254,7 +262,10 @@ ErrorCode BinaryBufExecution::onResize(const std::vector &inputs, cons unit.globalWorkSize = {mGlobalWorkSize[0], mGlobalWorkSize[1]}; unit.localWorkSize = {mLocalWorkSize[0], mLocalWorkSize[1]}; + openCLBackend->recordKernel2d(unit.kernel, mGlobalWorkSize, mLocalWorkSize); } + + openCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -333,8 +344,8 @@ class BinaryBufCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __eltwiseBuf_op(OpType_Eltwise, BUFFER); -OpenCLCreatorRegister __binaryBuf_op(OpType_BinaryOp, BUFFER); +REGISTER_OPENCL_OP_CREATOR(BinaryBufCreator, OpType_Eltwise, BUFFER); +REGISTER_OPENCL_OP_CREATOR(BinaryBufCreator, OpType_BinaryOp, BUFFER); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/buffer/CastBufExecution.cpp b/source/backend/opencl/execution/buffer/CastBufExecution.cpp index f5f7ab7bf..27198489f 100644 --- a/source/backend/opencl/execution/buffer/CastBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/CastBufExecution.cpp @@ -23,6 +23,7 @@ ErrorCode CastBufExecution::onResize(const std::vector& inputs, const s Tensor* output = outputs[0]; auto openCLBackend = static_cast(backend()); auto runtime = openCLBackend->getOpenCLRuntime(); + openCLBackend->startRecord(mRecording); mKernel = runtime->buildKernel("cast_buf", "cast_buf", mBuildOptions); mMaxWorkGroupSize = static_cast(runtime->getMaxWorkGroupSize(mKernel)); @@ -56,6 +57,8 @@ ErrorCode CastBufExecution::onResize(const std::vector& inputs, const s std::string kernelName = "cast_buf"; mLocalSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, openCLBackend->getOpenCLRuntime(), kernelName, mKernel).first; + openCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalSize); + openCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -72,6 +75,14 @@ ErrorCode CastBufExecution::onExecute(const std::vector& inputs, const mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Cast", event}); #else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End CastBufExecution onExecute... \n"); +#endif + return NO_ERROR; + } run3DKernelDefault(mKernel, mGlobalWorkSize, mLocalSize, mOpenCLBackend->getOpenCLRuntime()); #endif @@ -149,7 +160,8 @@ class CastBufCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __CastBuf__(OpType_Cast, BUFFER); +REGISTER_OPENCL_OP_CREATOR(CastBufCreator, OpType_Cast, BUFFER); + } // namespace OpenCL } // namespace MNN #endif /* MNN_OPENCL_BUFFER_CLOSED */ diff --git a/source/backend/opencl/execution/buffer/CastBufExecution.hpp b/source/backend/opencl/execution/buffer/CastBufExecution.hpp index b92cf7040..f192cb2de 100644 --- a/source/backend/opencl/execution/buffer/CastBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/CastBufExecution.hpp @@ -16,11 +16,12 @@ #include "MNN_generated.h" #include "backend/opencl/core/OpenCLBackend.hpp" #include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" namespace MNN { namespace OpenCL { -class CastBufExecution : public Execution { +class CastBufExecution : public Execution, public CommonExtension { public: CastBufExecution(const std::string &compute, Backend *backend); virtual ~CastBufExecution() = default; diff --git a/source/backend/opencl/execution/buffer/ConvBufExecution.cpp b/source/backend/opencl/execution/buffer/ConvBufExecution.cpp index 663e60c83..b0ffcc38d 100644 --- a/source/backend/opencl/execution/buffer/ConvBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/ConvBufExecution.cpp @@ -14,6 +14,7 @@ #include "core/ConvolutionCommon.hpp" #include "core/Backend.hpp" #include "RasterBufExecution.hpp" +#include "ConvBufLowMemoryExecution.hpp" namespace MNN { namespace OpenCL { @@ -202,7 +203,9 @@ std::pair, uint32_t> ConvBufCommonExecution::gws2dLwsTune } return std::make_pair(lws_prefer, min_cost); } - +ConvBufCommonExecution::ConvBufCommonExecution(Backend *backend) : Execution(backend) { + mOpenCLBackend = static_cast(backend); +} ConvBufCommonExecution::ConvBufCommonExecution(const Convolution2D *conv2dParams, Backend *backend) : Execution(backend) { auto openclBackend = (OpenCLBackend *)backend; int biasSize = conv2dParams->common()->outputCount(); @@ -239,8 +242,9 @@ ConvBufCommonExecution::ConvBufCommonExecution(const Convolution2D *conv2dParams } ConvBufCommonExecution::~ConvBufCommonExecution() { - MNN_ASSERT(nullptr != mBias); - backend()->onReleaseBuffer(mBias.get(), Backend::STATIC); + if (mBias) { + backend()->onReleaseBuffer(mBias.get(), Backend::STATIC); + } } void ConvBufExecution::setConv1x1WeightBuffer(int packCout, int packCin, const float* filterDataPtr) { @@ -431,7 +435,7 @@ ErrorCode ConvBufExecution::onResize(const std::vector &inputs, const } mRasterExe->onResize({}, {mFilter.get()}); } - + mOpenCLBackend->startRecord(mRecording); std::vector inputShape = tensorShapeFormat(input); std::vector outputShape = tensorShapeFormat(output); const int height = outputShape.at(1); @@ -654,6 +658,8 @@ ErrorCode ConvBufExecution::onResize(const std::vector &inputs, const if (inputs.size() > 1) { backend()->onReleaseBuffer(mFilter.get(), Backend::DYNAMIC); } + mOpenCLBackend->recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("end ConvExecution onResize !\n"); #endif @@ -681,6 +687,14 @@ ErrorCode ConvBufExecution::onExecute(const std::vector &inputs, const runKernel2D(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime(), &event); mOpenCLBackend->getOpenCLRuntime()->pushEvent({"ConvBuf2D", event}); #else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End ConvExecution onExecute... \n"); +#endif + return NO_ERROR; + } runKernel2D(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); #endif @@ -695,6 +709,30 @@ class ConvolutionBufCreator : public OpenCLBackend::Creator { virtual ~ConvolutionBufCreator() = default; virtual Execution *onCreate(const std::vector &inputs, const std::vector &outputs, const MNN::Op *op, Backend *backend) const override { + auto conv2D = op->main_as_Convolution2D(); + auto input = inputs[0]; + auto output = outputs[0]; + auto padding = ConvolutionCommon::convolutionPad(inputs[0], outputs[0], conv2D->common()); + std::vector inputShape = tensorShapeFormat(input); + std::vector outputShape = tensorShapeFormat(output); + const int outputChannel = outputShape.at(3); + const int inputChannels = inputShape.at(3); +#ifdef MNN_LOW_MEMORY + { + auto conv2dParams = op->main_as_Convolution2D(); + if ((static_cast(backend)->getMemory() == BackendConfig::Memory_Low) && (conv2dParams->quanParameter() != nullptr)) { + if (((conv2dParams->quanParameter()->type() == 4) || + (conv2dParams->quanParameter()->type() == 1) || + (conv2dParams->quanParameter()->type() == 2))) { + // Todo: support int4 inputchannel % 4 not equal 4 + return new ConvBufLowMemoryExecution(inputs, outputs, op, backend); + } else { + MNN_ERROR("OpenCL Conv buf low memory init error. For Opencl Backend, only support low memory mode of int8 or int4 dequantization currently.\n"); + MNN_ASSERT(false); + } + } + } +#endif if (nullptr != op->main_as_Convolution2D()->quanParameter()) { auto quan = op->main_as_Convolution2D()->quanParameter(); if (1 == quan->type() || 2 == quan->type()) { @@ -720,14 +758,6 @@ class ConvolutionBufCreator : public OpenCLBackend::Creator { } return new ConvBufExecution(inputs, outputs, op, backend); } - auto conv2D = op->main_as_Convolution2D(); - auto input = inputs[0]; - auto output = outputs[0]; - auto padding = ConvolutionCommon::convolutionPad(inputs[0], outputs[0], conv2D->common()); - std::vector inputShape = tensorShapeFormat(input); - std::vector outputShape = tensorShapeFormat(output); - const int outputChannel = outputShape.at(3); - const int inputChannels = inputShape.at(3); if (ConvBufWinograd::valid(conv2D->common(), inputs[0], outputs[0], static_cast(backend)->getOpenCLRuntime()->getGpuType() == INTEL)) { std::vector inputShape = tensorShapeFormat(input); @@ -759,7 +789,7 @@ class ConvolutionBufCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __convBuf_op(OpType_Convolution, BUFFER); +REGISTER_OPENCL_OP_CREATOR(ConvolutionBufCreator, OpType_Convolution, BUFFER); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/buffer/ConvBufExecution.hpp b/source/backend/opencl/execution/buffer/ConvBufExecution.hpp index 380b37133..f9d0e7f87 100644 --- a/source/backend/opencl/execution/buffer/ConvBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/ConvBufExecution.hpp @@ -19,11 +19,13 @@ #include #include "backend/opencl/core/OpenCLBackend.hpp" #include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" namespace MNN { namespace OpenCL { -class ConvBufCommonExecution : public Execution { +class ConvBufCommonExecution : public Execution, public CommonExtension { public: + ConvBufCommonExecution(Backend *backend); ConvBufCommonExecution(const Convolution2D *op, Backend *backend); virtual ~ConvBufCommonExecution(); @@ -41,8 +43,6 @@ class ConvBufExecution : public ConvBufCommonExecution { virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; - static std::shared_ptr getBias(OpenCLBackend *backend, const Convolution2D *conv); - void setConv1x1WeightBuffer(int packCout, int packCin, const float* filterDataPtr); private: void _generateFilterConvertRegion(Tensor *virtualFilter, Tensor *originBuffer) const; @@ -57,11 +57,8 @@ class ConvBufExecution : public ConvBufCommonExecution { std::shared_ptr mFilter; cl::Kernel mKernel; uint32_t mMaxWorkGroupSize; - bool mIsTurn = false; bool mConv1x1Opt{false}; - bool mUseLocalMem{false}; std::shared_ptr mKernelBuffer; - std::shared_ptr mBiasBuffer; int mKernelWidth; int mKernelHeight; int mOutputChannel; diff --git a/source/backend/opencl/execution/buffer/ConvBufLowMemoryExecution.cpp b/source/backend/opencl/execution/buffer/ConvBufLowMemoryExecution.cpp new file mode 100644 index 000000000..8a6e89820 --- /dev/null +++ b/source/backend/opencl/execution/buffer/ConvBufLowMemoryExecution.cpp @@ -0,0 +1,670 @@ +// ConvBufLowMemoryExecution.cpp +// +// Created by MNN on 2023/10/12. +// Copyright © 2018, Alibaba Group Holding Limited +// +#ifdef MNN_LOW_MEMORY +#ifndef MNN_OPENCL_BUFFER_CLOSED +#include "ConvBufLowMemoryExecution.hpp" +// #define LOG_VERBOSE +namespace MNN { +namespace OpenCL { + +// set mDequantScale mDequantOffset mNumQuantBit mFilterDataPtr from mConv2dParams +void ConvBufLowMemoryExecution::getInfoFromOpLowMemory(std::shared_ptr & quanCommon) { + quanCommon = ConvolutionCommon::load(mConv2dParams, this->backend(), false, true); + if ((mOpenCLBackend->getMemory() == BackendConfig::Memory_Low) && (mConv2dParams->quanParameter() != nullptr)) { + mLowMemoryFlag = true; + } else { + MNN_ERROR("Conv buf low memory init error.\n"); + MNN_ASSERT(false); + } + // set mNumQuantBit + if (quanCommon->quan->type() == 4) { + mNumQuantBit = 8; + } else if (quanCommon->quan->type() == 1 || quanCommon->quan->type() == 2) { + mNumQuantBit = 4; + } else {/* More types to be supported. */} + // src of alpha in CPU + float * dequantAlpha = quanCommon->alpha.get(); + int numAlpha = mOutputChannel; + // set mDequantScale mDequantOffset + int numAlphaPack = ROUND_UP(numAlpha, 16); + int numBiasPack = ROUND_UP(mOutputChannel, 16); + mResource->bias.reset(Tensor::createDevice({1, 1, 1, ROUND_UP(mOutputChannel, 16)})); + mResource->dequantScale.reset(Tensor::createDevice({numAlphaPack})); + mResource->dequantOffset.reset(Tensor::createDevice({numAlphaPack})); + mOpenCLBackend->onAcquireBuffer(mResource->bias.get(), Backend::STATIC); + mOpenCLBackend->onAcquireBuffer(mResource->dequantScale.get(), Backend::STATIC); + mOpenCLBackend->onAcquireBuffer(mResource->dequantOffset.get(), Backend::STATIC); + cl::Buffer &biasBuffer = openCLBuffer(mResource->bias.get()); + cl::Buffer &dequantScaleBuffer = openCLBuffer(mResource->dequantScale.get()); + cl::Buffer &dequantOffsetBuffer = openCLBuffer(mResource->dequantOffset.get()); + // transfer data from src in cpu to dst in gpu + int bytes = mOpenCLBackend->fpBytes(); + cl_int resBias, resScale, resOffset; + auto biasPtrCL = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(biasBuffer, true, CL_MAP_WRITE, 0, numBiasPack * bytes, nullptr, nullptr, &resBias); + void * dequantScaleBufferMap = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(dequantScaleBuffer, true, CL_MAP_WRITE, 0, numAlphaPack * bytes, nullptr, nullptr, &resScale); + void * dequantOffsetBufferMap = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(dequantOffsetBuffer, true, CL_MAP_WRITE, 0, numAlphaPack * bytes, nullptr, nullptr, &resOffset); + + if (biasPtrCL != nullptr && resBias == CL_SUCCESS) { + ::memset(biasPtrCL, 0, numBiasPack * bytes); + if (nullptr != mConv2dParams->bias()) { + const float *biasDataPtr = mConv2dParams->bias()->data(); + if (bytes == 2){ + for(int i = 0; i < mOutputChannel; i++) { + ((half_float::half*)biasPtrCL)[i] = (half_float::half)(biasDataPtr[i]); + } + } else { + ::memcpy(biasPtrCL, biasDataPtr, mOutputChannel * sizeof(float)); + } + } + } + ::memset(dequantScaleBufferMap, -1, numAlphaPack * bytes); + ::memset(dequantOffsetBufferMap, 0, numAlphaPack * bytes); + if (dequantScaleBufferMap != nullptr && dequantOffsetBufferMap != nullptr && resScale == CL_SUCCESS && resOffset == CL_SUCCESS) { + if (bytes == 2) { + if (quanCommon->asymmetric) { + for (int i = 0; i < numAlpha; ++i) { + ((half_float::half *)dequantOffsetBufferMap)[i] = (half_float::half)dequantAlpha[2 * i]; + ((half_float::half *)dequantScaleBufferMap)[i] = (half_float::half)dequantAlpha[2 * i + 1]; + } + } else { + for (int i = 0; i < numAlpha; ++i) { + ((half_float::half *)dequantScaleBufferMap)[i] = (half_float::half)dequantAlpha[i]; + ((half_float::half *)dequantOffsetBufferMap)[i] = 0.0f; + } + } + } else { + if (quanCommon->asymmetric) { + for (int i = 0; i < numAlpha; ++i) { + ((float *)dequantOffsetBufferMap)[i] = dequantAlpha[2 * i]; + ((float *)dequantScaleBufferMap)[i] = dequantAlpha[2 * i + 1]; + } + } else { + for (int i = 0; i < numAlpha; ++i) { + ((float *)dequantScaleBufferMap)[i] = dequantAlpha[i]; + ((float *)dequantOffsetBufferMap)[i] = 0.0f; + } + } + } + } else { + MNN_ERROR("Map error dequantBufferMap == nullptr \n"); + MNN_ASSERT(false); + } + mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(biasBuffer, biasPtrCL); + mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(dequantScaleBuffer, dequantScaleBufferMap); + mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(dequantOffsetBuffer, dequantOffsetBufferMap); + // set mFilterDataPtr + mFilterDataPtr = (void *)quanCommon->weight.get(); +} +// set mKernelBuffer for the 1x1 kernels +void ConvBufLowMemoryExecution::set1x1WeightLowMemory(int packCout, int packCin, void * filterDataPtr, std::shared_ptr & quanCommon) { + cl_int res; + std::shared_ptr filterBuffer(Tensor::createDevice({ROUND_UP(mOutputChannel, 8)/*Cout pack set to max 8*/, ROUND_UP(mInputChannel, packCin), mKernelWidth, mKernelHeight})); + size_t buffer_size = filterBuffer->usize() / sizeof(float); + float *dequantAlpha = quanCommon->alpha.get(); + // shared part for all cases + if (mNumQuantBit == 8) { + // int8 case + buffer_size *= sizeof(int8_t); + } else if (mNumQuantBit == 4){ + // int4 case + buffer_size /= 2; + } else {/* More types to be supported. */} + mResource->kernelBuffer.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size)); + auto kernelBufferPtr = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(*(mResource->kernelBuffer.get()), true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &res); + if(kernelBufferPtr != nullptr && res == CL_SUCCESS){ + ::memset(kernelBufferPtr, 0, buffer_size); + + if(mResource->gemmOpt){ + for(int o = 0; o < mOutputChannel; o++){ + float zero = 0; + if(quanCommon->asymmetric){ + zero = (-dequantAlpha[2 * o + 1])/dequantAlpha[2 * o]; + } + int i = 0; + for(; i < mInputChannel; i++){ + int bufferIdx = (o/packCout) * packCin*packCout + (i/packCin)*packCin*ROUND_UP(mOutputChannel, packCout) + (i%packCin)*packCout + (o%packCout);//(Ci/packCin, Co/packCout, packCin, packCout) + int filterIdx = o*mInputChannel + i; + if (mNumQuantBit == 8) { + // int8 case + ((int8_t *)kernelBufferPtr)[bufferIdx] = (int8_t)(((int8_t *)filterDataPtr)[filterIdx]); + } else if (mNumQuantBit == 4){ + // int4 case + if (bufferIdx % 2 == 0) { + ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)((((int8_t *)filterDataPtr)[filterIdx] + 8) * 16); + } else { + ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)(((int8_t *)filterDataPtr)[filterIdx] + 8); + } + } else {/* More types to be supported. */} + } + for(; i < ROUND_UP(mInputChannel, 4); i++){ + int bufferIdx = (o/packCout) * packCin*packCout + (i/packCin)*packCin*ROUND_UP(mOutputChannel, packCout) + (i%packCin)*packCout + (o%packCout);//(Ci/packCin, Co/packCout, packCin, packCout) + if (mNumQuantBit == 8) { + // int8 case + ((int8_t *)kernelBufferPtr)[bufferIdx] = (int8_t)(zero); + } else if (mNumQuantBit == 4){ + // int4 case + if (bufferIdx % 2 == 0) { + ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)((zero + 8) * 16); + } else { + ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)(zero + 8); + } + } + } + } + }else{ + for(int o = 0; o < mOutputChannel; o++){ + float zero = 0; + if(quanCommon->asymmetric){ + zero = (-dequantAlpha[2 * o + 1])/dequantAlpha[2 * o]; + } + int i = 0; + for(; i < mInputChannel; i++){ + int bufferIdx = (o/packCout) * ROUND_UP(mInputChannel, packCin)*packCout + (i/packCin)*packCin*packCout + (o%packCout)*packCin + (i%packCin);//(Co/packCout, Ci/packCin, packCout, packCin) + int filterIdx = o*mInputChannel + i; + if (mNumQuantBit == 8) { + // int8 case + ((int8_t *)kernelBufferPtr)[bufferIdx] = (int8_t)(((int8_t *)filterDataPtr)[filterIdx]); + } else if (mNumQuantBit == 4){ + // int4 case + if (bufferIdx % 2 == 0) { + ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)((((int8_t *)filterDataPtr)[filterIdx] + 8) * 16); + } else { + ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)(((int8_t *)filterDataPtr)[filterIdx] + 8); + } + } else {/* More types to be supported. */} + } + for(; i < ROUND_UP(mInputChannel, 4); i++){ + int bufferIdx = (o/packCout) * ROUND_UP(mInputChannel, packCin)*packCout + (i/packCin)*packCin*packCout + (o%packCout)*packCin + (i%packCin);//(Co/packCout, Ci/packCin, packCout, packCin) + if (mNumQuantBit == 8) { + // int8 case + ((int8_t *)kernelBufferPtr)[bufferIdx] = (int8_t)(zero); + } else if (mNumQuantBit == 4){ + // int4 case + if (bufferIdx % 2 == 0) { + ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)((zero + 8) * 16); + } else { + ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)(zero + 8); + } + } + } + } + } + } else { + MNN_ERROR("set1x1WeightLowMemory: Map error ptrCL == nullptr \n"); + MNN_ASSERT(false); + } + mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(*(mResource->kernelBuffer.get()), kernelBufferPtr); +} +// set mFilter for the general kernels +void ConvBufLowMemoryExecution::setGeneralWeightLowMemory(void* filterDataPtr, std::shared_ptr & quanCommon) { + if (filterDataPtr != nullptr) { + std::vector filterImageShape{ROUND_UP(mInputChannel, 4), (UP_DIV(mOutputChannel, 4) * mKernelWidth * mKernelHeight)}; + std::shared_ptr filterBuffer(Tensor::createDevice({mOutputChannel, ROUND_UP(mInputChannel, 4), mKernelWidth, mKernelHeight})); + // int buffer_size = filterBuffer->elementSize(); + size_t buffer_size = filterBuffer->usize() / sizeof(float); + buffer_size *= sizeof(int8_t); + cl::Buffer filterBufferCL(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size); + filterBuffer->buffer().device = (uint64_t)(&filterBufferCL); + float *dequantAlpha = quanCommon->alpha.get(); + // map and pack data from filterDataPtr + cl_int res; + auto ptrCL = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(filterBufferCL, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &res); + if(ptrCL != nullptr && res == CL_SUCCESS) { + ::memset(ptrCL, 0, buffer_size); + const int copy_size = mKernelWidth * mKernelHeight * sizeof(int8_t); + for(int oc=0; ocasymmetric){ + zero = (-dequantAlpha[2 * oc + 1])/dequantAlpha[2 * oc]; + } + int ic = 0; + for(; icgetOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(filterBufferCL, ptrCL); + // convert to NC4HW4 + if (mNumQuantBit == 8) { + // ROUND_UP(IC, 4), UP_DIV(OC, 4) * mKernelWidth * mKernelHeight + mResource->filter.reset(Tensor::createDevice({1, filterImageShape[1], 1, 4 * filterImageShape[0]})); + mOpenCLBackend->onAcquireBuffer(mResource->filter.get(), Backend::STATIC); + MNN::OpenCL::BufferConvertor bufferConvertor{mOpenCLBackend->getOpenCLRuntime()}; + // filterBuffer shape: {OC, ROUND_UP(IC, 4), mKernelWidth, mKernelHeight} + bufferConvertor.convertToNC4HW4Buffer(filterBuffer.get(), MNN::OpenCL::CONV2D_FILTER, mResource->filter.get(), false, true, mLowMemoryFlag, mNumQuantBit); + } else if (mNumQuantBit == 4){ + // ROUND_UP(IC, 4), UP_DIV(OC, 4) * mKernelWidth * mKernelHeight + // For int4 case, data stored in mFilter should be uint8_t, + // while "Tensor::createDevice" occupies more memory than "Tensor::createDevice". + // Therefore, we use "Tensor::createDevice" currently, leaving "Tensor::createDevice" to be supported. + mResource->filter.reset(Tensor::createDevice({1, filterImageShape[1], 1, 2 * filterImageShape[0]})); + mOpenCLBackend->onAcquireBuffer(mResource->filter.get(), Backend::STATIC); + MNN::OpenCL::BufferConvertor bufferConvertor{mOpenCLBackend->getOpenCLRuntime()}; + // filterBuffer shape: {OC, ROUND_UP(IC, 4), mKernelWidth, mKernelHeight} + bufferConvertor.convertToNC4HW4Buffer(filterBuffer.get(), MNN::OpenCL::CONV2D_FILTER, mResource->filter.get(), false, true, mLowMemoryFlag, mNumQuantBit); + } else {/* More types to be supported. */} + } else { + MNN_ERROR("GetConvParams Error: filterDataPtr == nullptr. \n"); + MNN_ASSERT(false); + } +} +// select the fastest kernel for the 1x1 cases by tuning +void ConvBufLowMemoryExecution::tune1x1CaseLowMemory(Tensor * input, Tensor * output) { + std::vector inputShape = tensorShapeFormat(input); + std::vector outputShape = tensorShapeFormat(output); + auto runTime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); + const int height = outputShape.at(1); + const int width = outputShape.at(2); + const int outChannel = outputShape.at(3); + const int inputHeight = inputShape.at(1); + const int inputWidth = inputShape.at(2); + const int inputChannels = inputShape.at(3); + const int inputChannelBlocks = UP_DIV(inputChannels, 4); + std::string info = std::to_string(inputChannels) + "_" + std::to_string(mKernelHeight) + "_" + std::to_string(mKernelWidth) + "_" + std::to_string(mStrides[0]) + "_" + std::to_string(mStrides[1]) + "_" + std::to_string(mDilations[0]) + "_" + std::to_string(mDilations[1]); + // {"conv_2d_1x1_c4h1w4", "conv_2d_1x1_c4h1w2", "conv_2d_1x1_c4h1w1", "conv_2d_1x1_c8h1w4"}; + const int total_kernel = 5; + std::string kernelName[total_kernel] = {"conv_2d_1x1_c4h1w4", "conv_2d_1x1_c4h1w2", "conv_2d_1x1_c4h1w1", "conv_2d_1x1_c8h1w4", "conv_2d_1x1_c8h1w2"}; + int itemC[total_kernel] = {4, 4, 4, 8, 8}; + int itemW[total_kernel] = {4, 2, 1, 4, 2}; + int c8_index_start = 3; + int actual_kernel = total_kernel; + if(mOpenCLBackend->getOpenCLRuntime()->getCLTuneLevel() == Normal) { + actual_kernel = 2; + kernelName[0] = "conv_2d_1x1_c4h1w1"; + itemC[0] = 4; + itemW[0] = 1; + kernelName[1] = "conv_2d_1x1_c8h1w2"; + itemC[1] = 8; + itemW[1] = 2; + c8_index_start = 1; + } else if(mOpenCLBackend->getOpenCLRuntime()->getCLTuneLevel() == Fast || mOpenCLBackend->getOpenCLRuntime()->getCLTuneLevel() == None) { + actual_kernel = 1; + kernelName[0] = "conv_2d_1x1_c4h1w1"; + itemC[0] = 4; + itemW[0] = 1; + } + + cl::Kernel kernel[total_kernel]; + std::vector globalWorkSize[total_kernel]; + std::vector localWorkSize[total_kernel]; + std::pair min_cost(INT_MAX, 0);//(min_time, min_index) + for(int knl_idx = 0; knl_idx < actual_kernel; knl_idx++) { + std::set buildOption = mResource->buildOptions; + if(outputShape.at(3) % itemC[knl_idx] != 0){ + buildOption.emplace("-DCHANNEL_LEAVE"); + } + if((outputShape.at(2) % itemW[knl_idx]) != 0){ + buildOption.emplace("-DBLOCK_LEAVE"); + } + kernel[knl_idx] = mOpenCLBackend->getOpenCLRuntime()->buildKernel("conv_2d_buf", kernelName[knl_idx], buildOption); + uint32_t maxWorkGroupSize = static_cast(mOpenCLBackend->getOpenCLRuntime()->getMaxWorkGroupSize(kernel[knl_idx])); + + uint32_t idx = 0; + cl_int ret = CL_SUCCESS; + globalWorkSize[knl_idx] = {static_cast(UP_DIV(outputShape.at(3), itemC[knl_idx]) * UP_DIV(outputShape.at(2), itemW[knl_idx])), static_cast(outputShape.at(0) * outputShape.at(1))}; + + ret |= kernel[knl_idx].setArg(idx++, globalWorkSize[knl_idx][0]); + ret |= kernel[knl_idx].setArg(idx++, globalWorkSize[knl_idx][1]); + ret |= kernel[knl_idx].setArg(idx++, UP_DIV(width, itemW[knl_idx])); + ret |= kernel[knl_idx].setArg(idx++, openCLBuffer(input)); + ret |= kernel[knl_idx].setArg(idx++, *mResource->kernelBuffer.get()); + ret |= kernel[knl_idx].setArg(idx++, openCLBuffer(mResource->dequantScale.get())); + ret |= kernel[knl_idx].setArg(idx++, openCLBuffer(mResource->dequantOffset.get())); + ret |= kernel[knl_idx].setArg(idx++, openCLBuffer(mResource->bias.get())); + ret |= kernel[knl_idx].setArg(idx++, openCLBuffer(output)); + ret |= kernel[knl_idx].setArg(idx++, static_cast(inputChannelBlocks)); + ret |= kernel[knl_idx].setArg(idx++, height); + ret |= kernel[knl_idx].setArg(idx++, width); + ret |= kernel[knl_idx].setArg(idx++, UP_DIV(outChannel, 4)); + MNN_CHECK_CL_SUCCESS(ret, "setArg Conv1x1BufLowMemory Kernel Select"); + std::pair, int> retTune; + retTune = gws2dLwsTune(kernel[knl_idx], globalWorkSize[knl_idx], kernelName[knl_idx], maxWorkGroupSize); + //printf("cov1x1 %d, %d\n", knl_idx, retTune.second); + if(min_cost.first > retTune.second) { + min_cost.first = retTune.second; + min_cost.second = knl_idx; + mLocalWorkSize = {retTune.first[0], retTune.first[1]}; + } + } + + std::shared_ptr quanCommon; + int min_index = min_cost.second; + if(min_index >= c8_index_start) {//if best kernel is "conv_2d_1x1_c8h1w4", set weight packCout to 8 + // shared part for all cases + quanCommon = ConvolutionCommon::load(mConv2dParams, backend(), false, true); + mFilterDataPtr = (void *)quanCommon->weight.get(); + set1x1WeightLowMemory(8, 4, mFilterDataPtr, quanCommon); + } + mGlobalWorkSize = {globalWorkSize[min_index][0], globalWorkSize[min_index][1]}; + std::set buildOption = mResource->buildOptions; + if(outputShape.at(3) % itemC[min_index] != 0){ + buildOption.emplace("-DCHANNEL_LEAVE"); + } + if((outputShape.at(2) % itemW[min_index]) != 0){ + buildOption.emplace("-DBLOCK_LEAVE"); + } + mKernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("conv_2d_buf", kernelName[min_index], buildOption); + // MNN_PRINT("Kernel is %d.\n", min_index); + uint32_t idx = 0; + cl_int ret = CL_SUCCESS; + ret |= mKernel.setArg(idx++, mGlobalWorkSize[0]); + ret |= mKernel.setArg(idx++, mGlobalWorkSize[1]); + ret |= mKernel.setArg(idx++, UP_DIV(width, itemW[min_index])); + ret |= mKernel.setArg(idx++, openCLBuffer(input)); + ret |= mKernel.setArg(idx++, *mResource->kernelBuffer.get()); + ret |= mKernel.setArg(idx++, openCLBuffer(mResource->dequantScale.get())); + ret |= mKernel.setArg(idx++, openCLBuffer(mResource->dequantOffset.get())); + ret |= mKernel.setArg(idx++, openCLBuffer(mResource->bias.get())); + ret |= mKernel.setArg(idx++, openCLBuffer(output)); + ret |= mKernel.setArg(idx++, static_cast(inputChannelBlocks)); + ret |= mKernel.setArg(idx++, height); + ret |= mKernel.setArg(idx++, width); + ret |= mKernel.setArg(idx++, UP_DIV(outChannel, 4)); + MNN_CHECK_CL_SUCCESS(ret, "setArg Conv1x1BufLowMemory"); + mOpenCLBackend->recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); + return; +} +// select the fastest kernel for the general cases by tuning +void ConvBufLowMemoryExecution::tuneGeneralCaseLowMemory(Tensor * input, Tensor * output) { + std::vector inputShape = tensorShapeFormat(input); + std::vector outputShape = tensorShapeFormat(output); + auto runTime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); + const int height = outputShape.at(1); + const int width = outputShape.at(2); + const int outChannel = outputShape.at(3); + const int inputHeight = inputShape.at(1); + const int inputWidth = inputShape.at(2); + const int inputChannels = inputShape.at(3); + const int inputChannelBlocks = UP_DIV(inputChannels, 4); + std::string info = std::to_string(inputChannels) + "_" + std::to_string(mKernelHeight) + "_" + std::to_string(mKernelWidth) + "_" + std::to_string(mStrides[0]) + "_" + std::to_string(mStrides[1]) + "_" + std::to_string(mDilations[0]) + "_" + std::to_string(mDilations[1]); + int inputImageShape[2] = {inputHeight, inputWidth}; + int outputImageShape[2] = {height, width}; + int kernelShape[2] = {mKernelHeight, mKernelWidth}; + int strideShape[2] = {mStrides[0], mStrides[1]}; + int paddingShape[2] = {mPaddings[0], mPaddings[1]}; + int dilationShape[2] = {mDilations[0], mDilations[1]}; + // {"conv_2d_c4h1w2", "conv_2d_c4h1w1", "conv_2d_c8h1w1", "conv_2d_c4h1w4", "conv_2d_c8h2w1", "conv_2d_c4h4w1"}; + const int total_kernel = 7; + std::string kernelName[total_kernel] = {"conv_2d_c4h1w1", "conv_2d_c4h1w2", "conv_2d_c4h4w1", "conv_2d_c8h2w1", "conv_2d_c8h4w1", "conv_2d_c4h1w4", "conv_2d_c8h1w4"}; + int itemC[total_kernel] = {4, 4, 4, 8, 8, 4, 8}; + int itemH[total_kernel] = {1, 1, 4, 2, 4, 1, 1}; + int itemW[total_kernel] = {1, 2, 1, 1, 1, 4, 4}; + int actual_kernel = total_kernel; + cl::Kernel kernel[total_kernel]; + std::vector globalWorkSize[total_kernel]; + std::vector localWorkSize[total_kernel]; + std::pair min_cost(INT_MAX, 0);//(min_time, min_index) + // MNN_PRINT("Checking kernel %d.\n", knlCheck); + for (int knl_idx = 0; knl_idx < actual_kernel; knl_idx++) { + std::set buildOption = mResource->buildOptions; + if(outputShape.at(3) % itemC[knl_idx] != 0){ + buildOption.emplace("-DCHANNEL_LEAVE"); + } + if((outputShape.at(2) % itemW[knl_idx]) != 0 || (outputShape.at(1) % itemH[knl_idx]) != 0){ + buildOption.emplace("-DBLOCK_LEAVE"); + } + kernel[knl_idx] = mOpenCLBackend->getOpenCLRuntime()->buildKernel("conv_2d_buf", kernelName[knl_idx], buildOption); + uint32_t maxWorkGroupSize = static_cast(mOpenCLBackend->getOpenCLRuntime()->getMaxWorkGroupSize(kernel[knl_idx])); + + globalWorkSize[knl_idx] = {static_cast(UP_DIV(outputShape.at(3), itemC[knl_idx]) * UP_DIV(outputShape.at(2), itemW[knl_idx])), static_cast(outputShape.at(0) * UP_DIV(outputShape.at(1), itemH[knl_idx]))}; + uint32_t idx = 0; + cl_int ret = CL_SUCCESS; + ret |= kernel[knl_idx].setArg(idx++, globalWorkSize[knl_idx][0]); + ret |= kernel[knl_idx].setArg(idx++, globalWorkSize[knl_idx][1]); + ret |= kernel[knl_idx].setArg(idx++, openCLBuffer(input)); + ret |= kernel[knl_idx].setArg(idx++, openCLBuffer(mResource->filter.get())); + ret |= kernel[knl_idx].setArg(idx++, openCLBuffer(mResource->dequantScale.get())); + ret |= kernel[knl_idx].setArg(idx++, openCLBuffer(mResource->dequantOffset.get())); + ret |= kernel[knl_idx].setArg(idx++, openCLBuffer(mResource->bias.get())); + ret |= kernel[knl_idx].setArg(idx++, openCLBuffer(output)); + ret |= kernel[knl_idx].setArg(idx++, sizeof(inputImageShape), inputImageShape); + ret |= kernel[knl_idx].setArg(idx++, inputChannels); + ret |= kernel[knl_idx].setArg(idx++, inputChannelBlocks); + ret |= kernel[knl_idx].setArg(idx++, sizeof(outputImageShape), outputImageShape); + ret |= kernel[knl_idx].setArg(idx++, sizeof(kernelShape), kernelShape); + ret |= kernel[knl_idx].setArg(idx++, sizeof(strideShape), strideShape); + ret |= kernel[knl_idx].setArg(idx++, sizeof(paddingShape), paddingShape); + ret |= kernel[knl_idx].setArg(idx++, sizeof(dilationShape), dilationShape); + ret |= kernel[knl_idx].setArg(idx++, UP_DIV(width, itemW[knl_idx])); + ret |= kernel[knl_idx].setArg(idx++, UP_DIV(outChannel, 4)); + ret |= kernel[knl_idx].setArg(idx++, UP_DIV(height, itemH[knl_idx])); + MNN_CHECK_CL_SUCCESS(ret, "setArg ConvBufLowMemory Kernel Select"); + std::pair, int> retTune; + retTune = gws2dLwsTune(kernel[knl_idx], globalWorkSize[knl_idx], kernelName[knl_idx] + info, maxWorkGroupSize); + if(min_cost.first > retTune.second) { + min_cost.first = retTune.second; + min_cost.second = knl_idx; + mLocalWorkSize = {retTune.first[0], retTune.first[1]}; + } + } + int min_index = min_cost.second; + mGlobalWorkSize = {globalWorkSize[min_index][0], globalWorkSize[min_index][1]}; + + std::set buildOption = mResource->buildOptions; + if(outputShape.at(3) % itemC[min_index] != 0){ + buildOption.emplace("-DCHANNEL_LEAVE"); + } + if((outputShape.at(2) % itemW[min_index]) != 0 || (outputShape.at(1) % itemH[min_index]) != 0){ + buildOption.emplace("-DBLOCK_LEAVE"); + } + mKernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("conv_2d_buf", kernelName[min_index], buildOption); + + uint32_t idx = 0; + cl_int ret = CL_SUCCESS; + ret |= mKernel.setArg(idx++, mGlobalWorkSize[0]); + ret |= mKernel.setArg(idx++, mGlobalWorkSize[1]); + ret |= mKernel.setArg(idx++, openCLBuffer(input)); + ret |= mKernel.setArg(idx++, openCLBuffer(mResource->filter.get())); + ret |= mKernel.setArg(idx++, openCLBuffer(mResource->dequantScale.get())); + ret |= mKernel.setArg(idx++, openCLBuffer(mResource->dequantOffset.get())); + ret |= mKernel.setArg(idx++, openCLBuffer(mResource->bias.get())); + ret |= mKernel.setArg(idx++, openCLBuffer(output)); + ret |= mKernel.setArg(idx++, sizeof(inputImageShape), inputImageShape); + ret |= mKernel.setArg(idx++, inputChannels); + ret |= mKernel.setArg(idx++, inputChannelBlocks); + ret |= mKernel.setArg(idx++, sizeof(outputImageShape), outputImageShape); + ret |= mKernel.setArg(idx++, sizeof(kernelShape), kernelShape); + ret |= mKernel.setArg(idx++, sizeof(strideShape), strideShape); + ret |= mKernel.setArg(idx++, sizeof(paddingShape), paddingShape); + ret |= mKernel.setArg(idx++, sizeof(dilationShape), dilationShape); + ret |= mKernel.setArg(idx++, UP_DIV(width, itemW[min_index])); + ret |= mKernel.setArg(idx++, UP_DIV(outChannel, 4)); + ret |= mKernel.setArg(idx++, UP_DIV(height, itemH[min_index])); + MNN_CHECK_CL_SUCCESS(ret, "setArg ConvBufLowMemory"); + mOpenCLBackend->recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); + return; +} +void ConvBufLowMemoryExecution::tuneGemmLowMemory(Tensor * input, Tensor * output) { + std::vector inputShape = tensorShapeFormat(input); + std::vector outputShape = tensorShapeFormat(output); + auto runTime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); + const int outChannel = outputShape.at(3); + const int inputChannels = inputShape.at(3); + const int batch = outputShape.at(0); + const int inputChannelBlocks = UP_DIV(inputChannels, 4); + const int outputChannelBlocks = UP_DIV(outChannel, 4); + std::string kernelname = "gemm_conv_buf"; + int global_x = outputChannelBlocks; + int global_y = batch; + if(batch > 1){ + kernelname = "gemm_conv_b2_buf"; + global_y = UP_DIV(batch, 2); + } + mKernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("gemm_buf", kernelname, mResource->buildOptions); + uint32_t maxWorkGroupSize = static_cast(mOpenCLBackend->getOpenCLRuntime()->getMaxWorkGroupSize(mKernel)); + mGlobalWorkSize = {static_cast(global_x), static_cast(global_y)}; + // MNN_PRINT("Kernel is %d.\n", min_index); + uint32_t idx = 0; + cl_int ret = CL_SUCCESS; + ret |= mKernel.setArg(idx++, mGlobalWorkSize[0]); + ret |= mKernel.setArg(idx++, mGlobalWorkSize[1]); + ret |= mKernel.setArg(idx++, openCLBuffer(input)); + ret |= mKernel.setArg(idx++, *mResource->kernelBuffer.get()); + ret |= mKernel.setArg(idx++, openCLBuffer(mResource->dequantScale.get())); + ret |= mKernel.setArg(idx++, openCLBuffer(mResource->dequantOffset.get())); + ret |= mKernel.setArg(idx++, openCLBuffer(mResource->bias.get())); + ret |= mKernel.setArg(idx++, openCLBuffer(output)); + ret |= mKernel.setArg(idx++, static_cast(outputChannelBlocks)); + ret |= mKernel.setArg(idx++, static_cast(inputChannelBlocks)); + ret |= mKernel.setArg(idx++, static_cast(batch)); + MNN_CHECK_CL_SUCCESS(ret, "setArg gemm_conv_buf"); + + mLocalWorkSize = gws2dLwsTune(mKernel, mGlobalWorkSize, kernelname, maxWorkGroupSize).first; + mOpenCLBackend->recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); + return; +} +ConvBufLowMemoryExecution::ConvBufLowMemoryExecution(const std::vector &inputs, const std::vector &outputs, const MNN::Op *op, Backend *backend) + : ConvBufCommonExecution(backend) { +#ifdef LOG_VERBOSE + MNN_PRINT("Start ConvBufLowMemoryExecution init !\n"); +#endif + mResource.reset(new ConvBufResource); + mOpenCLBackend = static_cast(backend); + const auto *conv2dParams = op->main_as_Convolution2D(); + const auto *conv2dCommonParams = conv2dParams->common(); + mConv2dParams = conv2dParams; + mResource->conv2dCommonParams = conv2dCommonParams; + mStrides = {conv2dCommonParams->strideY(), conv2dCommonParams->strideX()}; + mDilations = {conv2dCommonParams->dilateY(), conv2dCommonParams->dilateX()}; + auto padding = ConvolutionCommon::convolutionPad(inputs[0], outputs[0], conv2dCommonParams); + mPaddings[0] = padding.second;//padY + mPaddings[1] = padding.first;//padX + + mKernelWidth = conv2dCommonParams->kernelX(); + mKernelHeight = conv2dCommonParams->kernelY(); + mOutputChannel = conv2dCommonParams->outputCount(); + std::string kernelName = "conv_2d_c4h1w4"; + mInputChannel = inputs[0]->channel(); + std::shared_ptr quanCommon; + // set mDequantScale, mDequantOffset, mFilterDataPtr + // prepare mDequantScale mDequantOffset mFilterDataPtr + getInfoFromOpLowMemory(quanCommon); + //select opt conv method + //std::vector inputShape = tensorShapeFormat(inputs[0]); + //const int inputChannels = inputShape.at(3); + //const int batch = inputShape.at(0); + mResource->gemmOpt = (mKernelHeight == mKernelWidth && mKernelHeight == 1 && mPaddings[0] == 0 && mPaddings[1] == 0 && mStrides[0] == 1 && mStrides[1] == 1 && inputs[0]->width() == 1 && inputs[0]->height() == 1); + mResource->conv1x1Opt = (mKernelHeight == mKernelWidth && mKernelHeight == 1 && mPaddings[0] == 0 && mPaddings[1] == 0 && mStrides[0] == 1 && mStrides[1] == 1 && inputs[0]->width() >= 4); + //printf("mConv1x1Opt = %d mKernelHeight = %d mKernelWidth = %d mPaddings[0] = %d mPaddings[1] = %d mStrides[0] = %d mStrides[1] = %d inputs[0]->width() = %d inputs[0]->height() = %d mOutputChannel = %d inputChannels = %d batch = %d\n", mConv1x1Opt, mKernelHeight, mKernelWidth, + //mPaddings[0], mPaddings[1], mStrides[0], mStrides[1], inputs[0]->width(), inputs[0]->height(), mOutputChannel, inputChannels, batch); + if (mResource->conv1x1Opt) { + // set mKernelBuffer for 1x1 case + // At first, set packCout equal to 4 + set1x1WeightLowMemory(4, 4, mFilterDataPtr, quanCommon); + kernelName = "conv_2d_1x1_c4h1w4"; + } else if(mResource->gemmOpt){ + set1x1WeightLowMemory(4, 4, mFilterDataPtr, quanCommon); + }else { + // set mFilter for not 1x1 case + setGeneralWeightLowMemory(mFilterDataPtr, quanCommon); + } + // Create Kernel + if (conv2dCommonParams->relu()) { + mResource->buildOptions.emplace("-DRELU"); + } else if (conv2dCommonParams->relu6()) { + mResource->buildOptions.emplace("-DRELU6"); + } + if (mNumQuantBit == 8) { + // int8 case + mResource->buildOptions.emplace("-DUSE_LOW_BIT_WEIGHT_INT8"); + } else if (mNumQuantBit == 4){ + // int4 case + mResource->buildOptions.emplace("-DUSE_LOW_BIT_WEIGHT_INT4"); + } else {/* More types to be supported. */} + mKernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("conv_2d_buf", kernelName, mResource->buildOptions); + mMaxWorkGroupSize = static_cast(mOpenCLBackend->getOpenCLRuntime()->getMaxWorkGroupSize(mKernel)); +#ifdef LOG_VERBOSE + MNN_PRINT("end ConvExecution init !\n"); +#endif +} + +ConvBufLowMemoryExecution::ConvBufLowMemoryExecution(std::shared_ptr resource, const Op* op, Backend *backend) + : ConvBufCommonExecution(backend) { + mResource = resource; +} + +ConvBufLowMemoryExecution::~ConvBufLowMemoryExecution() { + // Do nothing +} + +bool ConvBufLowMemoryExecution::onClone(Backend* bn, const Op* op, Execution** dst) { + if (!mValid) { + return false; + } + if (nullptr == dst) { + return true; + } + *dst = new ConvBufLowMemoryExecution(mResource, op, bn); + return true; +} + +ErrorCode ConvBufLowMemoryExecution::onResize(const std::vector &inputs, const std::vector &outputs) { +#ifdef LOG_VERBOSE + MNN_PRINT("Start ConvExecution onResize !\n"); +#endif + auto input = inputs[0]; + auto output = outputs[0]; + // auto padding = ConvolutionCommon::convolutionPad(input, output, mResource->conv2dCommonParams); + // mPaddings[0] = padding.second;//padY + // mPaddings[1] = padding.first;//padX + mPaddings[0] = 0; + mPaddings[1] = 0; + if (mResource->conv1x1Opt) { + tune1x1CaseLowMemory(input, output); + } else if(mResource->gemmOpt){ + tuneGemmLowMemory(input, output); + } else { + tuneGeneralCaseLowMemory(input, output); + } +#ifdef LOG_VERBOSE + MNN_PRINT("end ConvExecution onResize !\n"); +#endif + return NO_ERROR; +} +ErrorCode ConvBufLowMemoryExecution::onExecute(const std::vector &inputs, const std::vector &outputs) { +#ifdef LOG_VERBOSE + MNN_PRINT("Start ConvExecution onExecute !\n"); +#endif +#ifdef ENABLE_OPENCL_TIME_PROFILER + cl::Event event; + runKernel2D(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime(), &event); + mOpenCLBackend->getOpenCLRuntime()->pushEvent({"ConvBuf2D", event}); +#else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End ConvExecution onExecute... \n"); +#endif + return NO_ERROR; + } + // gemm/gemv: + // input : (batch, ic/4, 4) + // weight: (ic/4, oc, 4) + // output: (batch, oc, 4) + runKernel2D(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); +#endif + +#ifdef LOG_VERBOSE + MNN_PRINT("end ConvExecution onExecute !\n"); +#endif + return NO_ERROR; +} +} // namespace OpenCL +} // namespace MNN +#endif /* MNN_OPENCL_BUFFER_CLOSED */ +#endif /* MNN_LOW_MEMORY */ diff --git a/source/backend/opencl/execution/buffer/ConvBufLowMemoryExecution.hpp b/source/backend/opencl/execution/buffer/ConvBufLowMemoryExecution.hpp new file mode 100644 index 000000000..48799dcf0 --- /dev/null +++ b/source/backend/opencl/execution/buffer/ConvBufLowMemoryExecution.hpp @@ -0,0 +1,68 @@ +// +// ConvBufLowMemoryExecution.hpp +// MNN +// +// Created by MNN on 2023/10/12. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#ifdef MNN_LOW_MEMORY +#ifndef MNN_OPENCL_BUFFER_CLOSED +#ifndef ConvBufLowMemoryExecution_hpp +#define ConvBufLowMemoryExecution_hpp +#include "core/ConvolutionCommon.hpp" +#include "ConvBufExecution.hpp" + +namespace MNN { +namespace OpenCL { + +struct ConvBufResource { + const Convolution2DCommon *conv2dCommonParams; + std::shared_ptr kernelBuffer; + std::shared_ptr filter; + std::shared_ptr dequantScale; + std::shared_ptr dequantOffset; + std::shared_ptr bias; + std::set buildOptions; + bool conv1x1Opt = false; + bool gemmOpt = false; +}; + +class ConvBufLowMemoryExecution : public ConvBufCommonExecution { +public: + ConvBufLowMemoryExecution(const std::vector &inputs, const std::vector &outputs, const MNN::Op *op, Backend *backend); + ConvBufLowMemoryExecution(std::shared_ptr resource, const Op* op, Backend* b); + virtual ~ConvBufLowMemoryExecution(); + virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; + virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual bool onClone(Backend* bn, const Op* op, Execution** dst) override; +private: + void getInfoFromOpLowMemory(std::shared_ptr & quanCommon); + void set1x1WeightLowMemory(int packCout, int packCin, void * filterDataPtr, std::shared_ptr & quanCommon); + void setGeneralWeightLowMemory(void * filterDataPtr, std::shared_ptr & quanCommon); + void tune1x1CaseLowMemory(Tensor * input, Tensor * output); + void tuneGeneralCaseLowMemory(Tensor * input, Tensor * output); + void tuneGemmLowMemory(Tensor * input, Tensor * output); + std::shared_ptr mResource; + const Convolution2D *mConv2dParams; + std::vector mStrides{1, 1}; + std::vector mPaddings{0, 0}; + std::vector mDilations{1, 1}; + std::vector mGlobalWorkSize{1, 1, 1}; + std::vector mLocalWorkSize{1, 1, 1, 1}; + cl::Kernel mKernel; + uint32_t mMaxWorkGroupSize; + int mKernelWidth; + int mKernelHeight; + int mOutputChannel; + int mInputChannel; + void *mFilterDataPtr = nullptr; + bool mLowMemoryFlag = false; + int mNumQuantBit = 0; +}; + +} // namespace OpenCL +} // namespace MNN +#endif /* ConvBufLowMemoryExecution_hpp */ +#endif /* MNN_OPENCL_BUFFER_CLOSED */ +#endif /* MNN_LOW_MEMORY */ diff --git a/source/backend/opencl/execution/buffer/ConvBufWinograd.cpp b/source/backend/opencl/execution/buffer/ConvBufWinograd.cpp index 57b6b6623..49e462eac 100644 --- a/source/backend/opencl/execution/buffer/ConvBufWinograd.cpp +++ b/source/backend/opencl/execution/buffer/ConvBufWinograd.cpp @@ -233,6 +233,7 @@ ErrorCode ConvBufWinograd::onResize(const std::vector& inputs, const st int padX = pad.first; auto runTime = mOpenCLBackend->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); #ifdef MNN_SUPPORT_INTEL_SUBGROUP if (mUseSubgroup) { @@ -337,6 +338,7 @@ ErrorCode ConvBufWinograd::onResize(const std::vector& inputs, const st } else { mLWS_S[b] = {1, 16}; } + mOpenCLBackend->recordKernel2d(mSourceTransform[b], mGWS_S[b], mLWS_S[b]); } // MatMul @@ -359,6 +361,7 @@ ErrorCode ConvBufWinograd::onResize(const std::vector& inputs, const st ret |= mMatMul[b].setArg(index++, icC16); ret |= mMatMul[b].setArg(index++, alpha * alpha); MNN_CHECK_CL_SUCCESS(ret, "setArg ConvWinogradBuf MatMul"); + mOpenCLBackend->recordKernel2d(mMatMul[b], mGWS_M[b], mLWS_M[b]); } // Dest Transform @@ -391,6 +394,7 @@ ErrorCode ConvBufWinograd::onResize(const std::vector& inputs, const st } else { mLWS_D[b] = {1, 16}; } + mOpenCLBackend->recordKernel2d(mDestTransform[b], mGWS_D[b], mLWS_D[b]); } } } else @@ -472,6 +476,7 @@ ErrorCode ConvBufWinograd::onResize(const std::vector& inputs, const st std::string kernelName = "winoTransSrcBuf"; mLWS_S[b] = localWS2DDefault(mGWS_S[b], mMaxWGS_S[b], mOpenCLBackend->getOpenCLRuntime(), kernelName, mSourceTransform[b]).first; + mOpenCLBackend->recordKernel2d(mSourceTransform[b], mGWS_S[b], mLWS_S[b]); } // MatMul @@ -536,6 +541,7 @@ ErrorCode ConvBufWinograd::onResize(const std::vector& inputs, const st ret |= mMatMul[b].setArg(index++, icC4); ret |= mMatMul[b].setArg(index++, alpha * alpha); MNN_CHECK_CL_SUCCESS(ret, "setArg ConvWinogradBuf SubGroup MatMul"); + mOpenCLBackend->recordKernel2d(mMatMul[b], mGWS_M[b], mLWS_M[b]); } // Dest Transform @@ -559,9 +565,11 @@ ErrorCode ConvBufWinograd::onResize(const std::vector& inputs, const st std::string kernelName = "winoTransDstBuf"; mLWS_D[b] = localWS2DDefault(mGWS_D[b], mMaxWGS_D[b], mOpenCLBackend->getOpenCLRuntime(), kernelName, mDestTransform[b]).first; + mOpenCLBackend->recordKernel2d(mDestTransform[b], mGWS_D[b], mLWS_D[b]); } } } + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -569,7 +577,15 @@ ErrorCode ConvBufWinograd::onResize(const std::vector& inputs, const st ErrorCode ConvBufWinograd::onExecute(const std::vector& inputs, const std::vector& outputs) { auto input = inputs[0]; auto output = outputs[0]; - + +#ifndef ENABLE_OPENCL_TIME_PROFILER +if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); + return NO_ERROR; +} +#endif + for (int b = 0; b < input->batch(); ++b) { int index = b; /*Source Transform*/ diff --git a/source/backend/opencl/execution/buffer/ConvBufWinograd.hpp b/source/backend/opencl/execution/buffer/ConvBufWinograd.hpp index fb40030a1..c19f24b47 100644 --- a/source/backend/opencl/execution/buffer/ConvBufWinograd.hpp +++ b/source/backend/opencl/execution/buffer/ConvBufWinograd.hpp @@ -18,10 +18,11 @@ #include #include "backend/opencl/execution/buffer/ConvBufExecution.hpp" #include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" namespace MNN { namespace OpenCL { -class ConvBufWinograd : public Execution { +class ConvBufWinograd : public Execution, public CommonExtension { public: ConvBufWinograd(const MNN::Convolution2D* op, Backend* backend); virtual ~ConvBufWinograd(); diff --git a/source/backend/opencl/execution/buffer/ConvSubgroupBufExecution.cpp b/source/backend/opencl/execution/buffer/ConvSubgroupBufExecution.cpp index 396d1d750..7c1673bd6 100644 --- a/source/backend/opencl/execution/buffer/ConvSubgroupBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/ConvSubgroupBufExecution.cpp @@ -238,6 +238,8 @@ ErrorCode ConvSubgroupBuf::onResize(const std::vector &inputs, const s auto output = outputs[0]; std::vector inputShape = tensorShapeFormat(input); std::vector outputShape = tensorShapeFormat(output); + auto runTime = mOpenCLBackend->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); int in_c_pack = TensorUtils::getTensorChannelPack(input); int out_c_pack = TensorUtils::getTensorChannelPack(output); const int height = outputShape.at(1); @@ -304,6 +306,7 @@ ErrorCode ConvSubgroupBuf::onResize(const std::vector &inputs, const s mTranseKernel.setArg(idx++, static_cast(inputpad.right)); mTranseLocalWorkSize = localWS3DDefault(mTranseGlobalWorkSize, mMaxWGS_S, mOpenCLBackend->getOpenCLRuntime(), "conv_transe_c4_c1", mTranseKernel).first; + mOpenCLBackend->recordKernel3d(mTranseKernel, mTranseGlobalWorkSize, mTranseLocalWorkSize); } else { mSource.reset(Tensor::createDevice(std::vector{inputShape.at(0), UP_DIV(input->channel(), 16),inputHeight * inputWidth, 16}, Tensor::CAFFE_C4)); mOpenCLBackend->onAcquireBuffer(mSource.get(), Backend::DYNAMIC); @@ -329,6 +332,7 @@ ErrorCode ConvSubgroupBuf::onResize(const std::vector &inputs, const s mTranseKernel.setArg(idx++, static_cast(inputpad.right)); mTranseLocalWorkSize = localWS3DDefault(mTranseGlobalWorkSize, mMaxWGS_S, mOpenCLBackend->getOpenCLRuntime(), "conv_transe_c4_c16", mTranseKernel).first; + mOpenCLBackend->recordKernel3d(mTranseKernel, mTranseGlobalWorkSize, mTranseLocalWorkSize); } } @@ -385,12 +389,26 @@ ErrorCode ConvSubgroupBuf::onResize(const std::vector &inputs, const s #ifdef LOG_VERBOSE MNN_PRINT("end ConvSubgroupBuf onResize !\n"); #endif + + mOpenCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } ErrorCode ConvSubgroupBuf::onExecute(const std::vector &inputs, const std::vector &outputs) { #ifdef LOG_VERBOSE MNN_PRINT("Start ConvSubgroupBuf onExecute !\n"); +#endif + +#ifndef ENABLE_OPENCL_TIME_PROFILER +if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("end ConvSubgroupBuf onExecute !\n"); +#endif + return NO_ERROR; +} #endif if (mNeedTranse) { #ifdef ENABLE_OPENCL_TIME_PROFILER diff --git a/source/backend/opencl/execution/buffer/ConvSubgroupBufExecution.hpp b/source/backend/opencl/execution/buffer/ConvSubgroupBufExecution.hpp index 98f894934..19eb531ad 100644 --- a/source/backend/opencl/execution/buffer/ConvSubgroupBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/ConvSubgroupBufExecution.hpp @@ -20,10 +20,11 @@ #include #include "backend/opencl/core/OpenCLBackend.hpp" #include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" namespace MNN { namespace OpenCL { -class ConvSubgroupBuf : public Execution { +class ConvSubgroupBuf : public Execution, public CommonExtension { public: virtual ~ConvSubgroupBuf(); diff --git a/source/backend/opencl/execution/buffer/DeconvBufExecution.cpp b/source/backend/opencl/execution/buffer/DeconvBufExecution.cpp index 2f1bddeb4..d662c7f4a 100644 --- a/source/backend/opencl/execution/buffer/DeconvBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/DeconvBufExecution.cpp @@ -105,6 +105,8 @@ ErrorCode DeconvBufExecution::onResize(const std::vector &inputs, cons std::vector inputShape = tensorShapeFormat(input); std::vector outputShape = tensorShapeFormat(output); + auto runTime = mOpenCLBackend->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); const int outputBatch = outputShape.at(0); const int outputHeight = outputShape.at(1); @@ -163,6 +165,8 @@ ErrorCode DeconvBufExecution::onResize(const std::vector &inputs, cons std::string name = "deconv2d_buf"; mLWS = localWS3DDefault(mGWS, mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), name, mKernel).first; + mOpenCLBackend->recordKernel3d(mKernel, mGWS, mLWS); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -180,6 +184,14 @@ ErrorCode DeconvBufExecution::onExecute(const std::vector &inputs, con mOpenCLBackend->getOpenCLRuntime()->pushEvent({"DeconvBuf", event}); #else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End DeconvBufExecution onExecute... \n"); +#endif + return NO_ERROR; + } run3DKernelDefault(mKernel, mGWS, mLWS, mOpenCLBackend->getOpenCLRuntime()); #endif @@ -195,6 +207,9 @@ class DeconvolutionBufCreator : public OpenCLBackend::Creator { virtual ~DeconvolutionBufCreator() = default; virtual Execution *onCreate(const std::vector &inputs, const std::vector &outputs, const MNN::Op *op, Backend *backend) const override { + if(inputs.size() != 1){ + return nullptr; + } for (int i = 0; i < inputs.size(); ++i) { TensorUtils::setTensorSupportPack(inputs[i], false); } @@ -205,7 +220,7 @@ class DeconvolutionBufCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __deconvbuf_op(OpType_Deconvolution, BUFFER); +REGISTER_OPENCL_OP_CREATOR(DeconvolutionBufCreator, OpType_Deconvolution, BUFFER); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/buffer/DepthwiseConvBufExecution.cpp b/source/backend/opencl/execution/buffer/DepthwiseConvBufExecution.cpp index 791dc0428..05d393a6a 100644 --- a/source/backend/opencl/execution/buffer/DepthwiseConvBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/DepthwiseConvBufExecution.cpp @@ -100,6 +100,8 @@ ErrorCode DepthwiseConvBufExecution::onResize(const std::vector &input auto output = outputs[0]; std::vector inputShape = tensorShapeFormat(input); std::vector outputShape = tensorShapeFormat(output); + auto runTime = mOpenCLBackend->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); auto padding = ConvolutionCommon::convolutionPad(input, output, mConv2dCommonParams); mPaddings[0] = padding.second;//padY @@ -294,6 +296,8 @@ ErrorCode DepthwiseConvBufExecution::onResize(const std::vector &input //printf("DepthwiseConvBuf!! %d, %d %d, %d %d, %d %d\n", min_index, mGlobalWorkSize[0], mGlobalWorkSize[1], mLocalWorkSize[0], mLocalWorkSize[1], outputChannel, outputWidth); } + mOpenCLBackend->recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -309,6 +313,14 @@ ErrorCode DepthwiseConvBufExecution::onExecute(const std::vector &inpu &event); mOpenCLBackend->getOpenCLRuntime()->pushEvent({"DepthwiseConvBuf", event}); #else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End DepthwiseConvBufExecution onExecute... \n"); +#endif + return NO_ERROR; + } runKernel2D(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); #endif @@ -352,7 +364,7 @@ class DepthwiseConvolutionBufCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __DepthwiseConvBuf_op(OpType_ConvolutionDepthwise, BUFFER); +REGISTER_OPENCL_OP_CREATOR(DepthwiseConvolutionBufCreator, OpType_ConvolutionDepthwise, BUFFER); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/buffer/DepthwiseConvSubgroupBufExecution.cpp b/source/backend/opencl/execution/buffer/DepthwiseConvSubgroupBufExecution.cpp index ffe4b3d50..03bf7beae 100644 --- a/source/backend/opencl/execution/buffer/DepthwiseConvSubgroupBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/DepthwiseConvSubgroupBufExecution.cpp @@ -152,6 +152,8 @@ ErrorCode DepthwiseConvSubgroupBufExecution::onResize(const std::vector inputShape = tensorShapeFormat(input); std::vector outputShape = tensorShapeFormat(output); + auto runTime = mOpenCLBackend->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); auto padding = ConvolutionCommon::convolutionPad(input, output, mConv2dCommonParams); mPaddings[0] = padding.second;//padY @@ -215,6 +217,7 @@ ErrorCode DepthwiseConvSubgroupBufExecution::onResize(const std::vector(inputpad.right)); mTranseLocalWorkSize = localWS3DDefault(mTranseGlobalWorkSize, mMaxWGS_S, mOpenCLBackend->getOpenCLRuntime(),"conv_transe_c4_c16", mTranseKernel).first; + mOpenCLBackend->recordKernel3d(mTranseKernel, mTranseGlobalWorkSize, mTranseLocalWorkSize); } mGlobalWorkSize = {static_cast(UP_DIV(outputShape.at(2), 8) * outputShape.at(1)), static_cast(ROUND_UP(outputShape.at(3), 16)), @@ -245,7 +248,9 @@ ErrorCode DepthwiseConvSubgroupBufExecution::onResize(const std::vector(outputpad.right)); mKernel.setArg(idx++, static_cast(paddingShape[1])); mKernel.setArg(idx++, static_cast(paddingShape[0])); - + + mOpenCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -253,7 +258,16 @@ ErrorCode DepthwiseConvSubgroupBufExecution::onExecute(const std::vectorisUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("end DepthwiseConvSubgroupBufExecution onExecute !\n"); +#endif + return NO_ERROR; +} +#endif if (mNeedTranse) { #ifdef ENABLE_OPENCL_TIME_PROFILER cl::Event event; diff --git a/source/backend/opencl/execution/buffer/GridSampleBufExecution.cpp b/source/backend/opencl/execution/buffer/GridSampleBufExecution.cpp index 74f99fe6f..fe7ec8144 100644 --- a/source/backend/opencl/execution/buffer/GridSampleBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/GridSampleBufExecution.cpp @@ -45,6 +45,7 @@ ErrorCode GridSampleBufExecution::onResize(const std::vector &inputs, auto gridTensor = inputs[1]; auto outputTensor = outputs[0]; auto runtime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); const int batches = inputTensor->buffer().dim[0].extent; const int channels = inputTensor->buffer().dim[1].extent; @@ -81,7 +82,9 @@ ErrorCode GridSampleBufExecution::onResize(const std::vector &inputs, MNN_CHECK_CL_SUCCESS(ret, "setArg GridSampleBufExecution"); mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, runtime, mKernelName, mKernel).first; - + + mOpenCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mGlobalWorkSize); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -93,6 +96,11 @@ ErrorCode GridSampleBufExecution::onExecute(const std::vector &inputs, mOpenCLBackend->getOpenCLRuntime()->pushEvent({"GridSample", event}); #else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); + return NO_ERROR; + } run3DKernelDefault(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); #endif return NO_ERROR; @@ -117,7 +125,7 @@ class GridSampleBufCreator :public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __GridSampleBuf_op_(OpType_GridSample, BUFFER); +REGISTER_OPENCL_OP_CREATOR(GridSampleBufCreator, OpType_GridSample, BUFFER); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/buffer/GridSampleBufExecution.hpp b/source/backend/opencl/execution/buffer/GridSampleBufExecution.hpp index ba82d7e47..cecf4d253 100644 --- a/source/backend/opencl/execution/buffer/GridSampleBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/GridSampleBufExecution.hpp @@ -14,10 +14,11 @@ #include "core/Execution.hpp" #include "backend/opencl/core/OpenCLBackend.hpp" #include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" namespace MNN { namespace OpenCL { -class GridSampleBufExecution : public Execution { +class GridSampleBufExecution : public Execution, public CommonExtension { public: GridSampleBufExecution(const std::vector &inputs, const MNN::Op *op, Backend *backend); virtual ~GridSampleBufExecution() = default; diff --git a/source/backend/opencl/execution/buffer/Interp3DBufExecution.cpp b/source/backend/opencl/execution/buffer/Interp3DBufExecution.cpp index c0821a9ce..d87bab2ef 100644 --- a/source/backend/opencl/execution/buffer/Interp3DBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/Interp3DBufExecution.cpp @@ -41,6 +41,7 @@ ErrorCode Interp3DBufExecution::onResize(const std::vector &inputs, co Tensor *input = inputs[0]; Tensor *output = outputs[0]; auto runtime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); std::vector inputImageShape = tensorShapeFormat(input); // {C/4 * H * W, N * D} for 5-D Tensor std::vector outputImageShape = tensorShapeFormat(output); @@ -88,6 +89,8 @@ ErrorCode Interp3DBufExecution::onResize(const std::vector &inputs, co MNN_CHECK_CL_SUCCESS(ret, "setArg Interp3DBufExecution"); mLWS = localWS3DDefault(mGWS, mMaxWorkGroupSize, runtime, mKernelName, mKernel).first; + mOpenCLBackend->recordKernel3d(mKernel, mGWS, mLWS); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -104,6 +107,14 @@ ErrorCode Interp3DBufExecution::onExecute(const std::vector &inputs, c mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Interp", event}); #else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End InterpBufExecution onExecute... \n"); +#endif + return NO_ERROR; + } run3DKernelDefault(mKernel, mGWS, mLWS, mOpenCLBackend->getOpenCLRuntime()); #endif @@ -130,7 +141,7 @@ class Interp3DBufCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __Interp3DBuf_op_(OpType_Interp3D, BUFFER); +REGISTER_OPENCL_OP_CREATOR(Interp3DBufCreator, OpType_Interp3D, BUFFER); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/buffer/Interp3DBufExecution.hpp b/source/backend/opencl/execution/buffer/Interp3DBufExecution.hpp index 9f103e2a8..633cfe6af 100644 --- a/source/backend/opencl/execution/buffer/Interp3DBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/Interp3DBufExecution.hpp @@ -17,11 +17,12 @@ #include "core/Execution.hpp" #include "backend/opencl/core/OpenCLBackend.hpp" #include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" namespace MNN { namespace OpenCL { -class Interp3DBufExecution : public Execution { +class Interp3DBufExecution : public Execution, public CommonExtension { public: Interp3DBufExecution(const std::vector &inputs, const MNN::Op *op, Backend *backend); virtual ~Interp3DBufExecution() = default; diff --git a/source/backend/opencl/execution/buffer/InterpBufExecution.cpp b/source/backend/opencl/execution/buffer/InterpBufExecution.cpp index e91c0f31a..f3581c045 100644 --- a/source/backend/opencl/execution/buffer/InterpBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/InterpBufExecution.cpp @@ -43,6 +43,7 @@ ErrorCode InterpBufExecution::onResize(const std::vector &inputs, cons Tensor *input = inputs[0]; Tensor *output = outputs[0]; auto runtime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); std::vector inputShape = tensorShapeFormat(input); std::vector outputShape = tensorShapeFormat(output); @@ -82,6 +83,8 @@ ErrorCode InterpBufExecution::onResize(const std::vector &inputs, cons MNN_CHECK_CL_SUCCESS(ret, "setArg InterpBufExecution"); mLWS = localWS3DDefault(mGWS, mMaxWorkGroupSize, runtime, mKernelName, mKernel).first; + mOpenCLBackend->recordKernel3d(mKernel, mGWS, mLWS); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -98,6 +101,14 @@ ErrorCode InterpBufExecution::onExecute(const std::vector &inputs, con mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Interp", event}); #else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End InterpBufExecution onExecute... \n"); +#endif + return NO_ERROR; + } run3DKernelDefault(mKernel, mGWS, mLWS, mOpenCLBackend->getOpenCLRuntime()); #endif @@ -126,7 +137,7 @@ class InterpBufCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __InterpBuf_op_(OpType_Interp, BUFFER); +REGISTER_OPENCL_OP_CREATOR(InterpBufCreator, OpType_Interp, BUFFER); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/buffer/InterpBufExecution.hpp b/source/backend/opencl/execution/buffer/InterpBufExecution.hpp index 1293e437d..fbdc2d5a4 100644 --- a/source/backend/opencl/execution/buffer/InterpBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/InterpBufExecution.hpp @@ -17,11 +17,12 @@ #include "core/Execution.hpp" #include "backend/opencl/core/OpenCLBackend.hpp" #include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" namespace MNN { namespace OpenCL { -class InterpBufExecution : public Execution { +class InterpBufExecution : public Execution, public CommonExtension { public: InterpBufExecution(const std::vector &inputs, const MNN::Op *op, Backend *backend); virtual ~InterpBufExecution() = default; diff --git a/source/backend/opencl/execution/buffer/LayerNormBufExecution.cpp b/source/backend/opencl/execution/buffer/LayerNormBufExecution.cpp index 8b894bae5..58cf0c2fd 100644 --- a/source/backend/opencl/execution/buffer/LayerNormBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/LayerNormBufExecution.cpp @@ -22,6 +22,8 @@ LayerNormBufExecution::LayerNormBufExecution(const std::vector &inputs epsilon_ = layer_norm_param->epsilon(); group_ = layer_norm_param->group(); auto bufferUnitSize = runtime->isSupportedFP16() ? sizeof(half_float::half) : sizeof(float); + auto kernel = runtime->buildKernel("layernorm_buf", "layernorm_w_buf", {"-DLOCAL_SIZE=512"}); + mMaxWorkGroupSize = static_cast(runtime->getMaxWorkGroupSize(kernel)); if(layer_norm_param->gamma() && layer_norm_param->beta()){ has_gamma_beta_ = true; @@ -88,6 +90,8 @@ ErrorCode LayerNormBufExecution::onResize(const std::vector &inputs, c Tensor *input = inputs[0]; Tensor *output = outputs[0]; auto runtime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); + auto MaxLocalSize = std::min(runtime->getMaxWorkItemSizes()[0], mMaxWorkGroupSize); + mOpenCLBackend->startRecord(mRecording); std::vector inputShape = tensorShapeFormat(input); std::vector outputShape = tensorShapeFormat(output); @@ -96,7 +100,6 @@ ErrorCode LayerNormBufExecution::onResize(const std::vector &inputs, c const int inputHeight = inputShape[1]; const int inputWidth = inputShape[2]; const int inputChannels = inputShape[3]; - auto MaxWorkItems = runtime->getMaxWorkItemSizes(); int local_size; int rank = inputs.at(0)->dimensions(); int outter_size = 1; @@ -116,7 +119,7 @@ ErrorCode LayerNormBufExecution::onResize(const std::vector &inputs, c std::string kernelName; if (inner_size == inputWidth && outter_size == inputBatch * inputHeight * inputChannels) { kernelName = "layernorm_w_buf"; - local_size = getLocalSize(inputWidth, MaxWorkItems[0]); + local_size = getLocalSize(inputWidth, MaxLocalSize); buildOptions.emplace("-DLOCAL_SIZE=" + std::to_string(local_size)); mKernel = runtime->buildKernel("layernorm_buf", kernelName, buildOptions); @@ -125,7 +128,7 @@ ErrorCode LayerNormBufExecution::onResize(const std::vector &inputs, c static_cast(inputBatch)}; }else if(inner_size == inputWidth * inputHeight && outter_size == inputBatch * inputChannels){ kernelName = "layernorm_hw_buf"; - local_size = getLocalSize(inputWidth * inputHeight, MaxWorkItems[0]); + local_size = getLocalSize(inputWidth * inputHeight, MaxLocalSize); buildOptions.emplace("-DLOCAL_SIZE=" + std::to_string(local_size)); mKernel = runtime->buildKernel("layernorm_buf", kernelName, buildOptions); @@ -134,7 +137,7 @@ ErrorCode LayerNormBufExecution::onResize(const std::vector &inputs, c static_cast(inputBatch)}; }else if(inner_size == inputWidth * inputHeight * inputChannels && outter_size == inputBatch){ kernelName = "layernorm_chw_buf"; - local_size = getLocalSize(inputWidth * inputHeight, MaxWorkItems[0]); + local_size = getLocalSize(inputWidth * inputHeight, MaxLocalSize); buildOptions.emplace("-DLOCAL_SIZE=" + std::to_string(local_size)); mKernel = runtime->buildKernel("layernorm_buf", kernelName, buildOptions); @@ -160,6 +163,8 @@ ErrorCode LayerNormBufExecution::onResize(const std::vector &inputs, c } ret |= mKernel.setArg(idx++, epsilon_); MNN_CHECK_CL_SUCCESS(ret, "setArg LayerNormBufExecution"); + mOpenCLBackend->recordKernel3d(mKernel, mGWS, mLWS); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; @@ -177,6 +182,14 @@ ErrorCode LayerNormBufExecution::onExecute(const std::vector &inputs, mOpenCLBackend->getOpenCLRuntime()->pushEvent({"LayerNormBuf", event}); #else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End LayerNormBufExecution onExecute... \n"); +#endif + return NO_ERROR; + } run3DKernelDefault(mKernel, mGWS, mLWS, mOpenCLBackend->getOpenCLRuntime()); #endif @@ -208,7 +221,7 @@ class LayerNormBufCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __LayerNormBuf_op_(OpType_LayerNorm, BUFFER); +REGISTER_OPENCL_OP_CREATOR(LayerNormBufCreator, OpType_LayerNorm, BUFFER); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/buffer/LayerNormBufExecution.hpp b/source/backend/opencl/execution/buffer/LayerNormBufExecution.hpp index f7c86498d..fde0680ea 100644 --- a/source/backend/opencl/execution/buffer/LayerNormBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/LayerNormBufExecution.hpp @@ -16,11 +16,12 @@ #include "core/Execution.hpp" #include "backend/opencl/core/OpenCLBackend.hpp" #include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" namespace MNN { namespace OpenCL { -class LayerNormBufExecution : public Execution { +class LayerNormBufExecution : public Execution, public CommonExtension { public: LayerNormBufExecution(const std::vector &inputs, const MNN::Op *op, Backend *backend); virtual ~LayerNormBufExecution() = default; @@ -42,6 +43,7 @@ class LayerNormBufExecution : public Execution { std::shared_ptr mGammaBuffer; std::shared_ptr mBetaBuffer; bool has_gamma_beta_ = false; + uint32_t mMaxWorkGroupSize; }; } // namespace OpenCL diff --git a/source/backend/opencl/execution/buffer/LoopBufExecution.cpp b/source/backend/opencl/execution/buffer/LoopBufExecution.cpp index ddbbccb18..a098e256c 100644 --- a/source/backend/opencl/execution/buffer/LoopBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/LoopBufExecution.cpp @@ -17,12 +17,12 @@ namespace OpenCL { static void _TileOrPackTensor(Tensor *input, Tensor *output, cl::Kernel& kernel, cl::NDRange &globalWorkSize, cl::NDRange &localWorkSize, const int Width, const int Height, const int Channel, - const int Batch, OpenCLRuntime *runTime, const std::string &KernelName, std::set buildOptions) { + const int Batch, OpenCLBackend *bn, const std::string &KernelName, std::set buildOptions) { if (TensorUtils::getDescribe(output)->dimensionFormat == MNN::MNN_DATA_FORMAT_NHWC || TensorUtils::getDescribe(input)->dimensionFormat == MNN::MNN_DATA_FORMAT_NHWC){ buildOptions.emplace("-DMNN_NHWC"); } - kernel = runTime->buildKernel("loop_buf", KernelName, buildOptions); - uint32_t mMaxWorkGroupSize = static_cast(runTime->getMaxWorkGroupSize(kernel)); + kernel = bn->getOpenCLRuntime()->buildKernel("loop_buf", KernelName, buildOptions); + uint32_t mMaxWorkGroupSize = static_cast(bn->getOpenCLRuntime()->getMaxWorkGroupSize(kernel)); std::vector mGlobalWorkSize = {(uint32_t)(Width * Height), (uint32_t)(UP_DIV(Channel, 4)), (uint32_t)(Batch)}; uint32_t index = 0; @@ -37,10 +37,11 @@ static void _TileOrPackTensor(Tensor *input, Tensor *output, cl::Kernel& kernel, ret |= kernel.setArg(index++, Channel); MNN_CHECK_CL_SUCCESS(ret, "setArg LoopBuf _TileOrPackTensor"); - std::vector mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, runTime, KernelName, kernel).first; + std::vector mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, bn->getOpenCLRuntime(), KernelName, kernel).first; globalWorkSize = {mGlobalWorkSize[0], mGlobalWorkSize[1], mGlobalWorkSize[2]}; localWorkSize = {mLocalWorkSize[0], mLocalWorkSize[1], mLocalWorkSize[2]}; + bn->recordKernel3d(kernel, mGlobalWorkSize, mLocalWorkSize); } static void _setTensorStack(std::vector &result, const std::vector &inputs, @@ -66,6 +67,7 @@ static void _setTensorStack(std::vector &result, const std::vectorcommands()->GetAs(0); OpenCLBackend *mOpenCLBackend = (OpenCLBackend *)backend(); auto runTime = mOpenCLBackend->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); _setTensorStack(mTensors, inputs, outputs, mLoop); mUnits.clear(); mOffsetTensors.clear(); @@ -99,7 +101,7 @@ static void _setTensorStack(std::vector &result, const std::vectoronAcquireBuffer(mTmpTensors[1].get(), Backend::DYNAMIC); Unit unit; - _TileOrPackTensor(mTensors[cmd->indexes()->data()[1]], mTmpTensors[1].get(), unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height,Channel, Batch, runTime, "tile_buf", mBuildOptions); + _TileOrPackTensor(mTensors[cmd->indexes()->data()[1]], mTmpTensors[1].get(), unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height,Channel, Batch, mOpenCLBackend, "tile_buf", mBuildOptions); mUnits.emplace_back(unit); } @@ -115,7 +117,7 @@ static void _setTensorStack(std::vector &result, const std::vectoronAcquireBuffer(mOffsetTensors.back().get(), Backend::DYNAMIC); Unit unit; - _TileOrPackTensor(input, mOffsetTensors.back().get(), unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, runTime, "tile_buf", mBuildOptions); + _TileOrPackTensor(input, mOffsetTensors.back().get(), unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, mOpenCLBackend, "tile_buf", mBuildOptions); mUnits.emplace_back(unit); } } @@ -158,6 +160,7 @@ static void _setTensorStack(std::vector &result, const std::vectorrecordKernel3d(unit.kernel, mGlobalWorkSize, mLocalWorkSize); } //pack output @@ -169,7 +172,7 @@ static void _setTensorStack(std::vector &result, const std::vectorindexes()->data()[0]], unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, runTime, "pack_buf", mBuildOptions); + _TileOrPackTensor(mTmpTensors[0].get(), mTensors[cmd->indexes()->data()[0]], unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, mOpenCLBackend, "pack_buf", mBuildOptions); mUnits.emplace_back(unit); } @@ -179,6 +182,7 @@ static void _setTensorStack(std::vector &result, const std::vectoronReleaseBuffer(mOffsetTensors[i].get(), Backend::DYNAMIC); } + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -197,6 +201,7 @@ ErrorCode LoopBatchMatMulBufExecution::onResize(const std::vector &inp auto cmd = mLoop->commands()->GetAs(0); OpenCLBackend *mOpenCLBackend = (OpenCLBackend *)backend(); auto runTime = mOpenCLBackend->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); _setTensorStack(mTensors, inputs, outputs, mLoop); mOffset[0] = cmd->view()->GetAs(0)->offset(); @@ -229,7 +234,7 @@ ErrorCode LoopBatchMatMulBufExecution::onResize(const std::vector &inp mOpenCLBackend->onAcquireBuffer(mTmpTensors[i].get(), Backend::DYNAMIC); Unit unit; - _TileOrPackTensor(input, mTmpTensors[i].get(), unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, runTime, "tile_buf", mBuildOptions); + _TileOrPackTensor(input, mTmpTensors[i].get(), unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, mOpenCLBackend, "tile_buf", mBuildOptions); mUnits.emplace_back(unit); } @@ -245,7 +250,7 @@ ErrorCode LoopBatchMatMulBufExecution::onResize(const std::vector &inp mOpenCLBackend->onAcquireBuffer(mOffsetTensors.back().get(), Backend::DYNAMIC); Unit unit; - _TileOrPackTensor(input, mOffsetTensors.back().get(), unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, runTime, "tile_buf", mBuildOptions); + _TileOrPackTensor(input, mOffsetTensors.back().get(), unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, mOpenCLBackend, "tile_buf", mBuildOptions); mUnits.emplace_back(unit); } } @@ -303,6 +308,7 @@ ErrorCode LoopBatchMatMulBufExecution::onResize(const std::vector &inp unit.globalWorkSize = {mGlobalWorkSize[0], mGlobalWorkSize[1], mGlobalWorkSize[2]}; unit.localWorkSize = {mLocalWorkSize[0], mLocalWorkSize[1], mLocalWorkSize[2]}; mUnits.emplace_back(unit); + mOpenCLBackend->recordKernel3d(unit.kernel, mGlobalWorkSize, mLocalWorkSize); } //pack output @@ -314,7 +320,7 @@ ErrorCode LoopBatchMatMulBufExecution::onResize(const std::vector &inp const int Height = Shape.at(1); const int Batch = Shape.at(0); Unit unit; - _TileOrPackTensor(mTmpTensors[0].get(), output, unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, runTime, "pack_buf", mBuildOptions); + _TileOrPackTensor(mTmpTensors[0].get(), output, unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, mOpenCLBackend, "pack_buf", mBuildOptions); mUnits.emplace_back(unit); } @@ -324,6 +330,7 @@ ErrorCode LoopBatchMatMulBufExecution::onResize(const std::vector &inp for (int i = 0; i < mOffsetTensors.size(); ++i) { mOpenCLBackend->onReleaseBuffer(mOffsetTensors[i].get(), Backend::DYNAMIC); } + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -340,6 +347,7 @@ ErrorCode LoopBinaryBufExecution::onResize(const std::vector &inputs, auto cmd = mLoop->commands()->GetAs(0); OpenCLBackend *mOpenCLBackend = (OpenCLBackend *)backend(); auto runTime = mOpenCLBackend->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); _setTensorStack(mTensors, inputs, outputs, mLoop); mUnits.clear(); @@ -389,6 +397,8 @@ ErrorCode LoopBinaryBufExecution::onResize(const std::vector &inputs, unit.globalWorkSize = {mGlobalWorkSize[0], mGlobalWorkSize[1], mGlobalWorkSize[2]}; unit.localWorkSize = {mLocalWorkSize[0], mLocalWorkSize[1], mLocalWorkSize[2]}; mUnits.emplace_back(unit); + mOpenCLBackend->recordKernel3d(unit.kernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -467,7 +477,7 @@ class LoopBufCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __LoopBuf_op(OpType_While, BUFFER); +REGISTER_OPENCL_OP_CREATOR(LoopBufCreator, OpType_While, BUFFER); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/buffer/MatmulBufExecution.cpp b/source/backend/opencl/execution/buffer/MatmulBufExecution.cpp index 96cbfb70d..7e3f3ed63 100644 --- a/source/backend/opencl/execution/buffer/MatmulBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/MatmulBufExecution.cpp @@ -20,6 +20,7 @@ MatMulBufExecution::MatMulBufExecution(const std::vector &inputs, cons } ErrorCode MatMulBufExecution::onResize(const std::vector &inputs, const std::vector &outputs) { auto runtime = mOpenCLBackend->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); Tensor *input0 = inputs[0]; Tensor *input1 = inputs[1]; @@ -99,6 +100,8 @@ ErrorCode MatMulBufExecution::onResize(const std::vector &inputs, cons MNN_CHECK_CL_SUCCESS(ret, "setArg MatMulBufExecution"); mLocalWorkSize = localWS2DDefault(mGlobalWorkSize, mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), mKernelName, mKernel).first; } + mOpenCLBackend->recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -116,6 +119,14 @@ ErrorCode MatMulBufExecution::onExecute(const std::vector &inputs, con mOpenCLBackend->getOpenCLRuntime()->pushEvent({"MatmulBuf", event}); #else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End MatMulBufExecution onExecute... \n"); +#endif + return NO_ERROR; + } runKernel2D(mKernel, mGlobalWorkSize, mLocalWorkSize, runtime, nullptr); #endif @@ -140,7 +151,7 @@ class MatMulBufCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __matmulBuf_op(OpType_MatMul, BUFFER); +REGISTER_OPENCL_OP_CREATOR(MatMulBufCreator, OpType_MatMul, BUFFER); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/buffer/MatmulBufExecution.hpp b/source/backend/opencl/execution/buffer/MatmulBufExecution.hpp index e16076b4b..0190ce098 100644 --- a/source/backend/opencl/execution/buffer/MatmulBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/MatmulBufExecution.hpp @@ -14,11 +14,12 @@ #include "core/Execution.hpp" #include "backend/opencl/core/OpenCLBackend.hpp" #include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" namespace MNN { namespace OpenCL { -class MatMulBufExecution : public Execution { +class MatMulBufExecution : public Execution, public CommonExtension { public: MatMulBufExecution(const std::vector &inputs, const MNN::Op *op, Backend *backend, bool transposeA, bool transposeB); virtual ~MatMulBufExecution() = default; diff --git a/source/backend/opencl/execution/buffer/PoolBufExecution.cpp b/source/backend/opencl/execution/buffer/PoolBufExecution.cpp index ba7560d5b..577ec3c0b 100644 --- a/source/backend/opencl/execution/buffer/PoolBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/PoolBufExecution.cpp @@ -50,6 +50,7 @@ ErrorCode PoolBufExecution::onResize(const std::vector &inputs, const return SubgrouponResize(inputs, outputs); } #endif /* MNN_SUPPORT_INTEL_SUBGROUP */ + mOpenCLBackend->startRecord(mRecording); if (mPoolParams->isGlobal()) { std::vector inputShape = tensorShapeFormat(inputs[0]); mKernels = {inputShape.at(1), inputShape.at(2)}; @@ -141,7 +142,9 @@ ErrorCode PoolBufExecution::onResize(const std::vector &inputs, const std::string kernelNameTune = "pooling_buf"; mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), kernelNameTune, mKernel).first; - + + mOpenCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("end PoolBufExecution onResize !\n"); #endif @@ -157,6 +160,9 @@ ErrorCode PoolBufExecution::SubgrouponResize(const std::vector &inputs auto output = outputs[0]; bool returnRedice = outputs.size() == 2; auto redice = returnRedice ? outputs[1] : outputs[0]; + + auto runtime = mOpenCLBackend->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); if (mPoolParams->isGlobal()) { std::vector inputShape = tensorShapeFormat(inputs[0]); @@ -202,7 +208,6 @@ ErrorCode PoolBufExecution::SubgrouponResize(const std::vector &inputs std::set buildOptions; std::string KernelName = "pooling_c" + std::to_string(input_c_pack) + "_c" + std::to_string(output_c_pack); - auto runtime = mOpenCLBackend->getOpenCLRuntime(); if (mPoolType == PoolType_AVEPOOL) { buildOptions.emplace("-DPOOL_AVG"); @@ -262,6 +267,8 @@ ErrorCode PoolBufExecution::SubgrouponResize(const std::vector &inputs } else { mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), kernelNameTune, mKernel).first; } + mOpenCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("end PoolBufExecution onResize !\n"); @@ -282,6 +289,14 @@ ErrorCode PoolBufExecution::onExecute(const std::vector &inputs, const mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Pooling", event}); #else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End PoolBufExecution onExecute... \n"); +#endif + return NO_ERROR; + } run3DKernelDefault(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); #endif @@ -292,7 +307,9 @@ ErrorCode PoolBufExecution::onExecute(const std::vector &inputs, const return NO_ERROR; } -OpenCLCreatorRegister> __PoolBuf_op(OpType_Pooling, BUFFER); +using PoolBufCreator = TypedCreator; +REGISTER_OPENCL_OP_CREATOR(PoolBufCreator, OpType_Pooling, BUFFER); + } // namespace OpenCL } // namespace MNN #endif /* MNN_OPENCL_BUFFER_CLOSED */ diff --git a/source/backend/opencl/execution/buffer/PoolBufExecution.hpp b/source/backend/opencl/execution/buffer/PoolBufExecution.hpp index f3263243e..4132da606 100644 --- a/source/backend/opencl/execution/buffer/PoolBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/PoolBufExecution.hpp @@ -17,10 +17,11 @@ #include "core/Execution.hpp" #include "backend/opencl/core/OpenCLBackend.hpp" #include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" namespace MNN { namespace OpenCL { -class PoolBufExecution : public Execution { +class PoolBufExecution : public Execution, public CommonExtension { public: PoolBufExecution(const std::vector &inputs, const MNN::Op *op, Backend *backend); virtual ~PoolBufExecution() = default; diff --git a/source/backend/opencl/execution/buffer/RangeBufExecution.cpp b/source/backend/opencl/execution/buffer/RangeBufExecution.cpp index 0ea3ddcc6..0f2c9c414 100644 --- a/source/backend/opencl/execution/buffer/RangeBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/RangeBufExecution.cpp @@ -22,6 +22,7 @@ RangeBufExecution::RangeBufExecution(const std::string &compute, Backend* backen ErrorCode RangeBufExecution::onResize(const std::vector& inputs, const std::vector& outputs) { auto openCLBackend = static_cast(backend()); auto runtime = openCLBackend->getOpenCLRuntime(); + openCLBackend->startRecord(mRecording); mKernel = runtime->buildKernel("range_buf", "range_buf", mBuildOptions); mMaxWorkGroupSize = static_cast(runtime->getMaxWorkGroupSize(mKernel)); @@ -55,6 +56,8 @@ ErrorCode RangeBufExecution::onResize(const std::vector& inputs, const std::string kernelName = "range_buf"; mLocalSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, openCLBackend->getOpenCLRuntime(), kernelName, mKernel).first; + openCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalSize); + openCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -71,6 +74,14 @@ ErrorCode RangeBufExecution::onExecute(const std::vector& inputs, const mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Range", event}); #else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End RangeBufExecution onExecute... \n"); +#endif + return NO_ERROR; + } run3DKernelDefault(mKernel, mGlobalWorkSize, mLocalSize, mOpenCLBackend->getOpenCLRuntime()); #endif @@ -103,7 +114,8 @@ class RangeBufCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __RangeBuf__(OpType_Range, BUFFER); +REGISTER_OPENCL_OP_CREATOR(RangeBufCreator, OpType_Range, BUFFER); + } // namespace OpenCL } // namespace MNN #endif /* MNN_OPENCL_BUFFER_CLOSED */ diff --git a/source/backend/opencl/execution/buffer/RangeBufExecution.hpp b/source/backend/opencl/execution/buffer/RangeBufExecution.hpp index 6cabb7f0e..49d1126b3 100644 --- a/source/backend/opencl/execution/buffer/RangeBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/RangeBufExecution.hpp @@ -16,11 +16,12 @@ #include "MNN_generated.h" #include "backend/opencl/core/OpenCLBackend.hpp" #include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" namespace MNN { namespace OpenCL { -class RangeBufExecution : public Execution { +class RangeBufExecution : public Execution, public CommonExtension { public: RangeBufExecution(const std::string &compute, Backend *backend); virtual ~RangeBufExecution() = default; diff --git a/source/backend/opencl/execution/buffer/RasterBufExecution.cpp b/source/backend/opencl/execution/buffer/RasterBufExecution.cpp index c36200428..e3c521f86 100644 --- a/source/backend/opencl/execution/buffer/RasterBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/RasterBufExecution.cpp @@ -38,7 +38,9 @@ ErrorCode RasterBufExecution::onResize(const std::vector &____inputs, auto outputDes = TensorUtils::getDescribe(output); mNeedZero = !TensorUtils::regionIsFull(output); auto regionNum = des->regions.size(); - auto runtime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); + auto mOpenCLBackend = static_cast(backend()); + auto runtime = mOpenCLBackend->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); mFast = false; if (outputDes->dimensionFormat == MNN_DATA_FORMAT_NC4HW4) { @@ -83,6 +85,8 @@ ErrorCode RasterBufExecution::onResize(const std::vector &____inputs, { MNN_PRINT("setArg err %d\n", (int)ret); } + mOpenCLBackend->recordKernel2d(unit.kernel, {(uint32_t)UP_DIV((region[2] * region[3]), 8)*8, + (uint32_t)UP_DIV((region[0] * region[1]), 8)*8}, {8, 8}); } // nc4hw4 buffer raster @@ -135,6 +139,7 @@ ErrorCode RasterBufExecution::onResize(const std::vector &____inputs, unit.globalWorkSize = {ROUND_UP(gws[0], std::max((uint32_t)1, lws[0])), ROUND_UP(gws[1], std::max((uint32_t)1, lws[1])), ROUND_UP(gws[2], std::max((uint32_t)1, lws[2]))}; + mOpenCLBackend->recordKernel3d(unit.kernel, gws, lws); } if(mNeedZero) { @@ -144,6 +149,7 @@ ErrorCode RasterBufExecution::onResize(const std::vector &____inputs, { MNN_ASSERT((regionNum==kernel_idx)); } + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -200,6 +206,8 @@ ErrorCode RasterBufExecution::onResize(const std::vector &____inputs, { MNN_PRINT("setArg err %d\n", (int)ret); } + mOpenCLBackend->recordKernel2d(unit.kernel, {(uint32_t)UP_DIV((region[2] * region[3]), 8)*8, + (uint32_t)UP_DIV((region[0] * region[1]), 8)*8}, {8, 8}); } // nc4hw4 buffer to buffer @@ -242,6 +250,8 @@ ErrorCode RasterBufExecution::onResize(const std::vector &____inputs, { MNN_PRINT("setArg err %d\n", (int)ret); } + mOpenCLBackend->recordKernel2d(unit.kernel, {(uint32_t)UP_DIV(region[3] * region[1], 16) * 16, + (uint32_t)UP_DIV(region[2] * region[0], 16) * 16}, {16, 16}); } // buffer raster @@ -295,7 +305,7 @@ ErrorCode RasterBufExecution::onResize(const std::vector &____inputs, unit.globalWorkSize = {ROUND_UP(gws[0], std::max((uint32_t)1, lws[0])), ROUND_UP(gws[1], std::max((uint32_t)1, lws[1])), ROUND_UP(gws[2], std::max((uint32_t)1, lws[2]))}; - recordKernel3d(unit.kernel, gws, lws, runtime); + mOpenCLBackend->recordKernel3d(unit.kernel, gws, lws); }else{ for (auto& slice : des->regions) { @@ -335,6 +345,7 @@ ErrorCode RasterBufExecution::onResize(const std::vector &____inputs, unit.globalWorkSize = {ROUND_UP(gws[0], std::max((uint32_t)1, lws[0])), ROUND_UP(gws[1], std::max((uint32_t)1, lws[1])), ROUND_UP(gws[2], std::max((uint32_t)1, lws[2]))}; + mOpenCLBackend->recordKernel3d(unit.kernel, gws, lws); } } @@ -373,6 +384,8 @@ ErrorCode RasterBufExecution::onResize(const std::vector &____inputs, { MNN_PRINT("setArg err %d\n", (int)ret); } + mOpenCLBackend->recordKernel2d(unit.kernel, {(uint32_t)UP_DIV(region[3] * region[1], 16) * 16, + (uint32_t)UP_DIV(region[2] * region[0], 16) * 16}, {16, 16}); } //kernel num check @@ -385,15 +398,16 @@ ErrorCode RasterBufExecution::onResize(const std::vector &____inputs, MNN_ASSERT((kernel_idx==regionNum + originNum + 1)); } + mOpenCLBackend->endRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("end RasterBufExecution onResize !\n"); #endif return NO_ERROR; } -class RasterCreator : public OpenCLBackend::Creator { +class RasterBufCreator : public OpenCLBackend::Creator { public: - virtual ~RasterCreator() = default; + virtual ~RasterBufCreator() = default; virtual Execution *onCreate(const std::vector &inputs, const std::vector &outputs, const MNN::Op *op, Backend *backend) const override { for (int i = 0; i < inputs.size(); ++i) { @@ -444,7 +458,8 @@ bool RasterBufExecution::CanCombine(const std::vector &outputs){ return res; } -OpenCLCreatorRegister __RasterBuf_op(OpType_Raster, BUFFER); +REGISTER_OPENCL_OP_CREATOR(RasterBufCreator, OpType_Raster, BUFFER); + } // namespace OpenCL } // namespace MNN #endif /* MNN_OPENCL_BUFFER_CLOSED */ diff --git a/source/backend/opencl/execution/buffer/ReductionBufExecution.cpp b/source/backend/opencl/execution/buffer/ReductionBufExecution.cpp index 04c4e24c5..19a25dc41 100644 --- a/source/backend/opencl/execution/buffer/ReductionBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/ReductionBufExecution.cpp @@ -41,6 +41,8 @@ ReductionBufExecution::ReductionBufExecution(const MNN::Op* op, Backend* backend MNN_ASSERT(false); break; } + auto kernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("reduction_buf", "reduct_width_buf", {"-DOPERATE(a,b)=(a+b)","-DVALUE=0","-DLOCAL_SIZE=512"}); + mMaxWorkGroupSize = static_cast(mOpenCLBackend->getOpenCLRuntime()->getMaxWorkGroupSize(kernel)); #ifdef LOG_VERBOSE MNN_PRINT("end ReductionBufExecution init !\n"); #endif @@ -59,6 +61,8 @@ ErrorCode ReductionBufExecution::onResize(const std::vector &inputs, c auto openCLBackend = static_cast(backend()); auto runtime = openCLBackend->getOpenCLRuntime(); + openCLBackend->startRecord(mRecording); + auto MaxLocalSize = std::min(runtime->getMaxWorkItemSizes()[0], mMaxWorkGroupSize); auto input = inputs[0]; auto output = outputs[0]; if(mAxis < 0){ @@ -74,7 +78,6 @@ ErrorCode ReductionBufExecution::onResize(const std::vector &inputs, c } int dim = input->length(mAxis); int local_size = 0; - auto MaxWorkItems = runtime->getMaxWorkItemSizes(); if(dim >= 16){ mUseLocal = true; @@ -130,15 +133,15 @@ ErrorCode ReductionBufExecution::onResize(const std::vector &inputs, c if(mUseLocal){ if(batch * inputHeight * inputChannels == outside && 1 == inside && dim == inputWidth){ - local_size = getLocalSize(inputWidth, MaxWorkItems[0]); + local_size = getLocalSize(inputWidth, MaxLocalSize); buildOption.emplace("-DLOCAL_SIZE=" + std::to_string(local_size)); mReduct1DKernel = runtime->buildKernel("reduction_buf", "reduct_width_buf", buildOption); }else if(batch * inputChannels == outside && inputWidth == inside && dim == inputHeight){ - local_size = getLocalSize(inputHeight, MaxWorkItems[0]); + local_size = getLocalSize(inputHeight, MaxLocalSize); buildOption.emplace("-DLOCAL_SIZE=" + std::to_string(local_size)); mReduct1DKernel = runtime->buildKernel("reduction_buf", "reduct_height_buf", buildOption); }else if(batch == outside && inputWidth * inputHeight == inside && dim == inputChannels){ - local_size = getLocalSize(inputChannelBlocks - 1, MaxWorkItems[0]); + local_size = getLocalSize(inputChannelBlocks - 1, MaxLocalSize); buildOption.emplace("-DLOCAL_SIZE=" + std::to_string(local_size)); if(output->buffer().dimensions == 1){ mReduct1DKernel = runtime->buildKernel("reduction_buf", "reduct_channel_dim1_buf", buildOption); @@ -147,7 +150,7 @@ ErrorCode ReductionBufExecution::onResize(const std::vector &inputs, c } mGlobalWorkSize[2] = static_cast(outputBatch * outputChannels); }else if(1 == outside && inputWidth * inputHeight * inputChannels == inside && dim == batch){ - local_size = getLocalSize(batch, MaxWorkItems[0]); + local_size = getLocalSize(batch, MaxLocalSize); buildOption.emplace("-DLOCAL_SIZE=" + std::to_string(local_size)); mReduct1DKernel = runtime->buildKernel("reduction_buf", "reduct_batch_buf", buildOption); } @@ -193,10 +196,12 @@ ErrorCode ReductionBufExecution::onResize(const std::vector &inputs, c if(mUseLocal){ mLocalWorkSize = {static_cast(local_size), 1, 1}; }else{ - auto MaxWorkGroupSize = static_cast(runtime->getMaxWorkGroupSize(mReduct1DKernel)); + mMaxWorkGroupSize = static_cast(runtime->getMaxWorkGroupSize(mReduct1DKernel)); std::string kernelName = "reduct_buf"; - mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, MaxWorkGroupSize, openCLBackend->getOpenCLRuntime(), kernelName, mReduct1DKernel).first; + mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, openCLBackend->getOpenCLRuntime(), kernelName, mReduct1DKernel).first; } + openCLBackend->recordKernel3d(mReduct1DKernel, mGlobalWorkSize, mLocalWorkSize); + openCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -212,6 +217,14 @@ ErrorCode ReductionBufExecution::onExecute(const std::vector &inputs, mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Reduct1D", event}); #else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End ReductionBufExecution onExecute... \n"); +#endif + return NO_ERROR; + } run3DKernelDefault(mReduct1DKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); #endif @@ -261,7 +274,8 @@ class ReductionBufCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __reductionBuf_op(OpType_Reduction, BUFFER); +REGISTER_OPENCL_OP_CREATOR(ReductionBufCreator, OpType_Reduction, BUFFER); + } // namespace OpenCL } // namespace MNN #endif /* MNN_OPENCL_BUFFER_CLOSED */ diff --git a/source/backend/opencl/execution/buffer/ReductionBufExecution.hpp b/source/backend/opencl/execution/buffer/ReductionBufExecution.hpp index c9c2462b5..d7636fca5 100644 --- a/source/backend/opencl/execution/buffer/ReductionBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/ReductionBufExecution.hpp @@ -40,6 +40,7 @@ class ReductionBufExecution : public CommonExecution { std::vector mGlobalWorkSize = {1, 1, 1}; std::vector mLocalWorkSize{1, 1, 1}; bool mUseLocal = false; + uint32_t mMaxWorkGroupSize; }; } // namespace OpenCL diff --git a/source/backend/opencl/execution/buffer/ReluBufExecution.cpp b/source/backend/opencl/execution/buffer/ReluBufExecution.cpp index 26811d311..64873599b 100644 --- a/source/backend/opencl/execution/buffer/ReluBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/ReluBufExecution.cpp @@ -72,7 +72,7 @@ ErrorCode ReluBufExecution::onResize(const std::vector &inputs, const return SubgrouponResize(inputs, outputs); } #endif /* MNN_SUPPORT_INTEL_SUBGROUP */ - + mOpenCLBackend->startRecord(mRecording); mUnits[0].kernel = runTime->buildKernel("binary_buf", "prelu_buf", {"-DOPERATOR=select(in0*in1,in0,in0>=(FLOAT4)0)"}); mMaxWorkGroupSize = static_cast(runTime->getMaxWorkGroupSize(mUnits[0].kernel)); int fullCount[2] = {1, 1}; @@ -92,6 +92,8 @@ ErrorCode ReluBufExecution::onResize(const std::vector &inputs, const mUnits[0].globalWorkSize = {globalSize[0], globalSize[1]}; mUnits[0].localWorkSize = {localSize[0], localSize[1]}; + mOpenCLBackend->recordKernel2d(mUnits[0].kernel, globalSize, localSize); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -102,6 +104,7 @@ ErrorCode ReluBufExecution::SubgrouponResize(const std::vector &inputs int nhwcArray[4] = {nhwc[0], nhwc[1], nhwc[2], nhwc[3]}; auto runTime = mOpenCLBackend->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); int input_c_pack = TensorUtils::getTensorChannelPack(inputs[0]); int output_c_pack = TensorUtils::getTensorChannelPack(outputs[0]); auto inputpad = TensorUtils::getDescribe(inputs[0])->mPads; @@ -116,10 +119,11 @@ ErrorCode ReluBufExecution::SubgrouponResize(const std::vector &inputs uint32_t index = 0; cl_int ret = CL_SUCCESS; + std::vector gws = {(uint32_t)nhwc[2] * nhwc[1], (uint32_t)UP_DIV(nhwc[3], 4), + (uint32_t)nhwc[0]}; + std::vector lws = {1, 16, 1}; if (input_c_pack == 4) { - std::vector globalSize = {(uint32_t)nhwc[2] * nhwc[1], (uint32_t)UP_DIV(nhwc[3], 4), - (uint32_t)nhwc[0]}; - mUnits[0].globalWorkSize = {globalSize[0], globalSize[1], globalSize[2]}; + mUnits[0].globalWorkSize = {gws[0], gws[1], gws[2]}; ret |= mUnits[0].kernel.setArg(index++, mUnits[0].globalWorkSize[0]); ret |= mUnits[0].kernel.setArg(index++, mUnits[0].globalWorkSize[1]); ret |= mUnits[0].kernel.setArg(index++, mUnits[0].globalWorkSize[2]); @@ -133,12 +137,13 @@ ErrorCode ReluBufExecution::SubgrouponResize(const std::vector &inputs ret |= mUnits[0].kernel.setArg(index++, static_cast(outputpad.right)); MNN_CHECK_CL_SUCCESS(ret, "setArg ReluBufExecution SubGroup C4"); - auto lws = localWS3DDefault(globalSize, mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), kernelName, mUnits[0].kernel).first; + lws = localWS3DDefault(gws, mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), kernelName, mUnits[0].kernel).first; mUnits[0].localWorkSize = {lws[0], lws[1], lws[2]}; } else { - mUnits[0].globalWorkSize = {(uint32_t)UP_DIV(nhwc[2], 4) * nhwc[1], (uint32_t)ROUND_UP(nhwc[3], 16), - (uint32_t)nhwc[0]}; - mUnits[0].localWorkSize = {1, 16, 1}; + gws = {(uint32_t)UP_DIV(nhwc[2], 4) * nhwc[1], (uint32_t)ROUND_UP(nhwc[3], 16), + (uint32_t)nhwc[0]}; + mUnits[0].globalWorkSize = {gws[0], gws[1], gws[2]}; + mUnits[0].localWorkSize = {lws[0], lws[1], lws[2]}; ret |= mUnits[0].kernel.setArg(index++, mUnits[0].globalWorkSize[0]); ret |= mUnits[0].kernel.setArg(index++, mUnits[0].globalWorkSize[1]); @@ -153,6 +158,8 @@ ErrorCode ReluBufExecution::SubgrouponResize(const std::vector &inputs ret |= mUnits[0].kernel.setArg(index++, static_cast(outputpad.right)); MNN_CHECK_CL_SUCCESS(ret, "setArg ReluBufExecution SubGroup"); } + mOpenCLBackend->recordKernel3d(mUnits[0].kernel, gws, lws); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } #endif /* MNN_SUPPORT_INTEL_SUBGROUP */ @@ -225,9 +232,9 @@ class ReluBufCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __ReluBuf_op(OpType_ReLU, BUFFER); -OpenCLCreatorRegister __PReluBuf_op(OpType_PReLU, BUFFER); -OpenCLCreatorRegister __Relu6Buf_op(OpType_ReLU6, BUFFER); +REGISTER_OPENCL_OP_CREATOR(ReluBufCreator, OpType_ReLU, BUFFER); +REGISTER_OPENCL_OP_CREATOR(ReluBufCreator, OpType_PReLU, BUFFER); +REGISTER_OPENCL_OP_CREATOR(ReluBufCreator, OpType_ReLU6, BUFFER); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/buffer/ScaleBufExecution.cpp b/source/backend/opencl/execution/buffer/ScaleBufExecution.cpp index bfdeabb4d..2902e3191 100644 --- a/source/backend/opencl/execution/buffer/ScaleBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/ScaleBufExecution.cpp @@ -119,6 +119,8 @@ ErrorCode ScaleBufExecution::onResize(const std::vector &inputs, const #endif std::vector inputShape = tensorShapeFormat(inputs[0]); + auto runtime = mOpenCLBackend->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); const int batch = inputShape.at(0); const int height = inputShape.at(1); @@ -147,6 +149,8 @@ ErrorCode ScaleBufExecution::onResize(const std::vector &inputs, const std::string name = "scale_buf"; mLocalWorkSize = localWS2DDefault(mGlobalWorkSize, mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), name, mKernel).first; + mOpenCLBackend->recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -162,6 +166,14 @@ ErrorCode ScaleBufExecution::onExecute(const std::vector &inputs, cons mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Scale", event}); #else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End ScaleBufExecution onExecute... \n"); +#endif + return NO_ERROR; + } runKernel2D(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); #endif @@ -187,7 +199,7 @@ class ScaleBufCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __scaleBuf_op(OpType_Scale, BUFFER); +REGISTER_OPENCL_OP_CREATOR(ScaleBufCreator, OpType_Scale, BUFFER); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/buffer/ScaleBufExecution.hpp b/source/backend/opencl/execution/buffer/ScaleBufExecution.hpp index 2d038b163..832b2d634 100644 --- a/source/backend/opencl/execution/buffer/ScaleBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/ScaleBufExecution.hpp @@ -17,11 +17,12 @@ #include "core/Execution.hpp" #include "backend/opencl/core/OpenCLBackend.hpp" #include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" namespace MNN { namespace OpenCL { -class ScaleBufExecution : public Execution { +class ScaleBufExecution : public Execution, public CommonExtension { public: ScaleBufExecution(const std::vector &inputs, const MNN::Op *op, Backend *backend); virtual ~ScaleBufExecution(); diff --git a/source/backend/opencl/execution/buffer/SelectBufExecution.cpp b/source/backend/opencl/execution/buffer/SelectBufExecution.cpp index b0eb994ad..ff91f0144 100644 --- a/source/backend/opencl/execution/buffer/SelectBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/SelectBufExecution.cpp @@ -23,6 +23,7 @@ ErrorCode SelectBufExecution::onResize(const std::vector& inputs, const auto inSize2 = inputs[2]->elementSize(); auto openCLBackend = static_cast(backend()); auto runtime = openCLBackend->getOpenCLRuntime(); + openCLBackend->startRecord(mRecording); if(inSize1 == 1) mBuildOptions.emplace("-DINSIZE1_EUQAL_1"); if(inSize2 == 1) @@ -56,6 +57,8 @@ ErrorCode SelectBufExecution::onResize(const std::vector& inputs, const std::string kernelName = "select_buf"; mLocalSize = localWS2DDefault(mGlobalWorkSize, mMaxWorkGroupSize, openCLBackend->getOpenCLRuntime(), kernelName, mKernel).first; + openCLBackend->recordKernel2d(mKernel, mGlobalWorkSize, mLocalSize); + openCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -72,6 +75,14 @@ ErrorCode SelectBufExecution::onExecute(const std::vector& inputs, cons mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Select", event}); #else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End SelectBufExecution onExecute... \n"); +#endif + return NO_ERROR; + } runKernel2D(mKernel, mGlobalWorkSize, mLocalSize, mOpenCLBackend->getOpenCLRuntime()); #endif @@ -96,7 +107,8 @@ class SelectBufCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __SelectBuf__(OpType_Select, BUFFER); +REGISTER_OPENCL_OP_CREATOR(SelectBufCreator, OpType_Select, BUFFER); + } // namespace OpenCL } // namespace MNN #endif /* MNN_OPENCL_BUFFER_CLOSED */ diff --git a/source/backend/opencl/execution/buffer/SelectBufExecution.hpp b/source/backend/opencl/execution/buffer/SelectBufExecution.hpp index 4271ad6fe..db8351950 100644 --- a/source/backend/opencl/execution/buffer/SelectBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/SelectBufExecution.hpp @@ -16,11 +16,12 @@ #include "MNN_generated.h" #include "backend/opencl/core/OpenCLBackend.hpp" #include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" namespace MNN { namespace OpenCL { -class SelectBufExecution : public Execution { +class SelectBufExecution : public Execution, public CommonExtension { public: SelectBufExecution(Backend *backend); virtual ~SelectBufExecution() = default; diff --git a/source/backend/opencl/execution/buffer/SoftmaxBufExecution.cpp b/source/backend/opencl/execution/buffer/SoftmaxBufExecution.cpp index 1906850a2..103a281cc 100644 --- a/source/backend/opencl/execution/buffer/SoftmaxBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/SoftmaxBufExecution.cpp @@ -19,6 +19,8 @@ SoftmaxBufExecution::SoftmaxBufExecution(const std::vector &inputs, in : Execution(backend) { mAxis = axis; mOpenCLBackend = static_cast(backend); + auto kernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("softmax_buf", "softmax_channel", {"-DSOFTMAX_LOCAL_SIZE=512"}); + mMaxWorkGroupSize = static_cast(mOpenCLBackend->getOpenCLRuntime()->getMaxWorkGroupSize(kernel)); } bool SoftmaxBufExecution::buildSoftmaxKernel(int localSize) { @@ -53,6 +55,9 @@ ErrorCode SoftmaxBufExecution::onResize(const std::vector &inputs, con Tensor *output = outputs[0]; const auto dims = input->buffer().dimensions; + auto runtime = mOpenCLBackend->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); + auto MaxLocalSize = std::min(runtime->getMaxWorkItemSizes()[0], mMaxWorkGroupSize); int inside = 1; int outside = 1; int channel = 1; @@ -79,14 +84,13 @@ ErrorCode SoftmaxBufExecution::onResize(const std::vector &inputs, con const int channelBlocks = UP_DIV(outputChannels, 4); const int remainChannels = channelBlocks * 4 - outputChannels; - auto MaxWorkItems = mOpenCLBackend->getOpenCLRuntime()->getMaxWorkItemSizes(); - int localSize = getLocalSize(channel, MaxWorkItems[0]); + int localSize = getLocalSize(channel, MaxLocalSize); if(localSize < 4){ localSize = 1; } if(inputBatch == outside && channel == inputChannels && inside == inputWidth * inputHeight){ mAxis = 1; - localSize = getLocalSize(channelBlocks, MaxWorkItems[0]); + localSize = getLocalSize(channelBlocks, MaxLocalSize); }else if(inputBatch * inputChannels == outside && channel == inputHeight && inside == inputWidth){ mAxis = 2; }else if(inputBatch * inputChannels * inputHeight == outside && channel == inputWidth && inside == 1){ @@ -120,6 +124,9 @@ ErrorCode SoftmaxBufExecution::onResize(const std::vector &inputs, con if(localSize == 1){ mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), "softmax_buf", mKernel).first; } + + mOpenCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -135,6 +142,14 @@ ErrorCode SoftmaxBufExecution::onExecute(const std::vector &inputs, co mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Softmax", event}); #else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End SelectBufExecution onExecute... \n"); +#endif + return NO_ERROR; + } run3DKernelDefault(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); #endif @@ -182,7 +197,7 @@ class SoftmaxBufCreator : public OpenCLBackend::Creator { } } }; -OpenCLCreatorRegister __SoftmaxBuf_op(OpType_Softmax, BUFFER); +REGISTER_OPENCL_OP_CREATOR(SoftmaxBufCreator, OpType_Softmax, BUFFER); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/buffer/SoftmaxBufExecution.hpp b/source/backend/opencl/execution/buffer/SoftmaxBufExecution.hpp index 9a9044bbc..dcc87f6c7 100644 --- a/source/backend/opencl/execution/buffer/SoftmaxBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/SoftmaxBufExecution.hpp @@ -14,11 +14,12 @@ #include #include "core/Execution.hpp" #include "backend/opencl/core/OpenCLBackend.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" namespace MNN { namespace OpenCL { -class SoftmaxBufExecution : public Execution { +class SoftmaxBufExecution : public Execution, public CommonExtension { public: SoftmaxBufExecution(const std::vector &inputs, int axis, Backend *backend); diff --git a/source/backend/opencl/execution/buffer/UnaryBufExecution.cpp b/source/backend/opencl/execution/buffer/UnaryBufExecution.cpp index 9ff26f4cc..18ac68319 100644 --- a/source/backend/opencl/execution/buffer/UnaryBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/UnaryBufExecution.cpp @@ -33,6 +33,7 @@ ErrorCode UnaryBufExecution::onResize(const std::vector& inputs, const return SubgrouponResize(inputs, outputs); } #endif /* MNN_SUPPORT_INTEL_SUBGROUP */ + openCLBackend->startRecord(mRecording); mKernel = runtime->buildKernel("unary_buf", "unary_buf", mBuildOptions); mMaxWorkGroupSize = static_cast(runtime->getMaxWorkGroupSize(mKernel)); @@ -64,6 +65,8 @@ ErrorCode UnaryBufExecution::onResize(const std::vector& inputs, const std::string kernelName = "unary_buf"; mLocalSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, openCLBackend->getOpenCLRuntime(), kernelName, mKernel).first; + openCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalSize); + openCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -73,6 +76,7 @@ ErrorCode UnaryBufExecution::SubgrouponResize(const std::vector& inputs Tensor* output = outputs[0]; auto openCLBackend = static_cast(backend()); auto runtime = openCLBackend->getOpenCLRuntime(); + openCLBackend->startRecord(mRecording); std::vector inputShape = tensorShapeFormat(input); std::vector outputShape = tensorShapeFormat(output); @@ -126,6 +130,8 @@ ErrorCode UnaryBufExecution::SubgrouponResize(const std::vector& inputs } else { mLocalSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, openCLBackend->getOpenCLRuntime(), kernelName, mKernel).first; } + openCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalSize); + openCLBackend->endRecord(mRecording); return NO_ERROR; } #endif /* MNN_SUPPORT_INTEL_SUBGROUP */ @@ -143,6 +149,14 @@ ErrorCode UnaryBufExecution::onExecute(const std::vector& inputs, const mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Unary", event}); #else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End UnaryBufExecution onExecute... \n"); +#endif + return NO_ERROR; + } run3DKernelDefault(mKernel, mGlobalWorkSize, mLocalSize, mOpenCLBackend->getOpenCLRuntime()); #endif @@ -240,9 +254,10 @@ class UnaryBufCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __UnaryBuf__(OpType_UnaryOp, BUFFER); -OpenCLCreatorRegister __SigmoidBuf__(OpType_Sigmoid, BUFFER); -OpenCLCreatorRegister __TanhBuf__(OpType_TanH, BUFFER); +REGISTER_OPENCL_OP_CREATOR(UnaryBufCreator, OpType_UnaryOp, BUFFER); +REGISTER_OPENCL_OP_CREATOR(UnaryBufCreator, OpType_Sigmoid, BUFFER); +REGISTER_OPENCL_OP_CREATOR(UnaryBufCreator, OpType_TanH, BUFFER); + } // namespace OpenCL } // namespace MNN #endif /* MNN_OPENCL_BUFFER_CLOSED */ diff --git a/source/backend/opencl/execution/buffer/UnaryBufExecution.hpp b/source/backend/opencl/execution/buffer/UnaryBufExecution.hpp index f448276bb..512bec1cd 100644 --- a/source/backend/opencl/execution/buffer/UnaryBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/UnaryBufExecution.hpp @@ -16,11 +16,12 @@ #include "MNN_generated.h" #include "backend/opencl/core/OpenCLBackend.hpp" #include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" namespace MNN { namespace OpenCL { -class UnaryBufExecution : public Execution { +class UnaryBufExecution : public Execution, public CommonExtension { public: UnaryBufExecution(const std::string &compute, Backend *backend); virtual ~UnaryBufExecution() = default; diff --git a/source/backend/opencl/execution/cl/binary_subgroup_buf.cl b/source/backend/opencl/execution/cl/binary_subgroup_buf.cl index d1cc04ae6..dbe678c3b 100644 --- a/source/backend/opencl/execution/cl/binary_subgroup_buf.cl +++ b/source/backend/opencl/execution/cl/binary_subgroup_buf.cl @@ -2,6 +2,7 @@ #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif +#define PI 3.141592653589f __kernel void binary_buf_c4_c4_c4(__private int global_dim0, __private int global_dim1, __private int global_dim2, __global FLOAT* input0, __global FLOAT* input1, __global FLOAT* output, __private const int4 shape,//[N,H,W,C] diff --git a/source/backend/opencl/execution/cl/buffer_convert_buf.cl b/source/backend/opencl/execution/cl/buffer_convert_buf.cl index 6dc38c53b..6b79edfc4 100644 --- a/source/backend/opencl/execution/cl/buffer_convert_buf.cl +++ b/source/backend/opencl/execution/cl/buffer_convert_buf.cl @@ -582,6 +582,127 @@ __kernel void conv2d_filter_buffer_to_nc4hw4_buffer(GLOBAL_SIZE_2_DIMS vstore4(output_values, 0, output+out_offset); } +#ifdef USE_LOW_BIT_WEIGHT_INT8 +// convert kernel : from int8 buffer(oihw) to int8 image(oc/4 h w , ic oc4) +__kernel void conv2d_filter_buffer_to_nc4hw4_buffer_int8(GLOBAL_SIZE_2_DIMS + __global const char *input_ptr, + __private const int output_channel, + __private const int2 kernel_shape, + __private const int ic_h_w_size, + __private const int height_width_size, + __global char *output) { + int image_width_idx = get_global_id(0); // ic + int image_height_idx = get_global_id(1); // oc/4 h w + + DEAL_NON_UNIFORM_DIM2(image_width_idx, image_height_idx); + + const int input_channel_4_idx = image_width_idx; + const int output_channel_4_idx = (image_height_idx / height_width_size) * 4; + const int height_width_idx = image_height_idx % height_width_size; + const int buffer_height_idx = height_width_idx / kernel_shape.y; + const int buffer_width_idx = height_width_idx % kernel_shape.y; + + const int buffer_offset = output_channel_4_idx * ic_h_w_size + input_channel_4_idx * height_width_size + + buffer_height_idx * kernel_shape.y + buffer_width_idx; + + char4 output_values = 0; + if (output_channel_4_idx < output_channel) { + const int remain_channel = output_channel - output_channel_4_idx; + if (remain_channel >= 4) { + int offset = buffer_offset; + output_values.x = (char)(*(input_ptr + offset)); + offset = mad24(1, ic_h_w_size, offset); + output_values.y = (char)(*(input_ptr + offset)); + offset += ic_h_w_size; + output_values.z = (char)(*(input_ptr + offset)); + offset += ic_h_w_size; + output_values.w = (char)(*(input_ptr + offset)); + } else if (remain_channel == 3) { + int offset = buffer_offset; + output_values.x = (char)(*(input_ptr + offset)); + offset = mad24(1, ic_h_w_size, offset); + output_values.y = (char)(*(input_ptr + offset)); + offset += ic_h_w_size; + output_values.z = (char)(*(input_ptr + offset)); + + } else if (remain_channel == 2) { + int offset = buffer_offset; + output_values.x = (char)(*(input_ptr + offset)); + offset = mad24(1, ic_h_w_size, offset); + output_values.y = (char)(*(input_ptr + offset)); + } else if (remain_channel == 1) { + int offset = buffer_offset; + output_values.x = (char)(*(input_ptr + offset)); + } + } + const int out_offset = (image_width_idx*height_width_size*((output_channel+3)/4)+image_height_idx)*4; + vstore4(output_values, 0, output+out_offset); +} +#endif + +#ifdef USE_LOW_BIT_WEIGHT_INT4 +// convert kernel : from int8 buffer(oihw) to int4 image(oc/4 h w , ic oc4) +__kernel void conv2d_filter_buffer_to_nc4hw4_buffer_int4(GLOBAL_SIZE_2_DIMS + __global const char *input_ptr, + __private const int output_channel, + __private const int2 kernel_shape, + __private const int ic_h_w_size, + __private const int height_width_size, + __global uchar *output) { + int image_width_idx = get_global_id(0); // ic + int image_height_idx = get_global_id(1); // oc/4 h w + + DEAL_NON_UNIFORM_DIM2(image_width_idx, image_height_idx); + + const int input_channel_4_idx = image_width_idx; + const int output_channel_4_idx = (image_height_idx / height_width_size) * 4; + const int height_width_idx = image_height_idx % height_width_size; + const int buffer_height_idx = height_width_idx / kernel_shape.y; + const int buffer_width_idx = height_width_idx % kernel_shape.y; + + const int buffer_offset = output_channel_4_idx * ic_h_w_size + input_channel_4_idx * height_width_size + + buffer_height_idx * kernel_shape.y + buffer_width_idx; + + char4 output_values_int8 = 0; + if (output_channel_4_idx < output_channel) { + const int remain_channel = output_channel - output_channel_4_idx; + if (remain_channel >= 4) { + int offset = buffer_offset; + output_values_int8.x = (char)(*(input_ptr + offset)); + offset = mad24(1, ic_h_w_size, offset); + output_values_int8.y = (char)(*(input_ptr + offset)); + offset += ic_h_w_size; + output_values_int8.z = (char)(*(input_ptr + offset)); + offset += ic_h_w_size; + output_values_int8.w = (char)(*(input_ptr + offset)); + } else if (remain_channel == 3) { + int offset = buffer_offset; + output_values_int8.x = (char)(*(input_ptr + offset)); + offset = mad24(1, ic_h_w_size, offset); + output_values_int8.y = (char)(*(input_ptr + offset)); + offset += ic_h_w_size; + output_values_int8.z = (char)(*(input_ptr + offset)); + + } else if (remain_channel == 2) { + int offset = buffer_offset; + output_values_int8.x = (char)(*(input_ptr + offset)); + offset = mad24(1, ic_h_w_size, offset); + output_values_int8.y = (char)(*(input_ptr + offset)); + } else if (remain_channel == 1) { + int offset = buffer_offset; + output_values_int8.x = (char)(*(input_ptr + offset)); + } + } + + uchar2 output_values_int4 = (uchar2)(0, 0); + output_values_int4.s0 = (output_values_int8.x + 8) * 16 + (output_values_int8.y + 8); + output_values_int4.s1 = (output_values_int8.z + 8) * 16 + (output_values_int8.w + 8); + + const int out_offset = (image_width_idx*height_width_size*((output_channel+3)/4)+image_height_idx)*2; + vstore2(output_values_int4, 0, output+out_offset); +} +#endif + // convert kernel : from buffer(oihw) to image(oc/4 h w , ic oc4) __kernel void conv2d_filter_buffer_to_nc4hw4_buffer_floatin(GLOBAL_SIZE_2_DIMS __global const float *input_ptr, diff --git a/source/backend/opencl/execution/cl/cast.cl b/source/backend/opencl/execution/cl/cast.cl new file mode 100644 index 000000000..4f87cb1da --- /dev/null +++ b/source/backend/opencl/execution/cl/cast.cl @@ -0,0 +1,39 @@ +#ifdef MNN_SUPPORT_FP16 +#pragma OPENCL EXTENSION cl_khr_fp16 : enable +#endif + +#define GLOBAL_SIZE_3_DIMS \ +__private const int global_size_dim0, __private const int global_size_dim1, __private const int global_size_dim2, + +#define DEAL_NON_UNIFORM_DIM3(input1, input2, input3) \ + if (input1 >= global_size_dim0 || input2 >= global_size_dim1 || input3 >= global_size_dim2) { \ + return; \ + } + +__constant sampler_t SAMPLER = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST; + +__kernel void cast(GLOBAL_SIZE_3_DIMS + __read_only image2d_t input, + __write_only image2d_t output, + __private const int width, + __private const int height, + __private const int channelBlock + ) { + const int width_idx = get_global_id(0); + const int height_idx = get_global_id(1); + const int batch_channel_idx = get_global_id(2); + + DEAL_NON_UNIFORM_DIM3(width_idx, height_idx, batch_channel_idx); + + const int batch_idx = batch_channel_idx / channelBlock; + const int channel_idx = batch_channel_idx % channelBlock; + +#ifdef TO_BOOL + int4 value = convert_int4(RI_F(input, SAMPLER, (int2)(channel_idx * width + width_idx, batch_idx * height + height_idx))); + value = value == (int4)0 ? (int4)0 : (int4)1; + WI_F(output, (int2)(channel_idx * width + width_idx, batch_idx * height + height_idx), CONVERT_FLOAT4(value)); +#else + FLOAT4 value = RI_F(input, SAMPLER, (int2)(channel_idx * width + width_idx, batch_idx * height + height_idx)); + WI_F(output, (int2)(channel_idx * width + width_idx, batch_idx * height + height_idx), value); +#endif +} diff --git a/source/backend/opencl/execution/cl/conv_2d.cl b/source/backend/opencl/execution/cl/conv_2d.cl index 4c9b4924f..d7000a2a2 100644 --- a/source/backend/opencl/execution/cl/conv_2d.cl +++ b/source/backend/opencl/execution/cl/conv_2d.cl @@ -43,6 +43,7 @@ __constant sampler_t SAMPLER = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | } #define UNIT 4 +#define MOD_NUM 15 __kernel #if SET_ATTRIBUTE @@ -286,12 +287,23 @@ __kernel __attribute__((work_group_size_hint(16, 16, 1))) #endif void conv_2d_1x1(GLOBAL_SIZE_2_DIMS __read_only image2d_t input, -#ifdef USE_BUFFER -__global const FLOAT *weights, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, + __global const FLOAT *bias_ptr, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, + __global const FLOAT *bias_ptr, +#elif (defined USE_BUFFER) + __global const FLOAT *weights, + __read_only image2d_t bias, #else -__read_only image2d_t weights, -#endif + __read_only image2d_t weights, __read_only image2d_t bias, +#endif __write_only image2d_t output, __private const int2 input_shape, __private const int in_channel_block, __private const int2 output_shape, @@ -305,8 +317,11 @@ __read_only image2d_t weights, const int output_channel_block_idx = output_channel_width_idx / output_width_4; const int output_width_block_idx = output_channel_width_idx % output_width_4; - +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + FLOAT4 out0 = vload4(output_channel_block_idx, bias_ptr); +#else FLOAT4 out0 = RI_F(bias, SAMPLER, (int2)(output_channel_block_idx, 0)); +#endif FLOAT4 out1 = out0; FLOAT4 out2 = out0; FLOAT4 out3 = out0; @@ -327,6 +342,12 @@ __read_only image2d_t weights, intput_width_idx2 = select(intput_width_idx2, INT_MIN, intput_width_idx2 >= input_shape.y); intput_width_idx3 = select(intput_width_idx3, INT_MIN, intput_width_idx3 >= input_shape.y); #endif + +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 dequantScaleC4 = vload4(output_channel_block_idx, dequantScale); + const FLOAT4 dequantOffsetC4 = vload4(output_channel_block_idx, dequantOffset); +#endif + int batch_index = output_batch_height_idx / output_shape.x; int input_height_block_idx = mul24((output_batch_height_idx % output_shape.x), stride_shape.x) + batch_index * input_shape.x; @@ -343,7 +364,48 @@ __read_only image2d_t weights, for (int in_channel_block_idx = 0; in_channel_block_idx < in_channel_block; ++in_channel_block_idx) { int input_width_base = in_channel_block_idx * input_shape.y; int weights_width_base = in_channel_block_idx << 2; -#ifdef USE_BUFFER + +#if (defined USE_LOW_BIT_WEIGHT_INT8) + int offset = mul24(output_channel_block_idx, in_channel_block) << 2; + char4 charWeights0 = vload4(weights_width_base, kernel_ptr + weight_offset); + char4 charWeights1 = vload4(weights_width_base + 1, kernel_ptr + weight_offset); + char4 charWeights2 = vload4(weights_width_base + 2, kernel_ptr + weight_offset); + char4 charWeights3 = vload4(weights_width_base + 3, kernel_ptr + weight_offset); + weights0 = mad(CONVERT_FLOAT4(charWeights0), dequantScaleC4, dequantOffsetC4); + weights1 = mad(CONVERT_FLOAT4(charWeights1), dequantScaleC4, dequantOffsetC4); + weights2 = mad(CONVERT_FLOAT4(charWeights2), dequantScaleC4, dequantOffsetC4); + weights3 = mad(CONVERT_FLOAT4(charWeights3), dequantScaleC4, dequantOffsetC4); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + int offset = mul24(output_channel_block_idx, in_channel_block) << 2; + uchar2 charWeightsInt40 = vload2(weights_width_base, kernel_ptr + weight_offset/2); + uchar2 charWeightsInt41 = vload2(weights_width_base + 1, kernel_ptr + weight_offset/2); + uchar2 charWeightsInt42 = vload2(weights_width_base + 2, kernel_ptr + weight_offset/2); + uchar2 charWeightsInt43 = vload2(weights_width_base + 3, kernel_ptr + weight_offset/2); + char4 charWeights0 = (char4)(0, 0, 0, 0); + char4 charWeights1 = (char4)(0, 0, 0, 0); + char4 charWeights2 = (char4)(0, 0, 0, 0); + char4 charWeights3 = (char4)(0, 0, 0, 0); + charWeights0.x = (charWeightsInt40.s0 >> 4) - 8; + charWeights0.y = (charWeightsInt40.s0 & MOD_NUM) - 8; + charWeights0.z = (charWeightsInt40.s1 >> 4) - 8; + charWeights0.w = (charWeightsInt40.s1 & MOD_NUM) - 8; + charWeights1.x = (charWeightsInt41.s0 >> 4) - 8; + charWeights1.y = (charWeightsInt41.s0 & MOD_NUM) - 8; + charWeights1.z = (charWeightsInt41.s1 >> 4) - 8; + charWeights1.w = (charWeightsInt41.s1 & MOD_NUM)- 8; + charWeights2.x = (charWeightsInt42.s0 >> 4) - 8; + charWeights2.y = (charWeightsInt42.s0 & MOD_NUM) - 8; + charWeights2.z = (charWeightsInt42.s1 >> 4) - 8; + charWeights2.w = (charWeightsInt42.s1 & MOD_NUM) - 8; + charWeights3.x = (charWeightsInt43.s0 >> 4) - 8; + charWeights3.y = (charWeightsInt43.s0 & MOD_NUM) - 8; + charWeights3.z = (charWeightsInt43.s1 >> 4) - 8; + charWeights3.w = (charWeightsInt43.s1 & MOD_NUM) - 8; + weights0 = mad(CONVERT_FLOAT4(charWeights0), dequantScaleC4, dequantOffsetC4); + weights1 = mad(CONVERT_FLOAT4(charWeights1), dequantScaleC4, dequantOffsetC4); + weights2 = mad(CONVERT_FLOAT4(charWeights2), dequantScaleC4, dequantOffsetC4); + weights3 = mad(CONVERT_FLOAT4(charWeights3), dequantScaleC4, dequantOffsetC4); +#elif (defined USE_BUFFER) weights0 = vload4(weights_width_base, weights + weight_offset); weights1 = vload4(weights_width_base + 1, weights + weight_offset); weights2 = vload4(weights_width_base + 2, weights + weight_offset); @@ -406,12 +468,23 @@ __kernel __attribute__((work_group_size_hint(16, 16, 1))) #endif void conv_2d_1x1_c8h1w4(GLOBAL_SIZE_2_DIMS __read_only image2d_t input, -#ifdef USE_BUFFER -__global const FLOAT *weights, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, + __global const FLOAT *bias_ptr, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, + __global const FLOAT *bias_ptr, +#elif (defined USE_BUFFER) + __global const FLOAT *weights, + __read_only image2d_t bias, #else -__read_only image2d_t weights, -#endif + __read_only image2d_t weights, __read_only image2d_t bias, +#endif __write_only image2d_t output, __private const int2 input_shape, __private const int in_channel_block, __private const int2 output_shape, @@ -427,12 +500,17 @@ __read_only image2d_t weights, const int output_width_block_idx = output_channel_width_idx % output_width_4; const int output_channel_idx = output_channel_block_idx << 1; +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + FLOAT4 out0 = vload4(output_channel_idx, bias_ptr); + FLOAT4 out4 = vload4(output_channel_idx + 1, bias_ptr); +#else FLOAT4 out0 = RI_F(bias, SAMPLER, (int2)(output_channel_idx, 0)); + FLOAT4 out4 = RI_F(bias, SAMPLER, (int2)(output_channel_idx + 1, 0)); +#endif FLOAT4 out1 = out0; FLOAT4 out2 = out0; FLOAT4 out3 = out0; - FLOAT4 out4 = RI_F(bias, SAMPLER, (int2)(output_channel_idx + 1, 0)); FLOAT4 out5 = out4; FLOAT4 out6 = out4; FLOAT4 out7 = out4; @@ -454,6 +532,13 @@ __read_only image2d_t weights, intput_width_idx3 = select(intput_width_idx3, INT_MIN, intput_width_idx3 >= input_shape.y); #endif +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 dequantScaleC03 = vload4(output_channel_idx, dequantScale); + const FLOAT4 dequantOffsetC03 = vload4(output_channel_idx, dequantOffset); + const FLOAT4 dequantScaleC47 = vload4(output_channel_idx + 1, dequantScale); + const FLOAT4 dequantOffsetC47 = vload4(output_channel_idx + 1, dequantOffset); +#endif + int batch_index = output_batch_height_idx / output_shape.x; int input_height_block_idx = mul24((output_batch_height_idx % output_shape.x), stride_shape.x) + batch_index * input_shape.x; @@ -480,7 +565,81 @@ __read_only image2d_t weights, in2 = RI_F(input, SAMPLER, (int2)(input_width_base + intput_width_idx2, input_height_block_idx)); in3 = RI_F(input, SAMPLER, (int2)(input_width_base + intput_width_idx3, input_height_block_idx)); -#ifdef USE_BUFFER +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeights0 = vload4(weights_width_base, kernel_ptr + weight_offset); + char4 charWeights1 = vload4(weights_width_base + 1, kernel_ptr + weight_offset); + char4 charWeights2 = vload4(weights_width_base + 2, kernel_ptr + weight_offset); + char4 charWeights3 = vload4(weights_width_base + 3, kernel_ptr + weight_offset); + char4 charWeights4 = vload4(weights_width_base, kernel_ptr + weight_offset1); + char4 charWeights5 = vload4(weights_width_base + 1, kernel_ptr + weight_offset1); + char4 charWeights6 = vload4(weights_width_base + 2, kernel_ptr + weight_offset1); + char4 charWeights7 = vload4(weights_width_base + 3, kernel_ptr + weight_offset1); + weights0 = mad(CONVERT_FLOAT4(charWeights0), dequantScaleC03, dequantOffsetC03); + weights1 = mad(CONVERT_FLOAT4(charWeights1), dequantScaleC03, dequantOffsetC03); + weights2 = mad(CONVERT_FLOAT4(charWeights2), dequantScaleC03, dequantOffsetC03); + weights3 = mad(CONVERT_FLOAT4(charWeights3), dequantScaleC03, dequantOffsetC03); + weights4 = mad(CONVERT_FLOAT4(charWeights4), dequantScaleC47, dequantOffsetC47); + weights5 = mad(CONVERT_FLOAT4(charWeights5), dequantScaleC47, dequantOffsetC47); + weights6 = mad(CONVERT_FLOAT4(charWeights6), dequantScaleC47, dequantOffsetC47); + weights7 = mad(CONVERT_FLOAT4(charWeights7), dequantScaleC47, dequantOffsetC47); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightsInt40 = vload2(weights_width_base, kernel_ptr + weight_offset/2); + uchar2 charWeightsInt41 = vload2(weights_width_base + 1, kernel_ptr + weight_offset/2); + uchar2 charWeightsInt42 = vload2(weights_width_base + 2, kernel_ptr + weight_offset/2); + uchar2 charWeightsInt43 = vload2(weights_width_base + 3, kernel_ptr + weight_offset/2); + uchar2 charWeightsInt44 = vload2(weights_width_base, kernel_ptr + weight_offset1/2); + uchar2 charWeightsInt45 = vload2(weights_width_base + 1, kernel_ptr + weight_offset1/2); + uchar2 charWeightsInt46 = vload2(weights_width_base + 2, kernel_ptr + weight_offset1/2); + uchar2 charWeightsInt47 = vload2(weights_width_base + 3, kernel_ptr + weight_offset1/2); + char4 charWeights0 = (char4)(0, 0, 0, 0); + char4 charWeights1 = (char4)(0, 0, 0, 0); + char4 charWeights2 = (char4)(0, 0, 0, 0); + char4 charWeights3 = (char4)(0, 0, 0, 0); + char4 charWeights4 = (char4)(0, 0, 0, 0); + char4 charWeights5 = (char4)(0, 0, 0, 0); + char4 charWeights6 = (char4)(0, 0, 0, 0); + char4 charWeights7 = (char4)(0, 0, 0, 0); + charWeights0.x = (charWeightsInt40.s0 >> 4) - 8; + charWeights0.y = (charWeightsInt40.s0 & MOD_NUM) - 8; + charWeights0.z = (charWeightsInt40.s1 >> 4) - 8; + charWeights0.w = (charWeightsInt40.s1 & MOD_NUM) - 8; + charWeights1.x = (charWeightsInt41.s0 >> 4) - 8; + charWeights1.y = (charWeightsInt41.s0 & MOD_NUM) - 8; + charWeights1.z = (charWeightsInt41.s1 >> 4) - 8; + charWeights1.w = (charWeightsInt41.s1 & MOD_NUM) - 8; + charWeights2.x = (charWeightsInt42.s0 >> 4) - 8; + charWeights2.y = (charWeightsInt42.s0 & MOD_NUM) - 8; + charWeights2.z = (charWeightsInt42.s1 >> 4) - 8; + charWeights2.w = (charWeightsInt42.s1 & MOD_NUM) - 8; + charWeights3.x = (charWeightsInt43.s0 >> 4) - 8; + charWeights3.y = (charWeightsInt43.s0 & MOD_NUM) - 8; + charWeights3.z = (charWeightsInt43.s1 >> 4) - 8; + charWeights3.w = (charWeightsInt43.s1 & MOD_NUM) - 8; + charWeights4.x = (charWeightsInt44.s0 >> 4) - 8; + charWeights4.y = (charWeightsInt44.s0 & MOD_NUM) - 8; + charWeights4.z = (charWeightsInt44.s1 >> 4) - 8; + charWeights4.w = (charWeightsInt44.s1 & MOD_NUM) - 8; + charWeights5.x = (charWeightsInt45.s0 >> 4) - 8; + charWeights5.y = (charWeightsInt45.s0 & MOD_NUM) - 8; + charWeights5.z = (charWeightsInt45.s1 >> 4) - 8; + charWeights5.w = (charWeightsInt45.s1 & MOD_NUM) - 8; + charWeights6.x = (charWeightsInt46.s0 >> 4) - 8; + charWeights6.y = (charWeightsInt46.s0 & MOD_NUM) - 8; + charWeights6.z = (charWeightsInt46.s1 >> 4) - 8; + charWeights6.w = (charWeightsInt46.s1 & MOD_NUM) - 8; + charWeights7.x = (charWeightsInt47.s0 >> 4) - 8; + charWeights7.y = (charWeightsInt47.s0 & MOD_NUM) - 8; + charWeights7.z = (charWeightsInt47.s1 >> 4) - 8; + charWeights7.w = (charWeightsInt47.s1 & MOD_NUM) - 8; + weights0 = mad(CONVERT_FLOAT4(charWeights0), dequantScaleC03, dequantOffsetC03); + weights1 = mad(CONVERT_FLOAT4(charWeights1), dequantScaleC03, dequantOffsetC03); + weights2 = mad(CONVERT_FLOAT4(charWeights2), dequantScaleC03, dequantOffsetC03); + weights3 = mad(CONVERT_FLOAT4(charWeights3), dequantScaleC03, dequantOffsetC03); + weights4 = mad(CONVERT_FLOAT4(charWeights4), dequantScaleC47, dequantOffsetC47); + weights5 = mad(CONVERT_FLOAT4(charWeights5), dequantScaleC47, dequantOffsetC47); + weights6 = mad(CONVERT_FLOAT4(charWeights6), dequantScaleC47, dequantOffsetC47); + weights7 = mad(CONVERT_FLOAT4(charWeights7), dequantScaleC47, dequantOffsetC47); +#elif (defined USE_BUFFER) weights0 = vload4(weights_width_base, weights + weight_offset); weights1 = vload4(weights_width_base + 1, weights + weight_offset); weights2 = vload4(weights_width_base + 2, weights + weight_offset); @@ -581,13 +740,25 @@ __kernel __attribute__((work_group_size_hint(16, 16, 1))) #endif void conv_2d_c4h1w4(GLOBAL_SIZE_2_DIMS __read_only image2d_t input, -#ifdef USE_BUFFER -__global const FLOAT *weights, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_BUFFER) + __global const FLOAT *weights, #else -__read_only image2d_t weights, + __read_only image2d_t weights, #endif #ifdef BIAS +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + __global const FLOAT *bias_ptr, +#else __read_only image2d_t bias, +#endif #endif __write_only image2d_t output, __private const int2 input_shape, @@ -609,7 +780,11 @@ __read_only image2d_t weights, const int out_height_block_idx = output_channel_width_idx % out_width_blocks; #ifdef BIAS +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + FLOAT4 out0 = vload4(out_channel_block_idx, bias_ptr); +#else FLOAT4 out0 = RI_F(bias, SAMPLER, (int2)(out_channel_block_idx, 0)); +#endif #else FLOAT4 out0 = (FLOAT4)0; #endif @@ -640,7 +815,9 @@ __read_only image2d_t weights, const int weights_h_idx = mul24(out_channel_block_idx, mul24(weights_shape.y, weights_shape.x)) + mul24(select(0, (-height_start + dilation_shape.x - 1) / dilation_shape.x, height_start < 0), weights_shape.y); #endif -#ifdef USE_BUFFER +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) || (defined USE_BUFFER) + const FLOAT4 dequantScaleC4 = vload4(out_channel_block_idx, dequantScale); + const FLOAT4 dequantOffsetC4 = vload4(out_channel_block_idx, dequantOffset); const int weight_oc_offset = out_channel_blocks * weights_shape.x * weights_shape.y * 4; #endif @@ -648,7 +825,7 @@ __read_only image2d_t weights, FLOAT4 weights0, weights1, weights2, weights3; for (int in_channel_block_idx = 0; in_channel_block_idx < in_channel_block_length; ++in_channel_block_idx) { const int in_idx = mul24(in_channel_block_idx, input_shape.y); -#ifdef USE_BUFFER +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) || (defined USE_BUFFER) int weight_offset = ((((4*in_channel_block_idx+0)* out_channel_blocks + out_channel_block_idx) *weights_shape.x + kh_start)*weights_shape.y + 0) * 4; #else int weights_x_idx = in_channel_block_idx << 2; @@ -662,7 +839,48 @@ __read_only image2d_t weights, READ_INPUT_IMAGE(1, 0); READ_INPUT_IMAGE(2, 0); READ_INPUT_IMAGE(3, 0); -#ifdef USE_BUFFER + +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeight0 = vload4(0, kernel_ptr+weight_offset); + char4 charWeight1 = vload4(0, kernel_ptr+weight_offset+weight_oc_offset); + char4 charWeight2 = vload4(0, kernel_ptr+weight_offset+weight_oc_offset*2); + char4 charWeight3 = vload4(0, kernel_ptr+weight_offset+weight_oc_offset*3); + weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); + weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); + weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); + weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); + weight_offset += 4; +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightInt40 = vload2(0, kernel_ptr+weight_offset/2); + uchar2 charWeightInt41 = vload2(0, kernel_ptr+weight_offset/2+weight_oc_offset/2); + uchar2 charWeightInt42 = vload2(0, kernel_ptr+weight_offset/2+weight_oc_offset*2/2); + uchar2 charWeightInt43 = vload2(0, kernel_ptr+weight_offset/2+weight_oc_offset*3/2); + char4 charWeight0 = (char4)(0, 0, 0, 0); + char4 charWeight1 = (char4)(0, 0, 0, 0); + char4 charWeight2 = (char4)(0, 0, 0, 0); + char4 charWeight3 = (char4)(0, 0, 0, 0); + charWeight0.x = (charWeightInt40.s0 >> 4) - 8; + charWeight0.y = (charWeightInt40.s0 & MOD_NUM) - 8; + charWeight0.z = (charWeightInt40.s1 >> 4) - 8; + charWeight0.w = (charWeightInt40.s1 & MOD_NUM) - 8; + charWeight1.x = (charWeightInt41.s0 >> 4) - 8; + charWeight1.y = (charWeightInt41.s0 & MOD_NUM) - 8; + charWeight1.z = (charWeightInt41.s1 >> 4) - 8; + charWeight1.w = (charWeightInt41.s1 & MOD_NUM) - 8; + charWeight2.x = (charWeightInt42.s0 >> 4) - 8; + charWeight2.y = (charWeightInt42.s0 & MOD_NUM) - 8; + charWeight2.z = (charWeightInt42.s1 >> 4) - 8; + charWeight2.w = (charWeightInt42.s1 & MOD_NUM) - 8; + charWeight3.x = (charWeightInt43.s0 >> 4) - 8; + charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; + charWeight3.z = (charWeightInt43.s1 >> 4) - 8; + charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; + weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); + weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); + weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); + weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); + weight_offset += 4; +#elif (defined USE_BUFFER) weights0 = vload4(0, weights+weight_offset); weights1 = vload4(0, weights+weight_offset+weight_oc_offset); weights2 = vload4(0, weights+weight_offset+weight_oc_offset*2); @@ -684,7 +902,47 @@ __read_only image2d_t weights, in1 = in2; in2 = in3; READ_INPUT_IMAGE(3, w); -#ifdef USE_BUFFER +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeight0 = vload4(0, kernel_ptr+weight_offset); + char4 charWeight1 = vload4(0, kernel_ptr+weight_offset+weight_oc_offset); + char4 charWeight2 = vload4(0, kernel_ptr+weight_offset+weight_oc_offset*2); + char4 charWeight3 = vload4(0, kernel_ptr+weight_offset+weight_oc_offset*3); + weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); + weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); + weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); + weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); + weight_offset += 4; +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightInt40 = vload2(0, kernel_ptr+weight_offset/2); + uchar2 charWeightInt41 = vload2(0, kernel_ptr+weight_offset/2+weight_oc_offset/2); + uchar2 charWeightInt42 = vload2(0, kernel_ptr+weight_offset/2+weight_oc_offset*2/2); + uchar2 charWeightInt43 = vload2(0, kernel_ptr+weight_offset/2+weight_oc_offset*3/2); + char4 charWeight0 = (char4)(0, 0, 0, 0); + char4 charWeight1 = (char4)(0, 0, 0, 0); + char4 charWeight2 = (char4)(0, 0, 0, 0); + char4 charWeight3 = (char4)(0, 0, 0, 0); + charWeight0.x = (charWeightInt40.s0 >> 4) - 8; + charWeight0.y = (charWeightInt40.s0 & MOD_NUM) - 8; + charWeight0.z = (charWeightInt40.s1 >> 4) - 8; + charWeight0.w = (charWeightInt40.s1 & MOD_NUM) - 8; + charWeight1.x = (charWeightInt41.s0 >> 4) - 8; + charWeight1.y = (charWeightInt41.s0 & MOD_NUM) - 8; + charWeight1.z = (charWeightInt41.s1 >> 4) - 8; + charWeight1.w = (charWeightInt41.s1 & MOD_NUM) - 8; + charWeight2.x = (charWeightInt42.s0 >> 4) - 8; + charWeight2.y = (charWeightInt42.s0 & MOD_NUM) - 8; + charWeight2.z = (charWeightInt42.s1 >> 4) - 8; + charWeight2.w = (charWeightInt42.s1 & MOD_NUM) - 8; + charWeight3.x = (charWeightInt43.s0 >> 4) - 8; + charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; + charWeight3.z = (charWeightInt43.s1 >> 4) - 8; + charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; + weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); + weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); + weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); + weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); + weight_offset += 4; +#elif (defined USE_BUFFER) weights0 = vload4(0, weights+weight_offset); weights1 = vload4(0, weights+weight_offset+weight_oc_offset); weights2 = vload4(0, weights+weight_offset+weight_oc_offset*2); @@ -708,7 +966,47 @@ __read_only image2d_t weights, READ_INPUT_IMAGE(1, input_width_base); READ_INPUT_IMAGE(2, input_width_base); READ_INPUT_IMAGE(3, input_width_base); -#ifdef USE_BUFFER +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeight0 = vload4(0, kernel_ptr+weight_offset); + char4 charWeight1 = vload4(0, kernel_ptr+weight_offset+weight_oc_offset); + char4 charWeight2 = vload4(0, kernel_ptr+weight_offset+weight_oc_offset*2); + char4 charWeight3 = vload4(0, kernel_ptr+weight_offset+weight_oc_offset*3); + weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); + weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); + weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); + weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); + weight_offset += 4; +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightInt40 = vload2(0, kernel_ptr+weight_offset/2); + uchar2 charWeightInt41 = vload2(0, kernel_ptr+weight_offset/2+weight_oc_offset/2); + uchar2 charWeightInt42 = vload2(0, kernel_ptr+weight_offset/2+weight_oc_offset*2/2); + uchar2 charWeightInt43 = vload2(0, kernel_ptr+weight_offset/2+weight_oc_offset*3/2); + char4 charWeight0 = (char4)(0, 0, 0, 0); + char4 charWeight1 = (char4)(0, 0, 0, 0); + char4 charWeight2 = (char4)(0, 0, 0, 0); + char4 charWeight3 = (char4)(0, 0, 0, 0); + charWeight0.x = (charWeightInt40.s0 >> 4) - 8; + charWeight0.y = (charWeightInt40.s0 & MOD_NUM) - 8; + charWeight0.z = (charWeightInt40.s1 >> 4) - 8; + charWeight0.w = (charWeightInt40.s1 & MOD_NUM) - 8; + charWeight1.x = (charWeightInt41.s0 >> 4) - 8; + charWeight1.y = (charWeightInt41.s0 & MOD_NUM) - 8; + charWeight1.z = (charWeightInt41.s1 >> 4) - 8; + charWeight1.w = (charWeightInt41.s1 & MOD_NUM) - 8; + charWeight2.x = (charWeightInt42.s0 >> 4) - 8; + charWeight2.y = (charWeightInt42.s0 & MOD_NUM) - 8; + charWeight2.z = (charWeightInt42.s1 >> 4) - 8; + charWeight2.w = (charWeightInt42.s1 & MOD_NUM) - 8; + charWeight3.x = (charWeightInt43.s0 >> 4) - 8; + charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; + charWeight3.z = (charWeightInt43.s1 >> 4) - 8; + charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; + weights0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); + weights1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); + weights2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); + weights3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); + weight_offset += 4; +#elif (defined USE_BUFFER) weights0 = vload4(0, weights+weight_offset); weights1 = vload4(0, weights+weight_offset+weight_oc_offset); weights2 = vload4(0, weights+weight_offset+weight_oc_offset*2); @@ -770,13 +1068,25 @@ __kernel __attribute__((work_group_size_hint(16, 16, 1))) #endif void conv_2d_c8h4w1(GLOBAL_SIZE_2_DIMS __read_only image2d_t input, -#ifdef USE_BUFFER -__global const FLOAT *weights, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_BUFFER) + __global const FLOAT *weights, #else -__read_only image2d_t weights, + __read_only image2d_t weights, #endif #ifdef BIAS +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + __global const FLOAT *bias_ptr, +#else __read_only image2d_t bias, +#endif #endif __write_only image2d_t output, __private const int2 input_shape, @@ -800,8 +1110,13 @@ __read_only image2d_t weights, const int out_batch_block_idx = output_batch_height_idx / out_height_blocks; #ifdef BIAS +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + FLOAT4 out0 = vload4(out_channel_block_idx, bias_ptr); + FLOAT4 out4 = vload4(out_channel_block_idx + 1, bias_ptr); +#else FLOAT4 out0 = RI_F(bias, SAMPLER, (int2)(out_channel_block_idx, 0)); FLOAT4 out4 = RI_F(bias, SAMPLER, (int2)(out_channel_block_idx + 1, 0)); +#endif #else FLOAT4 out0 = (FLOAT4)0; FLOAT4 out4 = (FLOAT4)0; @@ -813,7 +1128,11 @@ __read_only image2d_t weights, FLOAT4 out6 = out4; FLOAT4 out7 = out4; -#ifdef USE_BUFFER +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) || (defined USE_BUFFER) + const FLOAT4 dequantScaleC03 = vload4(out_channel_block_idx, dequantScale); + const FLOAT4 dequantOffsetC03 = vload4(out_channel_block_idx, dequantOffset); + const FLOAT4 dequantScaleC47 = vload4(out_channel_block_idx + 1, dequantScale); + const FLOAT4 dequantOffsetC47 = vload4(out_channel_block_idx + 1, dequantOffset); const int weight_oc_offset = weights_shape.x * weights_shape.y * 4; const int weight_ic_offset = out_channel_blocks * weight_oc_offset; #endif @@ -832,7 +1151,7 @@ __read_only image2d_t weights, FLOAT4 weights0, weights1, weights2, weights3, weights4, weights5, weights6, weights7; for (int in_channel_block_idx = 0; in_channel_block_idx < in_channel_block_length; ++in_channel_block_idx) { const int in_idx = mul24(in_channel_block_idx, input_shape.y); -#ifdef USE_BUFFER +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) || (defined USE_BUFFER) int weight_offset = ((((4*in_channel_block_idx+0)* out_channel_blocks + out_channel_block_idx) *weights_shape.x + 0)*weights_shape.y + 0) * 4; #else int weights_x_idx = in_channel_block_idx << 2; @@ -851,7 +1170,83 @@ __read_only image2d_t weights, in2 = RI_F(input, SAMPLER, (int2)(w0, h2)); in3 = RI_F(input, SAMPLER, (int2)(w0, h3)); -#ifdef USE_BUFFER +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeight0 = vload4(0, kernel_ptr+weight_offset); + char4 charWeight1 = vload4(0, kernel_ptr+weight_offset+weight_ic_offset); + char4 charWeight2 = vload4(0, kernel_ptr+weight_offset+weight_ic_offset*2); + char4 charWeight3 = vload4(0, kernel_ptr+weight_offset+weight_ic_offset*3); + weights0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC03, dequantOffsetC03); + weights1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC03, dequantOffsetC03); + weights2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC03, dequantOffsetC03); + weights3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC03, dequantOffsetC03); + charWeight0 = vload4(0, kernel_ptr+weight_offset+weight_oc_offset); + charWeight1 = vload4(0, kernel_ptr+weight_offset+weight_oc_offset+weight_ic_offset); + charWeight2 = vload4(0, kernel_ptr+weight_offset+weight_oc_offset+weight_ic_offset*2); + charWeight3 = vload4(0, kernel_ptr+weight_offset+weight_oc_offset+weight_ic_offset*3); + weights4 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC47, dequantOffsetC47); + weights5 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC47, dequantOffsetC47); + weights6 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC47, dequantOffsetC47); + weights7 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC47, dequantOffsetC47); + weight_offset += 4; +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightInt40 = vload2(0, kernel_ptr+weight_offset/2); + uchar2 charWeightInt41 = vload2(0, kernel_ptr+weight_offset/2+weight_ic_offset/2); + uchar2 charWeightInt42 = vload2(0, kernel_ptr+weight_offset/2+weight_ic_offset*2/2); + uchar2 charWeightInt43 = vload2(0, kernel_ptr+weight_offset/2+weight_ic_offset*3/2); + char4 charWeight0 = (char4)(0, 0, 0, 0); + char4 charWeight1 = (char4)(0, 0, 0, 0); + char4 charWeight2 = (char4)(0, 0, 0, 0); + char4 charWeight3 = (char4)(0, 0, 0, 0); + charWeight0.x = (charWeightInt40.s0 >> 4) - 8; + charWeight0.y = (charWeightInt40.s0 & MOD_NUM) - 8; + charWeight0.z = (charWeightInt40.s1 >> 4) - 8; + charWeight0.w = (charWeightInt40.s1 & MOD_NUM) - 8; + charWeight1.x = (charWeightInt41.s0 >> 4) - 8; + charWeight1.y = (charWeightInt41.s0 & MOD_NUM) - 8; + charWeight1.z = (charWeightInt41.s1 >> 4) - 8; + charWeight1.w = (charWeightInt41.s1 & MOD_NUM) - 8; + charWeight2.x = (charWeightInt42.s0 >> 4) - 8; + charWeight2.y = (charWeightInt42.s0 & MOD_NUM) - 8; + charWeight2.z = (charWeightInt42.s1 >> 4) - 8; + charWeight2.w = (charWeightInt42.s1 & MOD_NUM)- 8; + charWeight3.x = (charWeightInt43.s0 >> 4) - 8; + charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; + charWeight3.z = (charWeightInt43.s1 >> 4) - 8; + charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; + weights0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC03, dequantOffsetC03); + weights1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC03, dequantOffsetC03); + weights2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC03, dequantOffsetC03); + weights3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC03, dequantOffsetC03); + charWeightInt40 = vload2(0, kernel_ptr+weight_offset/2+weight_oc_offset/2); + charWeightInt41 = vload2(0, kernel_ptr+weight_offset/2+weight_oc_offset/2+weight_ic_offset/2); + charWeightInt42 = vload2(0, kernel_ptr+weight_offset/2+weight_oc_offset/2+weight_ic_offset*2/2); + charWeightInt43 = vload2(0, kernel_ptr+weight_offset/2+weight_oc_offset/2+weight_ic_offset*3/2); + charWeight0 = (char4)(0, 0, 0, 0); + charWeight1 = (char4)(0, 0, 0, 0); + charWeight2 = (char4)(0, 0, 0, 0); + charWeight3 = (char4)(0, 0, 0, 0); + charWeight0.x = (charWeightInt40.s0 >> 4) - 8; + charWeight0.y = (charWeightInt40.s0 & MOD_NUM) - 8; + charWeight0.z = (charWeightInt40.s1 >> 4) - 8; + charWeight0.w = (charWeightInt40.s1 & MOD_NUM) - 8; + charWeight1.x = (charWeightInt41.s0 >> 4) - 8; + charWeight1.y = (charWeightInt41.s0 & MOD_NUM) - 8; + charWeight1.z = (charWeightInt41.s1 >> 4) - 8; + charWeight1.w = (charWeightInt41.s1 & MOD_NUM)- 8; + charWeight2.x = (charWeightInt42.s0 >> 4) - 8; + charWeight2.y = (charWeightInt42.s0 & MOD_NUM) - 8; + charWeight2.z = (charWeightInt42.s1 >> 4) - 8; + charWeight2.w = (charWeightInt42.s1 & MOD_NUM)- 8; + charWeight3.x = (charWeightInt43.s0 >> 4) - 8; + charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; + charWeight3.z = (charWeightInt43.s1 >> 4) - 8; + charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; + weights4 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC47, dequantOffsetC47); + weights5 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC47, dequantOffsetC47); + weights6 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC47, dequantOffsetC47); + weights7 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC47, dequantOffsetC47); + weight_offset += 4; +#elif (defined USE_BUFFER) weights0 = vload4(0, weights+weight_offset); weights1 = vload4(0, weights+weight_offset+weight_ic_offset); weights2 = vload4(0, weights+weight_offset+weight_ic_offset*2); @@ -957,13 +1352,25 @@ __kernel __attribute__((work_group_size_hint(16, 16, 1))) #endif void conv_2d_c4h4w1(GLOBAL_SIZE_2_DIMS __read_only image2d_t input, -#ifdef USE_BUFFER -__global const FLOAT *weights, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_BUFFER) + __global const FLOAT *weights, #else -__read_only image2d_t weights, + __read_only image2d_t weights, #endif #ifdef BIAS +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + __global const FLOAT *bias_ptr, +#else __read_only image2d_t bias, +#endif #endif __write_only image2d_t output, __private const int2 input_shape, @@ -987,7 +1394,11 @@ __read_only image2d_t weights, const int out_batch_block_idx = output_batch_height_idx / out_height_blocks; #ifdef BIAS +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + FLOAT4 out0 = vload4(out_channel_block_idx, bias_ptr); +#else FLOAT4 out0 = RI_F(bias, SAMPLER, (int2)(out_channel_block_idx, 0)); +#endif #else FLOAT4 out0 = (FLOAT4)0; #endif @@ -1007,12 +1418,14 @@ __read_only image2d_t weights, FLOAT4 in0, in1, in2, in3; FLOAT4 weights0, weights1, weights2, weights3; -#ifdef USE_BUFFER +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) || (defined USE_BUFFER) + const FLOAT4 dequantScaleC4 = vload4(out_channel_block_idx, dequantScale); + const FLOAT4 dequantOffsetC4 = vload4(out_channel_block_idx, dequantOffset); const int weight_oc_offset = out_channel_blocks * weights_shape.x * weights_shape.y * 4; #endif for (int in_channel_block_idx = 0; in_channel_block_idx < in_channel_block_length; ++in_channel_block_idx) { const int in_idx = mul24(in_channel_block_idx, input_shape.y); -#ifdef USE_BUFFER +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) || (defined USE_BUFFER) int weight_offset = ((((4*in_channel_block_idx+0)* out_channel_blocks + out_channel_block_idx) *weights_shape.x + 0)*weights_shape.y + 0) * 4; #else int weights_x_idx = in_channel_block_idx << 2; @@ -1030,7 +1443,48 @@ __read_only image2d_t weights, in1 = RI_F(input, SAMPLER, (int2)(w0, h1)); in2 = RI_F(input, SAMPLER, (int2)(w0, h2)); in3 = RI_F(input, SAMPLER, (int2)(w0, h3)); -#ifdef USE_BUFFER + +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeight0 = vload4(0, kernel_ptr+weight_offset); + char4 charWeight1 = vload4(0, kernel_ptr+weight_offset+weight_oc_offset); + char4 charWeight2 = vload4(0, kernel_ptr+weight_offset+weight_oc_offset*2); + char4 charWeight3 = vload4(0, kernel_ptr+weight_offset+weight_oc_offset*3); + weights0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); + weights1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); + weights2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); + weights3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); + weight_offset += 4; +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightInt40 = vload2(0, kernel_ptr+weight_offset/2); + uchar2 charWeightInt41 = vload2(0, kernel_ptr+weight_offset/2+weight_oc_offset/2); + uchar2 charWeightInt42 = vload2(0, kernel_ptr+weight_offset/2+weight_oc_offset*2/2); + uchar2 charWeightInt43 = vload2(0, kernel_ptr+weight_offset/2+weight_oc_offset*3/2); + char4 charWeight0 = (char4)(0, 0, 0, 0); + char4 charWeight1 = (char4)(0, 0, 0, 0); + char4 charWeight2 = (char4)(0, 0, 0, 0); + char4 charWeight3 = (char4)(0, 0, 0, 0); + charWeight0.x = (charWeightInt40.s0 >> 4) - 8; + charWeight0.y = (charWeightInt40.s0 & MOD_NUM) - 8; + charWeight0.z = (charWeightInt40.s1 >> 4) - 8; + charWeight0.w = (charWeightInt40.s1 & MOD_NUM) - 8; + charWeight1.x = (charWeightInt41.s0 >> 4) - 8; + charWeight1.y = (charWeightInt41.s0 & MOD_NUM) - 8; + charWeight1.z = (charWeightInt41.s1 >> 4) - 8; + charWeight1.w = (charWeightInt41.s1 & MOD_NUM) - 8; + charWeight2.x = (charWeightInt42.s0 >> 4) - 8; + charWeight2.y = (charWeightInt42.s0 & MOD_NUM) - 8; + charWeight2.z = (charWeightInt42.s1 >> 4) - 8; + charWeight2.w = (charWeightInt42.s1 & MOD_NUM) - 8; + charWeight3.x = (charWeightInt43.s0 >> 4) - 8; + charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; + charWeight3.z = (charWeightInt43.s1 >> 4) - 8; + charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; + weights0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); + weights1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); + weights2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); + weights3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); + weight_offset += 4; +#elif (defined USE_BUFFER) weights0 = vload4(0, weights+weight_offset); weights1 = vload4(0, weights+weight_offset+weight_oc_offset); weights2 = vload4(0, weights+weight_offset+weight_oc_offset*2); diff --git a/source/backend/opencl/execution/cl/conv_2d_buf.cl b/source/backend/opencl/execution/cl/conv_2d_buf.cl index 5500ee951..51d40c3b4 100644 --- a/source/backend/opencl/execution/cl/conv_2d_buf.cl +++ b/source/backend/opencl/execution/cl/conv_2d_buf.cl @@ -22,308 +22,23 @@ return; \ } -__kernel -void conv_2d_c4h1w1(GLOBAL_SIZE_2_DIMS - __global const FLOAT *input, - __global const FLOAT *weight, - __global const FLOAT *bias, - __global FLOAT *output, - __private const int2 in_hw, - __private const int inChannel, - __private const int in_c_blocks, - __private const int2 out_hw, - __private const int2 filter_hw, - __private const int2 stride_hw, - __private const int2 pad_hw, - __private const int2 dilate_hw, - __private const int out_w_blocks, - __private const int out_c_blocks, - __private const int out_h_blocks) { - const int out_c_w_idx = get_global_id(0); //c/4 w - const int out_b_h_idx = get_global_id(1); //b h - - DEAL_NON_UNIFORM_DIM2(out_c_w_idx, out_b_h_idx); - - const int out_c_idx = out_c_w_idx / out_hw.y; - const int out_w_idx = out_c_w_idx % out_hw.y; - const int out_b_idx = out_b_h_idx / out_hw.x;//equal to in_b_idx - const int out_h_idx = out_b_h_idx % out_hw.x; - - FLOAT4 out0 = vload4(out_c_idx, bias); - - const int in_w_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); - const int in_h_idx_base = mad24(out_h_idx, stride_hw.x, -pad_hw.x); - - const int kw_start = select(0, (-in_w_idx_base + dilate_hw.y - 1) / dilate_hw.y, in_w_idx_base < 0); - const int kh_start = select(0, (-in_h_idx_base + dilate_hw.x - 1) / dilate_hw.x, in_h_idx_base < 0); - - const int in_w_idx_start = mad24(kw_start, dilate_hw.y, in_w_idx_base); - const int in_w_idx_end = min(mad24(filter_hw.y, dilate_hw.y, in_w_idx_base), in_hw.y); - - const int in_h_idx_start = mad24(kh_start, dilate_hw.x, in_h_idx_base); - const int in_h_idx_end = min(mad24(filter_hw.x, dilate_hw.x, in_h_idx_base), in_hw.x); - - const int weight_oc_offset = out_c_blocks * filter_hw.x * filter_hw.y * 4; - for(ushort in_c_idx = 0; in_c_idx < in_c_blocks; in_c_idx++) { - //weights NC4HW4 [1, 4*icC4, ocC4*kh*kw, 1] xic4 - //index: [0, 4*in_c_idx, out_c_idx*kh*kw + kh_start*kw + kw_start, 0] - int weight_offset = ((((4*in_c_idx+0)* out_c_blocks + out_c_idx) *filter_hw.x + kh_start)*filter_hw.y + kw_start) * 4; - for(int iy = in_h_idx_start; iy < in_h_idx_end; iy += dilate_hw.x) { - for(int ix = in_w_idx_start; ix < in_w_idx_end; ix += dilate_hw.y) { - int inp_offset = (((out_b_idx * in_c_blocks + in_c_idx) * in_hw.x + iy) * in_hw.y + ix) * 4; - FLOAT4 in0 = vload4(0, input+inp_offset); - - const int filter_w_inc = (ix-in_w_idx_start)/dilate_hw.y; - FLOAT4 weight0 = vload4(filter_w_inc, weight+weight_offset); - FLOAT4 weight1 = vload4(filter_w_inc, weight+weight_offset+weight_oc_offset); - FLOAT4 weight2 = vload4(filter_w_inc, weight+weight_offset+weight_oc_offset*2); - FLOAT4 weight3 = vload4(filter_w_inc, weight+weight_offset+weight_oc_offset*3); - - out0 = mad(in0.x, weight0, out0); - out0 = mad(in0.y, weight1, out0); - out0 = mad(in0.z, weight2, out0); - out0 = mad(in0.w, weight3, out0); - - } - weight_offset += 4*filter_hw.y; - } - } -#ifdef RELU - out0 = fmax(out0, (FLOAT4)0); -#endif - -#ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); -#endif - - const int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; - vstore4(out0, 0, output+out_offset); - -} - -__kernel -void conv_2d_c4h1w2(GLOBAL_SIZE_2_DIMS - __global const FLOAT *input, - __global const FLOAT *weight, - __global const FLOAT *bias, - __global FLOAT *output, - __private const int2 in_hw, - __private const int inChannel, - __private const int in_c_blocks, - __private const int2 out_hw, - __private const int2 filter_hw, - __private const int2 stride_hw, - __private const int2 pad_hw, - __private const int2 dilate_hw, - __private const int out_w_blocks,//generate width's num - __private const int out_c_blocks, - __private const int out_h_blocks) { - const int out_c_w_idx = get_global_id(0); //c/4 w - const int out_b_h_idx = get_global_id(1); //b h - - DEAL_NON_UNIFORM_DIM2(out_c_w_idx, out_b_h_idx); - - const int out_c_idx = out_c_w_idx / out_w_blocks; - const int out_w_idx = (out_c_w_idx % out_w_blocks) << 1; - const int out_b_idx = out_b_h_idx / out_hw.x;//equal to in_b_idx - const int out_h_idx = out_b_h_idx % out_hw.x; - - FLOAT4 out0 = vload4(out_c_idx, bias); - FLOAT4 out1 = out0; - - const int in_w0_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); - const int in_w1_idx_base = in_w0_idx_base + stride_hw.y; - - const int in_h_idx_base = mad24(out_h_idx, stride_hw.x, -pad_hw.x); - - const int kh_start = select(0, (-in_h_idx_base + dilate_hw.x - 1) / dilate_hw.x, in_h_idx_base < 0); - const int in_h_idx_start = mad24(kh_start, dilate_hw.x, in_h_idx_base); - const int in_h_idx_end = min(mad24(filter_hw.x, dilate_hw.x, in_h_idx_base), in_hw.x); - - const int weight_oc_offset = out_c_blocks * filter_hw.x * filter_hw.y * 4; - for(ushort in_c_idx = 0; in_c_idx < in_c_blocks; in_c_idx++) { - //weights NC4HW4 [1, 4*icC4, ocC4*kh*kw, 1] xic4 - //index: [0, 4*in_c_idx, out_c_idx*kh*kw + kh_start*kw + kw_start, 0] - int weight_offset = ((((4*in_c_idx+0)* out_c_blocks + out_c_idx) *filter_hw.x + kh_start)*filter_hw.y + 0) * 4; - - for(int iy = in_h_idx_start; iy < in_h_idx_end; iy += dilate_hw.x) { - const int inp_offset_base = (((out_b_idx * in_c_blocks + in_c_idx) * in_hw.x + iy) * in_hw.y + 0) * 4; - - for(int fw = 0; fw < filter_hw.y; fw++) { - const int in_w0_idx = fw * dilate_hw.y + in_w0_idx_base; - const int in_w1_idx = fw * dilate_hw.y + in_w1_idx_base; - - FLOAT4 in0 = (in_w0_idx < 0 || in_w0_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w0_idx, input+inp_offset_base); - FLOAT4 in1 = (in_w1_idx < 0 || in_w1_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w1_idx, input+inp_offset_base); - - FLOAT4 weight0 = vload4(0, weight+weight_offset); - FLOAT4 weight1 = vload4(0, weight+weight_offset+weight_oc_offset); - FLOAT4 weight2 = vload4(0, weight+weight_offset+weight_oc_offset*2); - FLOAT4 weight3 = vload4(0, weight+weight_offset+weight_oc_offset*3); - - out0 = mad(in0.x, weight0, out0); - out0 = mad(in0.y, weight1, out0); - out0 = mad(in0.z, weight2, out0); - out0 = mad(in0.w, weight3, out0); - - out1 = mad(in1.x, weight0, out1); - out1 = mad(in1.y, weight1, out1); - out1 = mad(in1.z, weight2, out1); - out1 = mad(in1.w, weight3, out1); - - weight_offset += 4; - } - } - } -#ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); -#endif - -#ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); -#endif - - const int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; -#ifdef BLOCK_LEAVE - vstore4(out0, 0, output+out_offset); - if(out_w_idx + 1 >= out_hw.y) return; - vstore4(out1, 1, output+out_offset); -#else - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); -#endif -} - -__kernel -void conv_2d_c4h1w4(GLOBAL_SIZE_2_DIMS - __global const FLOAT *input, - __global const FLOAT *weight, - __global const FLOAT *bias, - __global FLOAT *output, - __private const int2 in_hw, - __private const int inChannel, - __private const int in_c_blocks, - __private const int2 out_hw, - __private const int2 filter_hw, - __private const int2 stride_hw, - __private const int2 pad_hw, - __private const int2 dilate_hw, - __private const int out_w_blocks, - __private const int out_c_blocks, - __private const int out_h_blocks) { - const int out_c_w_idx = get_global_id(0); //c/4 w - const int out_b_h_idx = get_global_id(1); //b h - - DEAL_NON_UNIFORM_DIM2(out_c_w_idx, out_b_h_idx); - - const int out_c_idx = out_c_w_idx / out_w_blocks; - const int out_w_idx = (out_c_w_idx % out_w_blocks) << 2; - const int out_b_idx = out_b_h_idx / out_hw.x;//equal to in_b_idx - const int out_h_idx = out_b_h_idx % out_hw.x; - - FLOAT4 out0 = vload4(out_c_idx, bias); - FLOAT4 out1 = out0; - FLOAT4 out2 = out0; - FLOAT4 out3 = out0; - - const int in_w0_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); - const int in_w1_idx_base = in_w0_idx_base + stride_hw.y; - const int in_w2_idx_base = in_w1_idx_base + stride_hw.y; - const int in_w3_idx_base = in_w2_idx_base + stride_hw.y; - - const int in_h_idx_base = mad24(out_h_idx, stride_hw.x, -pad_hw.x); - - const int kh_start = select(0, (-in_h_idx_base + dilate_hw.x - 1) / dilate_hw.x, in_h_idx_base < 0); - const int in_h_idx_start = mad24(kh_start, dilate_hw.x, in_h_idx_base); - const int in_h_idx_end = min(mad24(filter_hw.x, dilate_hw.x, in_h_idx_base), in_hw.x); - - const int weight_oc_offset = out_c_blocks * filter_hw.x * filter_hw.y * 4; - for(ushort in_c_idx = 0; in_c_idx < in_c_blocks; in_c_idx++) { - //weights NC4HW4 [1, 4*icC4, ocC4*kh*kw, 1] xic4 - //index: [0, 4*in_c_idx, out_c_idx*kh*kw + kh_start*kw + kw_start, 0] - int weight_offset = ((((4*in_c_idx+0)* out_c_blocks + out_c_idx) *filter_hw.x + kh_start)*filter_hw.y + 0) * 4; - - for(int iy = in_h_idx_start; iy < in_h_idx_end; iy += dilate_hw.x) { - const int inp_offset_base = (((out_b_idx * in_c_blocks + in_c_idx) * in_hw.x + iy) * in_hw.y + 0) * 4; - - for(int fw = 0; fw < filter_hw.y; fw++) { - const int in_w0_idx = fw * dilate_hw.y + in_w0_idx_base; - const int in_w1_idx = fw * dilate_hw.y + in_w1_idx_base; - const int in_w2_idx = fw * dilate_hw.y + in_w2_idx_base; - const int in_w3_idx = fw * dilate_hw.y + in_w3_idx_base; - - FLOAT4 in0 = (in_w0_idx < 0 || in_w0_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w0_idx, input+inp_offset_base); - FLOAT4 in1 = (in_w1_idx < 0 || in_w1_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w1_idx, input+inp_offset_base); - FLOAT4 in2 = (in_w2_idx < 0 || in_w2_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w2_idx, input+inp_offset_base); - FLOAT4 in3 = (in_w3_idx < 0 || in_w3_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w3_idx, input+inp_offset_base); - - FLOAT4 weight0 = vload4(0, weight+weight_offset); - FLOAT4 weight1 = vload4(0, weight+weight_offset+weight_oc_offset); - FLOAT4 weight2 = vload4(0, weight+weight_offset+weight_oc_offset*2); - FLOAT4 weight3 = vload4(0, weight+weight_offset+weight_oc_offset*3); - - out0 = mad(in0.x, weight0, out0); - out0 = mad(in0.y, weight1, out0); - out0 = mad(in0.z, weight2, out0); - out0 = mad(in0.w, weight3, out0); - - out1 = mad(in1.x, weight0, out1); - out1 = mad(in1.y, weight1, out1); - out1 = mad(in1.z, weight2, out1); - out1 = mad(in1.w, weight3, out1); - - out2 = mad(in2.x, weight0, out2); - out2 = mad(in2.y, weight1, out2); - out2 = mad(in2.z, weight2, out2); - out2 = mad(in2.w, weight3, out2); - - out3 = mad(in3.x, weight0, out3); - out3 = mad(in3.y, weight1, out3); - out3 = mad(in3.z, weight2, out3); - out3 = mad(in3.w, weight3, out3); - - weight_offset += 4; - } - } - } -#ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); - out2 = fmax(out2, (FLOAT4)0); - out3 = fmax(out3, (FLOAT4)0); -#endif - -#ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); - out2 = clamp(out2, (FLOAT4)0, (FLOAT4)6); - out3 = clamp(out3, (FLOAT4)0, (FLOAT4)6); -#endif - - const int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; -#ifdef BLOCK_LEAVE - const int remain = out_hw.y - out_w_idx; +#define MOD_NUM 15 - if (remain >= 4) { - vstore16((FLOAT16)(out0, out1, out2, out3), 0, output+out_offset); - }else if(remain == 3){ - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); - vstore4(out2, 2, output+out_offset); - }else if(remain == 2){ - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); - }else if(remain == 1){ - vstore4(out0, 0, output+out_offset); - } -#else - vstore16((FLOAT16)(out0, out1, out2, out3), 0, output+out_offset); -#endif -} __kernel void conv_2d_1x1_c4h1w4(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, __global const FLOAT *input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#else __global const FLOAT *kernel_ptr, +#endif __global const FLOAT *bias_ptr, __global FLOAT *output, __private const int in_c_block, @@ -338,12 +53,15 @@ void conv_2d_1x1_c4h1w4(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, const int out_c_idx = out_c_w_idx / out_w_blocks; const int out_w_idx = out_c_w_idx % out_w_blocks; - const int out_b_idx = out_b_h_idx / out_h;//equal to in_b_idx - const int out_h_idx = out_b_h_idx % out_h;//equal to in_h_idx - + const int out_b_idx = out_b_h_idx / out_h; // equal to in_b_idx + const int out_h_idx = out_b_h_idx % out_h; // equal to in_h_idx +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 dequantScaleC4 = vload4(out_c_idx, dequantScale); + const FLOAT4 dequantOffsetC4 = vload4(out_c_idx, dequantOffset); +#endif + const int out_w4_idx = mul24(out_w_idx, 4); FLOAT4 out0 = vload4(out_c_idx, (__global FLOAT *)bias_ptr); - FLOAT4 out1 = out0; FLOAT4 out2 = out0; FLOAT4 out3 = out0; @@ -351,22 +69,61 @@ void conv_2d_1x1_c4h1w4(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, const int intput_width_idx0 = out_w4_idx; int offset = mul24(out_c_idx, in_c_block) << 2; - int inp_offset = - (((out_b_idx*in_c_block)*out_h + out_h_idx)* out_w + intput_width_idx0) << 2; + int inp_offset = (((out_b_idx*in_c_block)*out_h + out_h_idx)* out_w + intput_width_idx0) << 2; const int inp_add = out_h*out_w*4; for (ushort in_channel_block_idx = 0; in_channel_block_idx < in_c_block; ++in_channel_block_idx) { FLOAT4 in0 = vload4(0, input+inp_offset); - FLOAT4 in1 = vload4(1, input+inp_offset);; - FLOAT4 in2 = vload4(2, input+inp_offset);; - FLOAT4 in3 = vload4(3, input+inp_offset);; - + FLOAT4 in1 = vload4(1, input+inp_offset); + FLOAT4 in2 = vload4(2, input+inp_offset); + FLOAT4 in3 = vload4(3, input+inp_offset); + +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeights0 = vload4(offset, kernel_ptr); + char4 charWeights1 = vload4(offset + 1, kernel_ptr); + char4 charWeights2 = vload4(offset + 2, kernel_ptr); + char4 charWeights3 = vload4(offset + 3, kernel_ptr); + FLOAT4 weights0 = CONVERT_FLOAT4(charWeights0) * dequantScaleC4.x + dequantOffsetC4.x; + FLOAT4 weights1 = CONVERT_FLOAT4(charWeights1) * dequantScaleC4.y + dequantOffsetC4.y; + FLOAT4 weights2 = CONVERT_FLOAT4(charWeights2) * dequantScaleC4.z + dequantOffsetC4.z; + FLOAT4 weights3 = CONVERT_FLOAT4(charWeights3) * dequantScaleC4.w + dequantOffsetC4.w; +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightsInt40 = vload2(offset, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt41 = vload2(offset + 1, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt42 = vload2(offset + 2, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt43 = vload2(offset + 3, (__global uchar *)kernel_ptr); + char4 charWeights0 = (char4)(0, 0, 0, 0); + char4 charWeights1 = (char4)(0, 0, 0, 0); + char4 charWeights2 = (char4)(0, 0, 0, 0); + char4 charWeights3 = (char4)(0, 0, 0, 0); + charWeights0.x = (charWeightsInt40.s0 >> 4) - 8; + charWeights0.y = (charWeightsInt40.s0 & MOD_NUM) - 8; + charWeights0.z = (charWeightsInt40.s1 >> 4) - 8; + charWeights0.w = (charWeightsInt40.s1 & MOD_NUM) - 8; + charWeights1.x = (charWeightsInt41.s0 >> 4) - 8; + charWeights1.y = (charWeightsInt41.s0 & MOD_NUM) - 8; + charWeights1.z = (charWeightsInt41.s1 >> 4) - 8; + charWeights1.w = (charWeightsInt41.s1 & MOD_NUM)- 8; + charWeights2.x = (charWeightsInt42.s0 >> 4) - 8; + charWeights2.y = (charWeightsInt42.s0 & MOD_NUM) - 8; + charWeights2.z = (charWeightsInt42.s1 >> 4) - 8; + charWeights2.w = (charWeightsInt42.s1 & MOD_NUM) - 8; + charWeights3.x = (charWeightsInt43.s0 >> 4) - 8; + charWeights3.y = (charWeightsInt43.s0 & MOD_NUM) - 8; + charWeights3.z = (charWeightsInt43.s1 >> 4) - 8; + charWeights3.w = (charWeightsInt43.s1 & MOD_NUM) - 8; + FLOAT4 weights0 = CONVERT_FLOAT4(charWeights0) * dequantScaleC4.x + dequantOffsetC4.x; + FLOAT4 weights1 = CONVERT_FLOAT4(charWeights1) * dequantScaleC4.y + dequantOffsetC4.y; + FLOAT4 weights2 = CONVERT_FLOAT4(charWeights2) * dequantScaleC4.z + dequantOffsetC4.z; + FLOAT4 weights3 = CONVERT_FLOAT4(charWeights3) * dequantScaleC4.w + dequantOffsetC4.w; +#else FLOAT4 weights0 = vload4(offset, (__global FLOAT *)kernel_ptr); FLOAT4 weights1 = vload4(offset + 1, (__global FLOAT *)kernel_ptr); FLOAT4 weights2 = vload4(offset + 2, (__global FLOAT *)kernel_ptr); FLOAT4 weights3 = vload4(offset + 3, (__global FLOAT *)kernel_ptr); - +#endif + out0.x += dot(weights0, in0); out0.y += dot(weights1, in0); out0.z += dot(weights2, in0); @@ -424,11 +181,20 @@ void conv_2d_1x1_c4h1w4(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, } - __kernel void conv_2d_1x1_c8h1w4(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, __global const FLOAT *input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#else __global const FLOAT *kernel_ptr, +#endif __global const FLOAT *bias_ptr, __global FLOAT *output, __private const int in_c_block, @@ -445,7 +211,13 @@ void conv_2d_1x1_c8h1w4(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, const int out_w_idx = out_c_w_idx % out_w_blocks; const int out_b_idx = out_b_h_idx / out_h;//equal to in_b_idx const int out_h_idx = out_b_h_idx % out_h;//equal to in_h_idx - +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 dequantScaleC03 = vload4(out_c_idx << 1, dequantScale); + const FLOAT4 dequantOffsetC03 = vload4(out_c_idx << 1, dequantOffset); + const FLOAT4 dequantScaleC47 = vload4((out_c_idx << 1) + 1, dequantScale); + const FLOAT4 dequantOffsetC47 = vload4((out_c_idx << 1) + 1, dequantOffset); +#endif + const int out_w4_idx = mul24(out_w_idx, 4); FLOAT4 out0 = vload4(out_c_idx<<1, (__global FLOAT *)bias_ptr); FLOAT4 out1 = out0; @@ -471,6 +243,81 @@ void conv_2d_1x1_c8h1w4(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, FLOAT4 in2 = vload4(2, input+inp_offset);; FLOAT4 in3 = vload4(3, input+inp_offset);; +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeights0 = vload4(offset, kernel_ptr); + char4 charWeights1 = vload4(offset + 1, kernel_ptr); + char4 charWeights2 = vload4(offset + 2, kernel_ptr); + char4 charWeights3 = vload4(offset + 3, kernel_ptr); + char4 charWeights4 = vload4(offset + 4, kernel_ptr); + char4 charWeights5 = vload4(offset + 5, kernel_ptr); + char4 charWeights6 = vload4(offset + 6, kernel_ptr); + char4 charWeights7 = vload4(offset + 7, kernel_ptr); + FLOAT4 weights0 = CONVERT_FLOAT4(charWeights0) * (FLOAT4)dequantScaleC03.x + (FLOAT4)dequantOffsetC03.x; + FLOAT4 weights1 = CONVERT_FLOAT4(charWeights1) * (FLOAT4)dequantScaleC03.y + (FLOAT4)dequantOffsetC03.y; + FLOAT4 weights2 = CONVERT_FLOAT4(charWeights2) * (FLOAT4)dequantScaleC03.z + (FLOAT4)dequantOffsetC03.z; + FLOAT4 weights3 = CONVERT_FLOAT4(charWeights3) * (FLOAT4)dequantScaleC03.w + (FLOAT4)dequantOffsetC03.w; + FLOAT4 weights4 = CONVERT_FLOAT4(charWeights4) * (FLOAT4)dequantScaleC47.x + (FLOAT4)dequantOffsetC47.x; + FLOAT4 weights5 = CONVERT_FLOAT4(charWeights5) * (FLOAT4)dequantScaleC47.y + (FLOAT4)dequantOffsetC47.y; + FLOAT4 weights6 = CONVERT_FLOAT4(charWeights6) * (FLOAT4)dequantScaleC47.z + (FLOAT4)dequantOffsetC47.z; + FLOAT4 weights7 = CONVERT_FLOAT4(charWeights7) * (FLOAT4)dequantScaleC47.w + (FLOAT4)dequantOffsetC47.w; +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightsInt40 = vload2(offset, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt41 = vload2(offset + 1, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt42 = vload2(offset + 2, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt43 = vload2(offset + 3, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt44 = vload2(offset + 4, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt45 = vload2(offset + 5, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt46 = vload2(offset + 6, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt47 = vload2(offset + 7, (__global uchar *)kernel_ptr); + char4 charWeights0 = (char4)(0, 0, 0, 0); + char4 charWeights1 = (char4)(0, 0, 0, 0); + char4 charWeights2 = (char4)(0, 0, 0, 0); + char4 charWeights3 = (char4)(0, 0, 0, 0); + char4 charWeights4 = (char4)(0, 0, 0, 0); + char4 charWeights5 = (char4)(0, 0, 0, 0); + char4 charWeights6 = (char4)(0, 0, 0, 0); + char4 charWeights7 = (char4)(0, 0, 0, 0); + charWeights0.x = (charWeightsInt40.s0 >> 4) - 8; + charWeights0.y = (charWeightsInt40.s0 & MOD_NUM) - 8; + charWeights0.z = (charWeightsInt40.s1 >> 4) - 8; + charWeights0.w = (charWeightsInt40.s1 & MOD_NUM) - 8; + charWeights1.x = (charWeightsInt41.s0 >> 4) - 8; + charWeights1.y = (charWeightsInt41.s0 & MOD_NUM) - 8; + charWeights1.z = (charWeightsInt41.s1 >> 4) - 8; + charWeights1.w = (charWeightsInt41.s1 & MOD_NUM) - 8; + charWeights2.x = (charWeightsInt42.s0 >> 4) - 8; + charWeights2.y = (charWeightsInt42.s0 & MOD_NUM) - 8; + charWeights2.z = (charWeightsInt42.s1 >> 4) - 8; + charWeights2.w = (charWeightsInt42.s1 & MOD_NUM) - 8; + charWeights3.x = (charWeightsInt43.s0 >> 4) - 8; + charWeights3.y = (charWeightsInt43.s0 & MOD_NUM) - 8; + charWeights3.z = (charWeightsInt43.s1 >> 4) - 8; + charWeights3.w = (charWeightsInt43.s1 & MOD_NUM) - 8; + charWeights4.x = (charWeightsInt44.s0 >> 4) - 8; + charWeights4.y = (charWeightsInt44.s0 & MOD_NUM) - 8; + charWeights4.z = (charWeightsInt44.s1 >> 4) - 8; + charWeights4.w = (charWeightsInt44.s1 & MOD_NUM) - 8; + charWeights5.x = (charWeightsInt45.s0 >> 4) - 8; + charWeights5.y = (charWeightsInt45.s0 & MOD_NUM) - 8; + charWeights5.z = (charWeightsInt45.s1 >> 4) - 8; + charWeights5.w = (charWeightsInt45.s1 & MOD_NUM) - 8; + charWeights6.x = (charWeightsInt46.s0 >> 4) - 8; + charWeights6.y = (charWeightsInt46.s0 & MOD_NUM) - 8; + charWeights6.z = (charWeightsInt46.s1 >> 4) - 8; + charWeights6.w = (charWeightsInt46.s1 & MOD_NUM) - 8; + charWeights7.x = (charWeightsInt47.s0 >> 4) - 8; + charWeights7.y = (charWeightsInt47.s0 & MOD_NUM) - 8; + charWeights7.z = (charWeightsInt47.s1 >> 4) - 8; + charWeights7.w = (charWeightsInt47.s1 & MOD_NUM) - 8; + FLOAT4 weights0 = CONVERT_FLOAT4(charWeights0) * dequantScaleC03.x + dequantOffsetC03.x; + FLOAT4 weights1 = CONVERT_FLOAT4(charWeights1) * dequantScaleC03.y + dequantOffsetC03.y; + FLOAT4 weights2 = CONVERT_FLOAT4(charWeights2) * dequantScaleC03.z + dequantOffsetC03.z; + FLOAT4 weights3 = CONVERT_FLOAT4(charWeights3) * dequantScaleC03.w + dequantOffsetC03.w; + FLOAT4 weights4 = CONVERT_FLOAT4(charWeights4) * dequantScaleC47.x + dequantOffsetC47.x; + FLOAT4 weights5 = CONVERT_FLOAT4(charWeights5) * dequantScaleC47.y + dequantOffsetC47.y; + FLOAT4 weights6 = CONVERT_FLOAT4(charWeights6) * dequantScaleC47.z + dequantOffsetC47.z; + FLOAT4 weights7 = CONVERT_FLOAT4(charWeights7) * dequantScaleC47.w + dequantOffsetC47.w; +#else FLOAT4 weights0 = vload4(offset, (__global FLOAT *)kernel_ptr); FLOAT4 weights1 = vload4(offset + 1, (__global FLOAT *)kernel_ptr); FLOAT4 weights2 = vload4(offset + 2, (__global FLOAT *)kernel_ptr); @@ -479,7 +326,8 @@ void conv_2d_1x1_c8h1w4(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, FLOAT4 weights5 = vload4(offset + 5, (__global FLOAT *)kernel_ptr); FLOAT4 weights6 = vload4(offset + 6, (__global FLOAT *)kernel_ptr); FLOAT4 weights7 = vload4(offset + 7, (__global FLOAT *)kernel_ptr); - +#endif + out0.x += dot(weights0, in0); out0.y += dot(weights1, in0); out0.z += dot(weights2, in0); @@ -593,13 +441,23 @@ void conv_2d_1x1_c8h1w4(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, __kernel void conv_2d_1x1_c8h1w2(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, __global const FLOAT *input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#else __global const FLOAT *kernel_ptr, +#endif __global const FLOAT *bias_ptr, __global FLOAT *output, __private const int in_c_block, __private const int out_h, __private const int out_w, - __private const int out_c_block) { + __private const int out_c_block) { // oc / 4 const int out_c_w_idx = get_global_id(0); //c/8 w/4 const int out_b_h_idx = get_global_id(1); //b h @@ -610,6 +468,12 @@ void conv_2d_1x1_c8h1w2(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, const int out_w_idx = out_c_w_idx % out_w_blocks; const int out_b_idx = out_b_h_idx / out_h;//equal to in_b_idx const int out_h_idx = out_b_h_idx % out_h;//equal to in_h_idx +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 dequantScaleC03 = vload4(out_c_idx << 1, (__global FLOAT *)dequantScale); + const FLOAT4 dequantOffsetC03 = vload4(out_c_idx << 1, (__global FLOAT *)dequantOffset); + const FLOAT4 dequantScaleC47 = vload4((out_c_idx << 1) + 1, (__global FLOAT *)dequantScale); + const FLOAT4 dequantOffsetC47 = vload4((out_c_idx << 1) + 1, (__global FLOAT *)dequantOffset); +#endif const int out_w2_idx = mul24(out_w_idx, 2); FLOAT4 out0 = vload4(out_c_idx<<1, (__global FLOAT *)bias_ptr); @@ -630,6 +494,81 @@ void conv_2d_1x1_c8h1w2(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, FLOAT4 in0 = vload4(0, input+inp_offset); FLOAT4 in1 = vload4(1, input+inp_offset);; +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeights0 = vload4(offset, (__global char *)kernel_ptr); + char4 charWeights1 = vload4(offset + 1, (__global char *)kernel_ptr); + char4 charWeights2 = vload4(offset + 2, (__global char *)kernel_ptr); + char4 charWeights3 = vload4(offset + 3, (__global char *)kernel_ptr); + char4 charWeights4 = vload4(offset + 4, (__global char *)kernel_ptr); + char4 charWeights5 = vload4(offset + 5, (__global char *)kernel_ptr); + char4 charWeights6 = vload4(offset + 6, (__global char *)kernel_ptr); + char4 charWeights7 = vload4(offset + 7, (__global char *)kernel_ptr); + FLOAT4 weights0 = CONVERT_FLOAT4(charWeights0) * (FLOAT4)dequantScaleC03.x + (FLOAT4)dequantOffsetC03.x; + FLOAT4 weights1 = CONVERT_FLOAT4(charWeights1) * (FLOAT4)dequantScaleC03.y + (FLOAT4)dequantOffsetC03.y; + FLOAT4 weights2 = CONVERT_FLOAT4(charWeights2) * (FLOAT4)dequantScaleC03.z + (FLOAT4)dequantOffsetC03.z; + FLOAT4 weights3 = CONVERT_FLOAT4(charWeights3) * (FLOAT4)dequantScaleC03.w + (FLOAT4)dequantOffsetC03.w; + FLOAT4 weights4 = CONVERT_FLOAT4(charWeights4) * (FLOAT4)dequantScaleC47.x + (FLOAT4)dequantOffsetC47.x; + FLOAT4 weights5 = CONVERT_FLOAT4(charWeights5) * (FLOAT4)dequantScaleC47.y + (FLOAT4)dequantOffsetC47.y; + FLOAT4 weights6 = CONVERT_FLOAT4(charWeights6) * (FLOAT4)dequantScaleC47.z + (FLOAT4)dequantOffsetC47.z; + FLOAT4 weights7 = CONVERT_FLOAT4(charWeights7) * (FLOAT4)dequantScaleC47.w + (FLOAT4)dequantOffsetC47.w; +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightsInt40 = vload2(offset, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt41 = vload2(offset + 1, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt42 = vload2(offset + 2, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt43 = vload2(offset + 3, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt44 = vload2(offset + 4, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt45 = vload2(offset + 5, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt46 = vload2(offset + 6, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt47 = vload2(offset + 7, (__global uchar *)kernel_ptr); + char4 charWeights0 = (char4)(0, 0, 0, 0); + char4 charWeights1 = (char4)(0, 0, 0, 0); + char4 charWeights2 = (char4)(0, 0, 0, 0); + char4 charWeights3 = (char4)(0, 0, 0, 0); + char4 charWeights4 = (char4)(0, 0, 0, 0); + char4 charWeights5 = (char4)(0, 0, 0, 0); + char4 charWeights6 = (char4)(0, 0, 0, 0); + char4 charWeights7 = (char4)(0, 0, 0, 0); + charWeights0.x = (charWeightsInt40.s0 >> 4) - 8; + charWeights0.y = (charWeightsInt40.s0 & MOD_NUM) - 8; + charWeights0.z = (charWeightsInt40.s1 >> 4) - 8; + charWeights0.w = (charWeightsInt40.s1 & MOD_NUM) - 8; + charWeights1.x = (charWeightsInt41.s0 >> 4) - 8; + charWeights1.y = (charWeightsInt41.s0 & MOD_NUM) - 8; + charWeights1.z = (charWeightsInt41.s1 >> 4) - 8; + charWeights1.w = (charWeightsInt41.s1 & MOD_NUM) - 8; + charWeights2.x = (charWeightsInt42.s0 >> 4) - 8; + charWeights2.y = (charWeightsInt42.s0 & MOD_NUM) - 8; + charWeights2.z = (charWeightsInt42.s1 >> 4) - 8; + charWeights2.w = (charWeightsInt42.s1 & MOD_NUM) - 8; + charWeights3.x = (charWeightsInt43.s0 >> 4) - 8; + charWeights3.y = (charWeightsInt43.s0 & MOD_NUM) - 8; + charWeights3.z = (charWeightsInt43.s1 >> 4) - 8; + charWeights3.w = (charWeightsInt43.s1 & MOD_NUM) - 8; + charWeights4.x = (charWeightsInt44.s0 >> 4) - 8; + charWeights4.y = (charWeightsInt44.s0 & MOD_NUM) - 8; + charWeights4.z = (charWeightsInt44.s1 >> 4) - 8; + charWeights4.w = (charWeightsInt44.s1 & MOD_NUM) - 8; + charWeights5.x = (charWeightsInt45.s0 >> 4) - 8; + charWeights5.y = (charWeightsInt45.s0 & MOD_NUM) - 8; + charWeights5.z = (charWeightsInt45.s1 >> 4) - 8; + charWeights5.w = (charWeightsInt45.s1 & MOD_NUM) - 8; + charWeights6.x = (charWeightsInt46.s0 >> 4) - 8; + charWeights6.y = (charWeightsInt46.s0 & MOD_NUM) - 8; + charWeights6.z = (charWeightsInt46.s1 >> 4) - 8; + charWeights6.w = (charWeightsInt46.s1 & MOD_NUM) - 8; + charWeights7.x = (charWeightsInt47.s0 >> 4) - 8; + charWeights7.y = (charWeightsInt47.s0 & MOD_NUM) - 8; + charWeights7.z = (charWeightsInt47.s1 >> 4) - 8; + charWeights7.w = (charWeightsInt47.s1 & MOD_NUM) - 8; + FLOAT4 weights0 = CONVERT_FLOAT4(charWeights0) * dequantScaleC03.x + dequantOffsetC03.x; + FLOAT4 weights1 = CONVERT_FLOAT4(charWeights1) * dequantScaleC03.y + dequantOffsetC03.y; + FLOAT4 weights2 = CONVERT_FLOAT4(charWeights2) * dequantScaleC03.z + dequantOffsetC03.z; + FLOAT4 weights3 = CONVERT_FLOAT4(charWeights3) * dequantScaleC03.w + dequantOffsetC03.w; + FLOAT4 weights4 = CONVERT_FLOAT4(charWeights4) * dequantScaleC47.x + dequantOffsetC47.x; + FLOAT4 weights5 = CONVERT_FLOAT4(charWeights5) * dequantScaleC47.y + dequantOffsetC47.y; + FLOAT4 weights6 = CONVERT_FLOAT4(charWeights6) * dequantScaleC47.z + dequantOffsetC47.z; + FLOAT4 weights7 = CONVERT_FLOAT4(charWeights7) * dequantScaleC47.w + dequantOffsetC47.w; +#else FLOAT4 weights0 = vload4(offset, (__global FLOAT *)kernel_ptr); FLOAT4 weights1 = vload4(offset + 1, (__global FLOAT *)kernel_ptr); FLOAT4 weights2 = vload4(offset + 2, (__global FLOAT *)kernel_ptr); @@ -638,7 +577,8 @@ void conv_2d_1x1_c8h1w2(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, FLOAT4 weights5 = vload4(offset + 5, (__global FLOAT *)kernel_ptr); FLOAT4 weights6 = vload4(offset + 6, (__global FLOAT *)kernel_ptr); FLOAT4 weights7 = vload4(offset + 7, (__global FLOAT *)kernel_ptr); - +#endif + out0.x += dot(weights0, in0); out0.y += dot(weights1, in0); out0.z += dot(weights2, in0); @@ -713,7 +653,129 @@ void conv_2d_1x1_c8h1w2(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, __kernel void conv_2d_1x1_c4h1w1(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, __global const FLOAT *input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#else + __global const FLOAT *kernel_ptr, +#endif + __global const FLOAT *bias_ptr, + __global FLOAT *output, + __private const int in_c_block, + __private const int out_h, + __private const int out_w, + __private const int out_c_block) { + + const int out_c_w_idx = get_global_id(0); //c/4 w + const int out_b_h_idx = get_global_id(1); //b h + + DEAL_NON_UNIFORM_DIM2(out_c_w_idx, out_b_h_idx); + + const int out_c_idx = out_c_w_idx / out_w; + const int out_w_idx = out_c_w_idx % out_w; + const int out_b_idx = out_b_h_idx / out_h;//equal to in_b_idx + const int out_h_idx = out_b_h_idx % out_h;//equal to in_h_idx +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 dequantScaleC4 = vload4(out_c_idx, dequantScale); + const FLOAT4 dequantOffsetC4 = vload4(out_c_idx, dequantOffset); +#endif + + FLOAT4 out0 = vload4(out_c_idx, (__global FLOAT *)bias_ptr); + const int intput_width_idx0 = out_w_idx; + + for (int in_channel_block_idx = 0; in_channel_block_idx < in_c_block; ++in_channel_block_idx) { + int input_width_base = mul24(in_channel_block_idx, out_w); + + int offset = mad24(out_c_idx, in_c_block, in_channel_block_idx)*4; + const int inp_offset = + (((out_b_idx*in_c_block + in_channel_block_idx)*out_h + out_h_idx)* out_w + intput_width_idx0)*4; + + FLOAT4 in0 = vload4(0, input+inp_offset); + +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeights0 = vload4(offset, kernel_ptr); + char4 charWeights1 = vload4(offset + 1, kernel_ptr); + char4 charWeights2 = vload4(offset + 2, kernel_ptr); + char4 charWeights3 = vload4(offset + 3, kernel_ptr); + FLOAT4 weights0 = CONVERT_FLOAT4(charWeights0) * (FLOAT4)dequantScaleC4.x + (FLOAT4)dequantOffsetC4.x; + FLOAT4 weights1 = CONVERT_FLOAT4(charWeights1) * (FLOAT4)dequantScaleC4.y + (FLOAT4)dequantOffsetC4.y; + FLOAT4 weights2 = CONVERT_FLOAT4(charWeights2) * (FLOAT4)dequantScaleC4.z + (FLOAT4)dequantOffsetC4.z; + FLOAT4 weights3 = CONVERT_FLOAT4(charWeights3) * (FLOAT4)dequantScaleC4.w + (FLOAT4)dequantOffsetC4.w; +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightsInt40 = vload2(offset, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt41 = vload2(offset + 1, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt42 = vload2(offset + 2, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt43 = vload2(offset + 3, (__global uchar *)kernel_ptr); + char4 charWeights0 = (char4)(0, 0, 0, 0); + char4 charWeights1 = (char4)(0, 0, 0, 0); + char4 charWeights2 = (char4)(0, 0, 0, 0); + char4 charWeights3 = (char4)(0, 0, 0, 0); + charWeights0.x = (charWeightsInt40.s0 >> 4) - 8; + charWeights0.y = (charWeightsInt40.s0 & MOD_NUM) - 8; + charWeights0.z = (charWeightsInt40.s1 >> 4) - 8; + charWeights0.w = (charWeightsInt40.s1 & MOD_NUM) - 8; + charWeights1.x = (charWeightsInt41.s0 >> 4) - 8; + charWeights1.y = (charWeightsInt41.s0 & MOD_NUM) - 8; + charWeights1.z = (charWeightsInt41.s1 >> 4) - 8; + charWeights1.w = (charWeightsInt41.s1 & MOD_NUM) - 8; + charWeights2.x = (charWeightsInt42.s0 >> 4) - 8; + charWeights2.y = (charWeightsInt42.s0 & MOD_NUM) - 8; + charWeights2.z = (charWeightsInt42.s1 >> 4) - 8; + charWeights2.w = (charWeightsInt42.s1 & MOD_NUM) - 8; + charWeights3.x = (charWeightsInt43.s0 >> 4) - 8; + charWeights3.y = (charWeightsInt43.s0 & MOD_NUM) - 8; + charWeights3.z = (charWeightsInt43.s1 >> 4) - 8; + charWeights3.w = (charWeightsInt43.s1 & MOD_NUM) - 8; + FLOAT4 weights0 = CONVERT_FLOAT4(charWeights0) * dequantScaleC4.x + dequantOffsetC4.x; + FLOAT4 weights1 = CONVERT_FLOAT4(charWeights1) * dequantScaleC4.y + dequantOffsetC4.y; + FLOAT4 weights2 = CONVERT_FLOAT4(charWeights2) * dequantScaleC4.z + dequantOffsetC4.z; + FLOAT4 weights3 = CONVERT_FLOAT4(charWeights3) * dequantScaleC4.w + dequantOffsetC4.w; +#else + FLOAT4 weights0 = vload4(offset, (__global FLOAT *)kernel_ptr); + FLOAT4 weights1 = vload4(offset + 1, (__global FLOAT *)kernel_ptr); + FLOAT4 weights2 = vload4(offset + 2, (__global FLOAT *)kernel_ptr); + FLOAT4 weights3 = vload4(offset + 3, (__global FLOAT *)kernel_ptr); +#endif + + out0.x += dot(weights0, in0); + out0.y += dot(weights1, in0); + out0.z += dot(weights2, in0); + out0.w += dot(weights3, in0); + } + +#ifdef RELU + out0 = fmax(out0, (FLOAT4)0); +#endif + +#ifdef RELU6 + out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); +#endif + + const int out_offset = (((out_b_idx*out_c_block + out_c_idx)*out_h + out_h_idx)* out_w + out_w_idx)*4; + + vstore4(out0, 0, output+out_offset); +} + + +__kernel +void conv_2d_1x1_c4h1w2(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, + __global const FLOAT *input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *kernel_ptr, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#else __global const FLOAT *kernel_ptr, +#endif __global const FLOAT *bias_ptr, __global FLOAT *output, __private const int in_c_block, @@ -726,131 +788,588 @@ void conv_2d_1x1_c4h1w1(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, DEAL_NON_UNIFORM_DIM2(out_c_w_idx, out_b_h_idx); - const int out_c_idx = out_c_w_idx / out_w; - const int out_w_idx = out_c_w_idx % out_w; - const int out_b_idx = out_b_h_idx / out_h;//equal to in_b_idx - const int out_h_idx = out_b_h_idx % out_h;//equal to in_h_idx + const int out_c_idx = out_c_w_idx / out_w_blocks; + const int out_w_idx = out_c_w_idx % out_w_blocks; + const int out_b_idx = out_b_h_idx / out_h;//equal to in_b_idx + const int out_h_idx = out_b_h_idx % out_h;//equal to in_h_idx +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 dequantScaleC4 = vload4(out_c_idx, dequantScale); + const FLOAT4 dequantOffsetC4 = vload4(out_c_idx, dequantOffset); +#endif + + const int out_w2_idx = mul24(out_w_idx, 2); + + FLOAT4 out0 = vload4(out_c_idx, (__global FLOAT *)bias_ptr); + FLOAT4 out1 = out0; + + const int intput_width_idx0 = out_w2_idx; + + for (int in_channel_block_idx = 0; in_channel_block_idx < in_c_block; ++in_channel_block_idx) { + int input_width_base = mul24(in_channel_block_idx, out_w); + + int offset = mad24(out_c_idx, in_c_block, in_channel_block_idx)*4; + const int inp_offset = + (((out_b_idx*in_c_block + in_channel_block_idx)*out_h + out_h_idx)* out_w + intput_width_idx0)*4; + + FLOAT4 in0 = vload4(0, input+inp_offset); + FLOAT4 in1 = vload4(1, input+inp_offset);; + +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeights0 = vload4(offset, kernel_ptr); + char4 charWeights1 = vload4(offset + 1, kernel_ptr); + char4 charWeights2 = vload4(offset + 2, kernel_ptr); + char4 charWeights3 = vload4(offset + 3, kernel_ptr); + FLOAT4 weights0 = CONVERT_FLOAT4(charWeights0) * (FLOAT4)dequantScaleC4.x + (FLOAT4)dequantOffsetC4.x; + FLOAT4 weights1 = CONVERT_FLOAT4(charWeights1) * (FLOAT4)dequantScaleC4.y + (FLOAT4)dequantOffsetC4.y; + FLOAT4 weights2 = CONVERT_FLOAT4(charWeights2) * (FLOAT4)dequantScaleC4.z + (FLOAT4)dequantOffsetC4.z; + FLOAT4 weights3 = CONVERT_FLOAT4(charWeights3) * (FLOAT4)dequantScaleC4.w + (FLOAT4)dequantOffsetC4.w; +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightsInt40 = vload2(offset, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt41 = vload2(offset + 1, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt42 = vload2(offset + 2, (__global uchar *)kernel_ptr); + uchar2 charWeightsInt43 = vload2(offset + 3, (__global uchar *)kernel_ptr); + char4 charWeights0 = (char4)(0, 0, 0, 0); + char4 charWeights1 = (char4)(0, 0, 0, 0); + char4 charWeights2 = (char4)(0, 0, 0, 0); + char4 charWeights3 = (char4)(0, 0, 0, 0); + charWeights0.x = (charWeightsInt40.s0 >> 4) - 8; + charWeights0.y = (charWeightsInt40.s0 & MOD_NUM) - 8; + charWeights0.z = (charWeightsInt40.s1 >> 4) - 8; + charWeights0.w = (charWeightsInt40.s1 & MOD_NUM) - 8; + charWeights1.x = (charWeightsInt41.s0 >> 4) - 8; + charWeights1.y = (charWeightsInt41.s0 & MOD_NUM) - 8; + charWeights1.z = (charWeightsInt41.s1 >> 4) - 8; + charWeights1.w = (charWeightsInt41.s1 & MOD_NUM) - 8; + charWeights2.x = (charWeightsInt42.s0 >> 4) - 8; + charWeights2.y = (charWeightsInt42.s0 & MOD_NUM) - 8; + charWeights2.z = (charWeightsInt42.s1 >> 4) - 8; + charWeights2.w = (charWeightsInt42.s1 & MOD_NUM) - 8; + charWeights3.x = (charWeightsInt43.s0 >> 4) - 8; + charWeights3.y = (charWeightsInt43.s0 & MOD_NUM) - 8; + charWeights3.z = (charWeightsInt43.s1 >> 4) - 8; + charWeights3.w = (charWeightsInt43.s1 & MOD_NUM) - 8; + FLOAT4 weights0 = CONVERT_FLOAT4(charWeights0) * dequantScaleC4.x + dequantOffsetC4.x; + FLOAT4 weights1 = CONVERT_FLOAT4(charWeights1) * dequantScaleC4.y + dequantOffsetC4.y; + FLOAT4 weights2 = CONVERT_FLOAT4(charWeights2) * dequantScaleC4.z + dequantOffsetC4.z; + FLOAT4 weights3 = CONVERT_FLOAT4(charWeights3) * dequantScaleC4.w + dequantOffsetC4.w; +#else + FLOAT4 weights0 = vload4(offset, (__global FLOAT *)kernel_ptr); + FLOAT4 weights1 = vload4(offset + 1, (__global FLOAT *)kernel_ptr); + FLOAT4 weights2 = vload4(offset + 2, (__global FLOAT *)kernel_ptr); + FLOAT4 weights3 = vload4(offset + 3, (__global FLOAT *)kernel_ptr); +#endif + + out0.x += dot(weights0, in0); + out0.y += dot(weights1, in0); + out0.z += dot(weights2, in0); + out0.w += dot(weights3, in0); + + out1.x += dot(weights0, in1); + out1.y += dot(weights1, in1); + out1.z += dot(weights2, in1); + out1.w += dot(weights3, in1); + } + +#ifdef RELU + out0 = fmax(out0, (FLOAT4)0); + out1 = fmax(out1, (FLOAT4)0); +#endif + +#ifdef RELU6 + out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); + out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); +#endif + + const int out_offset = (((out_b_idx*out_c_block + out_c_idx)*out_h + out_h_idx)* out_w + out_w2_idx)*4; + +#ifdef BLOCK_LEAVE + const int remain = out_w - out_w2_idx; + + if (remain >= 2) { + vstore8((FLOAT8)(out0, out1), 0, output+out_offset); + } else if (remain == 1) { + vstore4(out0, 0, output+out_offset); + } +#else + vstore8((FLOAT8)(out0, out1), 0, output+out_offset); +#endif +} + +__kernel +void conv_2d_c4h1w1(GLOBAL_SIZE_2_DIMS + __global const FLOAT *input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#else + __global const FLOAT *weight, +#endif + __global const FLOAT *bias, + __global FLOAT *output, + __private const int2 in_hw, + __private const int inChannel, + __private const int in_c_blocks, + __private const int2 out_hw, + __private const int2 filter_hw, + __private const int2 stride_hw, + __private const int2 pad_hw, + __private const int2 dilate_hw, + __private const int out_w_blocks, + __private const int out_c_blocks, + __private const int out_h_blocks) { + const int out_c_w_idx = get_global_id(0); //c/4 w + const int out_b_h_idx = get_global_id(1); //b h + + DEAL_NON_UNIFORM_DIM2(out_c_w_idx, out_b_h_idx); + + const int out_c_idx = out_c_w_idx / out_hw.y; + const int out_w_idx = out_c_w_idx % out_hw.y; + const int out_b_idx = out_b_h_idx / out_hw.x;//equal to in_b_idx + const int out_h_idx = out_b_h_idx % out_hw.x; +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 dequantScaleC4 = vload4(out_c_idx, dequantScale); + const FLOAT4 dequantOffsetC4 = vload4(out_c_idx, dequantOffset); +#endif + + FLOAT4 out0 = vload4(out_c_idx, bias); + + const int in_w_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); + const int in_h_idx_base = mad24(out_h_idx, stride_hw.x, -pad_hw.x); + + const int kw_start = select(0, (-in_w_idx_base + dilate_hw.y - 1) / dilate_hw.y, in_w_idx_base < 0); + const int kh_start = select(0, (-in_h_idx_base + dilate_hw.x - 1) / dilate_hw.x, in_h_idx_base < 0); + + const int in_w_idx_start = mad24(kw_start, dilate_hw.y, in_w_idx_base); + const int in_w_idx_end = min(mad24(filter_hw.y, dilate_hw.y, in_w_idx_base), in_hw.y); + + const int in_h_idx_start = mad24(kh_start, dilate_hw.x, in_h_idx_base); + const int in_h_idx_end = min(mad24(filter_hw.x, dilate_hw.x, in_h_idx_base), in_hw.x); + + const int weight_oc_offset = out_c_blocks * filter_hw.x * filter_hw.y * 4; + for(ushort in_c_idx = 0; in_c_idx < in_c_blocks; in_c_idx++) { + //weights NC4HW4 [1, 4*icC4, ocC4*kh*kw, 1] xic4 + //index: [0, 4*in_c_idx, out_c_idx*kh*kw + kh_start*kw + kw_start, 0] + int weight_offset = ((((4*in_c_idx+0)* out_c_blocks + out_c_idx) *filter_hw.x + kh_start)*filter_hw.y + kw_start) * 4; + for(int iy = in_h_idx_start; iy < in_h_idx_end; iy += dilate_hw.x) { + for(int ix = in_w_idx_start; ix < in_w_idx_end; ix += dilate_hw.y) { + int inp_offset = (((out_b_idx * in_c_blocks + in_c_idx) * in_hw.x + iy) * in_hw.y + ix) * 4; + FLOAT4 in0 = vload4(0, input+inp_offset); + + const int filter_w_inc = (ix-in_w_idx_start)/dilate_hw.y; + +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeight0 = vload4(filter_w_inc, weight+weight_offset); + char4 charWeight1 = vload4(filter_w_inc, weight+weight_offset+weight_oc_offset); + char4 charWeight2 = vload4(filter_w_inc, weight+weight_offset+weight_oc_offset*2); + char4 charWeight3 = vload4(filter_w_inc, weight+weight_offset+weight_oc_offset*3); + FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightInt40 = vload2(filter_w_inc, weight+weight_offset/2); + uchar2 charWeightInt41 = vload2(filter_w_inc, weight+weight_offset/2+weight_oc_offset/2); + uchar2 charWeightInt42 = vload2(filter_w_inc, weight+weight_offset/2+weight_oc_offset*2/2); + uchar2 charWeightInt43 = vload2(filter_w_inc, weight+weight_offset/2+weight_oc_offset*3/2); + char4 charWeight0 = (char4)(0, 0, 0, 0); + char4 charWeight1 = (char4)(0, 0, 0, 0); + char4 charWeight2 = (char4)(0, 0, 0, 0); + char4 charWeight3 = (char4)(0, 0, 0, 0); + charWeight0.x = (charWeightInt40.s0 >> 4) - 8; + charWeight0.y = (charWeightInt40.s0 & MOD_NUM) - 8; + charWeight0.z = (charWeightInt40.s1 >> 4) - 8; + charWeight0.w = (charWeightInt40.s1 & MOD_NUM) - 8; + charWeight1.x = (charWeightInt41.s0 >> 4) - 8; + charWeight1.y = (charWeightInt41.s0 & MOD_NUM) - 8; + charWeight1.z = (charWeightInt41.s1 >> 4) - 8; + charWeight1.w = (charWeightInt41.s1 & MOD_NUM) - 8; + charWeight2.x = (charWeightInt42.s0 >> 4) - 8; + charWeight2.y = (charWeightInt42.s0 & MOD_NUM) - 8; + charWeight2.z = (charWeightInt42.s1 >> 4) - 8; + charWeight2.w = (charWeightInt42.s1 & MOD_NUM) - 8; + charWeight3.x = (charWeightInt43.s0 >> 4) - 8; + charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; + charWeight3.z = (charWeightInt43.s1 >> 4) - 8; + charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; + FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); +#else + FLOAT4 weight0 = vload4(filter_w_inc, weight+weight_offset); + FLOAT4 weight1 = vload4(filter_w_inc, weight+weight_offset+weight_oc_offset); + FLOAT4 weight2 = vload4(filter_w_inc, weight+weight_offset+weight_oc_offset*2); + FLOAT4 weight3 = vload4(filter_w_inc, weight+weight_offset+weight_oc_offset*3); +#endif + + out0 = mad(in0.x, weight0, out0); + out0 = mad(in0.y, weight1, out0); + out0 = mad(in0.z, weight2, out0); + out0 = mad(in0.w, weight3, out0); + + } + weight_offset += 4*filter_hw.y; + } + } +#ifdef RELU + out0 = fmax(out0, (FLOAT4)0); +#endif + +#ifdef RELU6 + out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); +#endif + + const int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; + vstore4(out0, 0, output+out_offset); + +} + +__kernel +void conv_2d_c4h1w2(GLOBAL_SIZE_2_DIMS + __global const FLOAT *input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#else + __global const FLOAT *weight, +#endif + __global const FLOAT *bias, + __global FLOAT *output, + __private const int2 in_hw, + __private const int inChannel, + __private const int in_c_blocks, + __private const int2 out_hw, + __private const int2 filter_hw, + __private const int2 stride_hw, + __private const int2 pad_hw, + __private const int2 dilate_hw, + __private const int out_w_blocks,//generate width's num + __private const int out_c_blocks, + __private const int out_h_blocks) { + const int out_c_w_idx = get_global_id(0); //c/4 w + const int out_b_h_idx = get_global_id(1); //b h + + DEAL_NON_UNIFORM_DIM2(out_c_w_idx, out_b_h_idx); + + const int out_c_idx = out_c_w_idx / out_w_blocks; + const int out_w_idx = (out_c_w_idx % out_w_blocks) << 1; + const int out_b_idx = out_b_h_idx / out_hw.x;//equal to in_b_idx + const int out_h_idx = out_b_h_idx % out_hw.x; +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 dequantScaleC4 = vload4(out_c_idx, dequantScale); + const FLOAT4 dequantOffsetC4 = vload4(out_c_idx, dequantOffset); +#endif + + FLOAT4 out0 = vload4(out_c_idx, bias); + FLOAT4 out1 = out0; + + const int in_w0_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); + const int in_w1_idx_base = in_w0_idx_base + stride_hw.y; + + const int in_h_idx_base = mad24(out_h_idx, stride_hw.x, -pad_hw.x); - FLOAT4 out0 = vload4(out_c_idx, (__global FLOAT *)bias_ptr); - const int intput_width_idx0 = out_w_idx; + const int kh_start = select(0, (-in_h_idx_base + dilate_hw.x - 1) / dilate_hw.x, in_h_idx_base < 0); + const int in_h_idx_start = mad24(kh_start, dilate_hw.x, in_h_idx_base); + const int in_h_idx_end = min(mad24(filter_hw.x, dilate_hw.x, in_h_idx_base), in_hw.x); - for (int in_channel_block_idx = 0; in_channel_block_idx < in_c_block; ++in_channel_block_idx) { - int input_width_base = mul24(in_channel_block_idx, out_w); + const int weight_oc_offset = out_c_blocks * filter_hw.x * filter_hw.y * 4; + for(ushort in_c_idx = 0; in_c_idx < in_c_blocks; in_c_idx++) { + //weights NC4HW4 [1, 4*icC4, ocC4*kh*kw, 1] xic4 + //index: [0, 4*in_c_idx, out_c_idx*kh*kw + kh_start*kw + kw_start, 0] + int weight_offset = ((((4*in_c_idx+0)* out_c_blocks + out_c_idx) *filter_hw.x + kh_start)*filter_hw.y + 0) * 4; - int offset = mad24(out_c_idx, in_c_block, in_channel_block_idx)*4; - const int inp_offset = - (((out_b_idx*in_c_block + in_channel_block_idx)*out_h + out_h_idx)* out_w + intput_width_idx0)*4; - - FLOAT4 in0 = vload4(0, input+inp_offset); + for(int iy = in_h_idx_start; iy < in_h_idx_end; iy += dilate_hw.x) { + const int inp_offset_base = (((out_b_idx * in_c_blocks + in_c_idx) * in_hw.x + iy) * in_hw.y + 0) * 4; - FLOAT4 weights0 = vload4(offset, (__global FLOAT *)kernel_ptr); - FLOAT4 weights1 = vload4(offset + 1, (__global FLOAT *)kernel_ptr); - FLOAT4 weights2 = vload4(offset + 2, (__global FLOAT *)kernel_ptr); - FLOAT4 weights3 = vload4(offset + 3, (__global FLOAT *)kernel_ptr); - - out0.x += dot(weights0, in0); - out0.y += dot(weights1, in0); - out0.z += dot(weights2, in0); - out0.w += dot(weights3, in0); - } + for(int fw = 0; fw < filter_hw.y; fw++) { + const int in_w0_idx = fw * dilate_hw.y + in_w0_idx_base; + const int in_w1_idx = fw * dilate_hw.y + in_w1_idx_base; + + FLOAT4 in0 = (in_w0_idx < 0 || in_w0_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w0_idx, input+inp_offset_base); + FLOAT4 in1 = (in_w1_idx < 0 || in_w1_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w1_idx, input+inp_offset_base); + +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeight0 = vload4(0, weight+weight_offset); + char4 charWeight1 = vload4(0, weight+weight_offset+weight_oc_offset); + char4 charWeight2 = vload4(0, weight+weight_offset+weight_oc_offset*2); + char4 charWeight3 = vload4(0, weight+weight_offset+weight_oc_offset*3); + FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightInt40 = vload2(0, weight+weight_offset/2); + uchar2 charWeightInt41 = vload2(0, weight+weight_offset/2+weight_oc_offset/2); + uchar2 charWeightInt42 = vload2(0, weight+weight_offset/2+weight_oc_offset*2/2); + uchar2 charWeightInt43 = vload2(0, weight+weight_offset/2+weight_oc_offset*3/2); + char4 charWeight0 = (char4)(0, 0, 0, 0); + char4 charWeight1 = (char4)(0, 0, 0, 0); + char4 charWeight2 = (char4)(0, 0, 0, 0); + char4 charWeight3 = (char4)(0, 0, 0, 0); + charWeight0.x = (charWeightInt40.s0 >> 4) - 8; + charWeight0.y = (charWeightInt40.s0 & MOD_NUM) - 8; + charWeight0.z = (charWeightInt40.s1 >> 4) - 8; + charWeight0.w = (charWeightInt40.s1 & MOD_NUM) - 8; + charWeight1.x = (charWeightInt41.s0 >> 4) - 8; + charWeight1.y = (charWeightInt41.s0 & MOD_NUM) - 8; + charWeight1.z = (charWeightInt41.s1 >> 4) - 8; + charWeight1.w = (charWeightInt41.s1 & MOD_NUM) - 8; + charWeight2.x = (charWeightInt42.s0 >> 4) - 8; + charWeight2.y = (charWeightInt42.s0 & MOD_NUM) - 8; + charWeight2.z = (charWeightInt42.s1 >> 4) - 8; + charWeight2.w = (charWeightInt42.s1 & MOD_NUM) - 8; + charWeight3.x = (charWeightInt43.s0 >> 4) - 8; + charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; + charWeight3.z = (charWeightInt43.s1 >> 4) - 8; + charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; + FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); +#else + FLOAT4 weight0 = vload4(0, weight+weight_offset); + FLOAT4 weight1 = vload4(0, weight+weight_offset+weight_oc_offset); + FLOAT4 weight2 = vload4(0, weight+weight_offset+weight_oc_offset*2); + FLOAT4 weight3 = vload4(0, weight+weight_offset+weight_oc_offset*3); +#endif + out0 = mad(in0.x, weight0, out0); + out0 = mad(in0.y, weight1, out0); + out0 = mad(in0.z, weight2, out0); + out0 = mad(in0.w, weight3, out0); + + out1 = mad(in1.x, weight0, out1); + out1 = mad(in1.y, weight1, out1); + out1 = mad(in1.z, weight2, out1); + out1 = mad(in1.w, weight3, out1); + + weight_offset += 4; + } + } + } #ifdef RELU out0 = fmax(out0, (FLOAT4)0); + out1 = fmax(out1, (FLOAT4)0); #endif #ifdef RELU6 out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); + out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); #endif - const int out_offset = (((out_b_idx*out_c_block + out_c_idx)*out_h + out_h_idx)* out_w + out_w_idx)*4; - + const int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; +#ifdef BLOCK_LEAVE vstore4(out0, 0, output+out_offset); + if(out_w_idx + 1 >= out_hw.y) return; + vstore4(out1, 1, output+out_offset); +#else + vstore8((FLOAT8)(out0, out1), 0, output+out_offset); +#endif } - __kernel -void conv_2d_1x1_c4h1w2(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, - __global const FLOAT *input, - __global const FLOAT *kernel_ptr, - __global const FLOAT *bias_ptr, - __global FLOAT *output, - __private const int in_c_block, - __private const int out_h, - __private const int out_w, - __private const int out_c_block) { - +void conv_2d_c4h1w4(GLOBAL_SIZE_2_DIMS + __global const FLOAT *input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#else + __global const FLOAT *weight, +#endif + __global const FLOAT *bias, + __global FLOAT *output, + __private const int2 in_hw, + __private const int inChannel, + __private const int in_c_blocks, + __private const int2 out_hw, + __private const int2 filter_hw, + __private const int2 stride_hw, + __private const int2 pad_hw, + __private const int2 dilate_hw, + __private const int out_w_blocks, + __private const int out_c_blocks, + __private const int out_h_blocks) { const int out_c_w_idx = get_global_id(0); //c/4 w const int out_b_h_idx = get_global_id(1); //b h DEAL_NON_UNIFORM_DIM2(out_c_w_idx, out_b_h_idx); const int out_c_idx = out_c_w_idx / out_w_blocks; - const int out_w_idx = out_c_w_idx % out_w_blocks; - const int out_b_idx = out_b_h_idx / out_h;//equal to in_b_idx - const int out_h_idx = out_b_h_idx % out_h;//equal to in_h_idx - - const int out_w2_idx = mul24(out_w_idx, 2); + const int out_w_idx = (out_c_w_idx % out_w_blocks) << 2; + const int out_b_idx = out_b_h_idx / out_hw.x;//equal to in_b_idx + const int out_h_idx = out_b_h_idx % out_hw.x; +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 dequantScaleC4 = vload4(out_c_idx, dequantScale); + const FLOAT4 dequantOffsetC4 = vload4(out_c_idx, dequantOffset); +#endif - FLOAT4 out0 = vload4(out_c_idx, (__global FLOAT *)bias_ptr); + FLOAT4 out0 = vload4(out_c_idx, bias); FLOAT4 out1 = out0; + FLOAT4 out2 = out0; + FLOAT4 out3 = out0; - const int intput_width_idx0 = out_w2_idx; + const int in_w0_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); + const int in_w1_idx_base = in_w0_idx_base + stride_hw.y; + const int in_w2_idx_base = in_w1_idx_base + stride_hw.y; + const int in_w3_idx_base = in_w2_idx_base + stride_hw.y; + + const int in_h_idx_base = mad24(out_h_idx, stride_hw.x, -pad_hw.x); - for (int in_channel_block_idx = 0; in_channel_block_idx < in_c_block; ++in_channel_block_idx) { - int input_width_base = mul24(in_channel_block_idx, out_w); + const int kh_start = select(0, (-in_h_idx_base + dilate_hw.x - 1) / dilate_hw.x, in_h_idx_base < 0); + const int in_h_idx_start = mad24(kh_start, dilate_hw.x, in_h_idx_base); + const int in_h_idx_end = min(mad24(filter_hw.x, dilate_hw.x, in_h_idx_base), in_hw.x); + + const int weight_oc_offset = out_c_blocks * filter_hw.x * filter_hw.y * 4; + for(ushort in_c_idx = 0; in_c_idx < in_c_blocks; in_c_idx++) { + //weights NC4HW4 [1, 4*icC4, ocC4*kh*kw, 1] xic4 + //index: [0, 4*in_c_idx, out_c_idx*kh*kw + kh_start*kw + kw_start, 0] + int weight_offset = ((((4*in_c_idx+0)* out_c_blocks + out_c_idx) *filter_hw.x + kh_start)*filter_hw.y + 0) * 4; - int offset = mad24(out_c_idx, in_c_block, in_channel_block_idx)*4; - const int inp_offset = - (((out_b_idx*in_c_block + in_channel_block_idx)*out_h + out_h_idx)* out_w + intput_width_idx0)*4; - - FLOAT4 in0 = vload4(0, input+inp_offset); - FLOAT4 in1 = vload4(1, input+inp_offset);; + for(int iy = in_h_idx_start; iy < in_h_idx_end; iy += dilate_hw.x) { + const int inp_offset_base = (((out_b_idx * in_c_blocks + in_c_idx) * in_hw.x + iy) * in_hw.y + 0) * 4; - FLOAT4 weights0 = vload4(offset, (__global FLOAT *)kernel_ptr); - FLOAT4 weights1 = vload4(offset + 1, (__global FLOAT *)kernel_ptr); - FLOAT4 weights2 = vload4(offset + 2, (__global FLOAT *)kernel_ptr); - FLOAT4 weights3 = vload4(offset + 3, (__global FLOAT *)kernel_ptr); - - out0.x += dot(weights0, in0); - out0.y += dot(weights1, in0); - out0.z += dot(weights2, in0); - out0.w += dot(weights3, in0); + for(int fw = 0; fw < filter_hw.y; fw++) { + const int in_w0_idx = fw * dilate_hw.y + in_w0_idx_base; + const int in_w1_idx = fw * dilate_hw.y + in_w1_idx_base; + const int in_w2_idx = fw * dilate_hw.y + in_w2_idx_base; + const int in_w3_idx = fw * dilate_hw.y + in_w3_idx_base; - out1.x += dot(weights0, in1); - out1.y += dot(weights1, in1); - out1.z += dot(weights2, in1); - out1.w += dot(weights3, in1); - } + FLOAT4 in0 = (in_w0_idx < 0 || in_w0_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w0_idx, input+inp_offset_base); + FLOAT4 in1 = (in_w1_idx < 0 || in_w1_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w1_idx, input+inp_offset_base); + FLOAT4 in2 = (in_w2_idx < 0 || in_w2_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w2_idx, input+inp_offset_base); + FLOAT4 in3 = (in_w3_idx < 0 || in_w3_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w3_idx, input+inp_offset_base); + +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeight0 = vload4(0, weight+weight_offset); + char4 charWeight1 = vload4(0, weight+weight_offset+weight_oc_offset); + char4 charWeight2 = vload4(0, weight+weight_offset+weight_oc_offset*2); + char4 charWeight3 = vload4(0, weight+weight_offset+weight_oc_offset*3); + FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightInt40 = vload2(0, weight+weight_offset/2); + uchar2 charWeightInt41 = vload2(0, weight+weight_offset/2+weight_oc_offset/2); + uchar2 charWeightInt42 = vload2(0, weight+weight_offset/2+weight_oc_offset*2/2); + uchar2 charWeightInt43 = vload2(0, weight+weight_offset/2+weight_oc_offset*3/2); + char4 charWeight0 = (char4)(0, 0, 0, 0); + char4 charWeight1 = (char4)(0, 0, 0, 0); + char4 charWeight2 = (char4)(0, 0, 0, 0); + char4 charWeight3 = (char4)(0, 0, 0, 0); + charWeight0.x = (charWeightInt40.s0 >> 4) - 8; + charWeight0.y = (charWeightInt40.s0 & MOD_NUM) - 8; + charWeight0.z = (charWeightInt40.s1 >> 4) - 8; + charWeight0.w = (charWeightInt40.s1 & MOD_NUM) - 8; + charWeight1.x = (charWeightInt41.s0 >> 4) - 8; + charWeight1.y = (charWeightInt41.s0 & MOD_NUM) - 8; + charWeight1.z = (charWeightInt41.s1 >> 4) - 8; + charWeight1.w = (charWeightInt41.s1 & MOD_NUM) - 8; + charWeight2.x = (charWeightInt42.s0 >> 4) - 8; + charWeight2.y = (charWeightInt42.s0 & MOD_NUM) - 8; + charWeight2.z = (charWeightInt42.s1 >> 4) - 8; + charWeight2.w = (charWeightInt42.s1 & MOD_NUM) - 8; + charWeight3.x = (charWeightInt43.s0 >> 4) - 8; + charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; + charWeight3.z = (charWeightInt43.s1 >> 4) - 8; + charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; + FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); +#else + FLOAT4 weight0 = vload4(0, weight+weight_offset); + FLOAT4 weight1 = vload4(0, weight+weight_offset+weight_oc_offset); + FLOAT4 weight2 = vload4(0, weight+weight_offset+weight_oc_offset*2); + FLOAT4 weight3 = vload4(0, weight+weight_offset+weight_oc_offset*3); +#endif + out0 = mad(in0.x, weight0, out0); + out0 = mad(in0.y, weight1, out0); + out0 = mad(in0.z, weight2, out0); + out0 = mad(in0.w, weight3, out0); + + out1 = mad(in1.x, weight0, out1); + out1 = mad(in1.y, weight1, out1); + out1 = mad(in1.z, weight2, out1); + out1 = mad(in1.w, weight3, out1); + + out2 = mad(in2.x, weight0, out2); + out2 = mad(in2.y, weight1, out2); + out2 = mad(in2.z, weight2, out2); + out2 = mad(in2.w, weight3, out2); + + out3 = mad(in3.x, weight0, out3); + out3 = mad(in3.y, weight1, out3); + out3 = mad(in3.z, weight2, out3); + out3 = mad(in3.w, weight3, out3); + + weight_offset += 4; + } + } + } #ifdef RELU out0 = fmax(out0, (FLOAT4)0); out1 = fmax(out1, (FLOAT4)0); + out2 = fmax(out2, (FLOAT4)0); + out3 = fmax(out3, (FLOAT4)0); #endif #ifdef RELU6 out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); + out2 = clamp(out2, (FLOAT4)0, (FLOAT4)6); + out3 = clamp(out3, (FLOAT4)0, (FLOAT4)6); #endif - const int out_offset = (((out_b_idx*out_c_block + out_c_idx)*out_h + out_h_idx)* out_w + out_w2_idx)*4; - + const int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; #ifdef BLOCK_LEAVE - const int remain = out_w - out_w2_idx; + const int remain = out_hw.y - out_w_idx; - if (remain >= 2) { + if (remain >= 4) { + vstore16((FLOAT16)(out0, out1, out2, out3), 0, output+out_offset); + }else if(remain == 3){ vstore8((FLOAT8)(out0, out1), 0, output+out_offset); - } else if (remain == 1) { + vstore4(out2, 2, output+out_offset); + }else if(remain == 2){ + vstore8((FLOAT8)(out0, out1), 0, output+out_offset); + }else if(remain == 1){ vstore4(out0, 0, output+out_offset); } #else - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); + vstore16((FLOAT16)(out0, out1, out2, out3), 0, output+out_offset); #endif } __kernel void conv_2d_c4h4w1(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#else __global const FLOAT *weight, +#endif __global const FLOAT *bias, __global FLOAT *output, __private const int2 in_hw, @@ -873,6 +1392,10 @@ void conv_2d_c4h4w1(GLOBAL_SIZE_2_DIMS const int out_w_idx = out_c_w_idx % out_w_blocks; const int out_b_idx = out_b_h_idx / out_h_blocks;//equal to in_b_idx const int out_h_idx = (out_b_h_idx % out_h_blocks) << 2; +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 dequantScaleC4 = vload4(out_c_idx, dequantScale); + const FLOAT4 dequantOffsetC4 = vload4(out_c_idx, dequantOffset); +#endif FLOAT4 out0 = vload4(out_c_idx, bias); FLOAT4 out1 = out0; @@ -910,11 +1433,50 @@ void conv_2d_c4h4w1(GLOBAL_SIZE_2_DIMS FLOAT4 in2 = (in_h2_idx < 0 || in_h2_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h2_idx + fw, input+inp_offset_base); FLOAT4 in3 = (in_h3_idx < 0 || in_h3_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h3_idx + fw, input+inp_offset_base); +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeight0 = vload4(0, weight+weight_offset); + char4 charWeight1 = vload4(0, weight+weight_offset+weight_oc_offset); + char4 charWeight2 = vload4(0, weight+weight_offset+weight_oc_offset*2); + char4 charWeight3 = vload4(0, weight+weight_offset+weight_oc_offset*3); + FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightInt40 = vload2(0, weight+weight_offset/2); + uchar2 charWeightInt41 = vload2(0, weight+weight_offset/2+weight_oc_offset/2); + uchar2 charWeightInt42 = vload2(0, weight+weight_offset/2+weight_oc_offset*2/2); + uchar2 charWeightInt43 = vload2(0, weight+weight_offset/2+weight_oc_offset*3/2); + char4 charWeight0 = (char4)(0, 0, 0, 0); + char4 charWeight1 = (char4)(0, 0, 0, 0); + char4 charWeight2 = (char4)(0, 0, 0, 0); + char4 charWeight3 = (char4)(0, 0, 0, 0); + charWeight0.x = (charWeightInt40.s0 >> 4) - 8; + charWeight0.y = (charWeightInt40.s0 & MOD_NUM) - 8; + charWeight0.z = (charWeightInt40.s1 >> 4) - 8; + charWeight0.w = (charWeightInt40.s1 & MOD_NUM) - 8; + charWeight1.x = (charWeightInt41.s0 >> 4) - 8; + charWeight1.y = (charWeightInt41.s0 & MOD_NUM) - 8; + charWeight1.z = (charWeightInt41.s1 >> 4) - 8; + charWeight1.w = (charWeightInt41.s1 & MOD_NUM) - 8; + charWeight2.x = (charWeightInt42.s0 >> 4) - 8; + charWeight2.y = (charWeightInt42.s0 & MOD_NUM) - 8; + charWeight2.z = (charWeightInt42.s1 >> 4) - 8; + charWeight2.w = (charWeightInt42.s1 & MOD_NUM) - 8; + charWeight3.x = (charWeightInt43.s0 >> 4) - 8; + charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; + charWeight3.z = (charWeightInt43.s1 >> 4) - 8; + charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; + FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); + FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); +#else FLOAT4 weight0 = vload4(0, weight+weight_offset); FLOAT4 weight1 = vload4(0, weight+weight_offset+weight_oc_offset); FLOAT4 weight2 = vload4(0, weight+weight_offset+weight_oc_offset*2); FLOAT4 weight3 = vload4(0, weight+weight_offset+weight_oc_offset*3); - +#endif out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); out0 = mad(in0.z, weight2, out0); @@ -982,7 +1544,17 @@ void conv_2d_c4h4w1(GLOBAL_SIZE_2_DIMS __kernel void conv_2d_c8h4w1(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#else __global const FLOAT *weight, +#endif __global const FLOAT *bias, __global FLOAT *output, __private const int2 in_hw, @@ -1005,6 +1577,12 @@ void conv_2d_c8h4w1(GLOBAL_SIZE_2_DIMS const int out_w_idx = out_c_w_idx % out_w_blocks; const int out_b_idx = out_b_h_idx / out_h_blocks;//equal to in_b_idx const int out_h_idx = (out_b_h_idx % out_h_blocks) << 2; +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 dequantScaleC03 = vload4(out_c_idx, dequantScale); + const FLOAT4 dequantOffsetC03 = vload4(out_c_idx, dequantOffset); + const FLOAT4 dequantScaleC47 = vload4(out_c_idx + 1, dequantScale); + const FLOAT4 dequantOffsetC47 = vload4(out_c_idx + 1, dequantOffset); +#endif FLOAT4 out0 = vload4(out_c_idx, bias); FLOAT4 out1 = out0; @@ -1047,10 +1625,50 @@ void conv_2d_c8h4w1(GLOBAL_SIZE_2_DIMS FLOAT4 in2 = (in_h2_idx < 0 || in_h2_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h2_idx + fw, input+inp_offset_base); FLOAT4 in3 = (in_h3_idx < 0 || in_h3_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h3_idx + fw, input+inp_offset_base); +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeight0 = vload4(0, weight+weight_offset); + char4 charWeight1 = vload4(0, weight+weight_offset+weight_ic_offset); + char4 charWeight2 = vload4(0, weight+weight_offset+weight_ic_offset*2); + char4 charWeight3 = vload4(0, weight+weight_offset+weight_ic_offset*3); + FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC03, dequantOffsetC03); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightInt40 = vload2(0, weight+weight_offset/2); + uchar2 charWeightInt41 = vload2(0, weight+weight_offset/2+weight_ic_offset/2); + uchar2 charWeightInt42 = vload2(0, weight+weight_offset/2+weight_ic_offset*2/2); + uchar2 charWeightInt43 = vload2(0, weight+weight_offset/2+weight_ic_offset*3/2); + char4 charWeight0 = (char4)(0, 0, 0, 0); + char4 charWeight1 = (char4)(0, 0, 0, 0); + char4 charWeight2 = (char4)(0, 0, 0, 0); + char4 charWeight3 = (char4)(0, 0, 0, 0); + charWeight0.x = (charWeightInt40.s0 >> 4) - 8; + charWeight0.y = (charWeightInt40.s0 & MOD_NUM) - 8; + charWeight0.z = (charWeightInt40.s1 >> 4) - 8; + charWeight0.w = (charWeightInt40.s1 & MOD_NUM) - 8; + charWeight1.x = (charWeightInt41.s0 >> 4) - 8; + charWeight1.y = (charWeightInt41.s0 & MOD_NUM) - 8; + charWeight1.z = (charWeightInt41.s1 >> 4) - 8; + charWeight1.w = (charWeightInt41.s1 & MOD_NUM) - 8; + charWeight2.x = (charWeightInt42.s0 >> 4) - 8; + charWeight2.y = (charWeightInt42.s0 & MOD_NUM) - 8; + charWeight2.z = (charWeightInt42.s1 >> 4) - 8; + charWeight2.w = (charWeightInt42.s1 & MOD_NUM)- 8; + charWeight3.x = (charWeightInt43.s0 >> 4) - 8; + charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; + charWeight3.z = (charWeightInt43.s1 >> 4) - 8; + charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; + FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC03, dequantOffsetC03); +#else FLOAT4 weight0 = vload4(0, weight+weight_offset); FLOAT4 weight1 = vload4(0, weight+weight_offset+weight_ic_offset); FLOAT4 weight2 = vload4(0, weight+weight_offset+weight_ic_offset*2); FLOAT4 weight3 = vload4(0, weight+weight_offset+weight_ic_offset*3); +#endif out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); @@ -1071,12 +1689,52 @@ void conv_2d_c8h4w1(GLOBAL_SIZE_2_DIMS out3 = mad(in3.y, weight1, out3); out3 = mad(in3.z, weight2, out3); out3 = mad(in3.w, weight3, out3); - + +#if (defined USE_LOW_BIT_WEIGHT_INT8) + charWeight0 = vload4(0, weight+weight_offset+weight_oc_offset); + charWeight1 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset); + charWeight2 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*2); + charWeight3 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*3); + weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC47, dequantOffsetC47); + weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC47, dequantOffsetC47); + weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC47, dequantOffsetC47); + weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC47, dequantOffsetC47); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + charWeightInt40 = vload2(0, weight+weight_offset/2+weight_oc_offset/2); + charWeightInt41 = vload2(0, weight+weight_offset/2+weight_oc_offset/2+weight_ic_offset/2); + charWeightInt42 = vload2(0, weight+weight_offset/2+weight_oc_offset/2+weight_ic_offset*2/2); + charWeightInt43 = vload2(0, weight+weight_offset/2+weight_oc_offset/2+weight_ic_offset*3/2); + charWeight0 = (char4)(0, 0, 0, 0); + charWeight1 = (char4)(0, 0, 0, 0); + charWeight2 = (char4)(0, 0, 0, 0); + charWeight3 = (char4)(0, 0, 0, 0); + charWeight0.x = (charWeightInt40.s0 >> 4) - 8; + charWeight0.y = (charWeightInt40.s0 & MOD_NUM) - 8; + charWeight0.z = (charWeightInt40.s1 >> 4) - 8; + charWeight0.w = (charWeightInt40.s1 & MOD_NUM) - 8; + charWeight1.x = (charWeightInt41.s0 >> 4) - 8; + charWeight1.y = (charWeightInt41.s0 & MOD_NUM) - 8; + charWeight1.z = (charWeightInt41.s1 >> 4) - 8; + charWeight1.w = (charWeightInt41.s1 & MOD_NUM)- 8; + charWeight2.x = (charWeightInt42.s0 >> 4) - 8; + charWeight2.y = (charWeightInt42.s0 & MOD_NUM) - 8; + charWeight2.z = (charWeightInt42.s1 >> 4) - 8; + charWeight2.w = (charWeightInt42.s1 & MOD_NUM)- 8; + charWeight3.x = (charWeightInt43.s0 >> 4) - 8; + charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; + charWeight3.z = (charWeightInt43.s1 >> 4) - 8; + charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; + weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC47, dequantOffsetC47); + weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC47, dequantOffsetC47); + weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC47, dequantOffsetC47); + weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC47, dequantOffsetC47); +#else weight0 = vload4(0, weight+weight_offset+weight_oc_offset); - weight1 = vload4(0, weight+weight_offset+weight_ic_offset+weight_oc_offset); - weight2 = vload4(0, weight+weight_offset+weight_ic_offset*2+weight_oc_offset); - weight3 = vload4(0, weight+weight_offset+weight_ic_offset*3+weight_oc_offset); - + weight1 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset); + weight2 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*2); + weight3 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*3); +#endif + out4 = mad(in0.x, weight0, out4); out4 = mad(in0.y, weight1, out4); out4 = mad(in0.z, weight2, out4); @@ -1183,7 +1841,17 @@ void conv_2d_c8h4w1(GLOBAL_SIZE_2_DIMS __kernel void conv_2d_c8h2w1(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#else __global const FLOAT *weight, +#endif __global const FLOAT *bias, __global FLOAT *output, __private const int2 in_hw, @@ -1206,6 +1874,12 @@ void conv_2d_c8h2w1(GLOBAL_SIZE_2_DIMS const int out_w_idx = out_c_w_idx % out_w_blocks; const int out_b_idx = out_b_h_idx / out_h_blocks;//equal to in_b_idx const int out_h_idx = (out_b_h_idx % out_h_blocks) << 1; +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 dequantScaleC03 = vload4(out_c_idx, dequantScale); + const FLOAT4 dequantOffsetC03 = vload4(out_c_idx, dequantOffset); + const FLOAT4 dequantScaleC47 = vload4(out_c_idx + 1, dequantScale); + const FLOAT4 dequantOffsetC47 = vload4(out_c_idx + 1, dequantOffset); +#endif FLOAT4 out0 = vload4(out_c_idx, bias); FLOAT4 out1 = out0; @@ -1224,6 +1898,7 @@ void conv_2d_c8h2w1(GLOBAL_SIZE_2_DIMS const int weight_oc_offset = filter_hw.x * filter_hw.y * 4; const int weight_ic_offset = out_c_blocks * weight_oc_offset; const int in_hw_size = in_hw.x * in_hw.y; + // weight: [ic/4, oc, 4], loop: ic/4 for(ushort in_c_idx = 0; in_c_idx < in_c_blocks; in_c_idx++) { //weights NC4HW4 [1, 4*icC4, ocC4*kh*kw, 1] xic4 //index: [0, 4*in_c_idx, out_c_idx*kh*kw + kh_start*kw + kw_start, 0] @@ -1237,12 +1912,50 @@ void conv_2d_c8h2w1(GLOBAL_SIZE_2_DIMS for(int fw = in_w_idx_start; fw < in_w_idx_end; fw += dilate_hw.y) { FLOAT4 in0 = (in_h0_idx < 0 || in_h0_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h0_idx + fw, input+inp_offset_base); FLOAT4 in1 = (in_h1_idx < 0 || in_h1_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h1_idx + fw, input+inp_offset_base); - +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeight0 = vload4(0, weight+weight_offset); + char4 charWeight1 = vload4(0, weight+weight_offset+weight_ic_offset); + char4 charWeight2 = vload4(0, weight+weight_offset+weight_ic_offset*2); + char4 charWeight3 = vload4(0, weight+weight_offset+weight_ic_offset*3); + FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC03, dequantOffsetC03); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightInt40 = vload2(0, weight+weight_offset/2); + uchar2 charWeightInt41 = vload2(0, weight+weight_offset/2+weight_ic_offset/2); + uchar2 charWeightInt42 = vload2(0, weight+weight_offset/2+weight_ic_offset*2/2); + uchar2 charWeightInt43 = vload2(0, weight+weight_offset/2+weight_ic_offset*3/2); + char4 charWeight0 = (char4)(0, 0, 0, 0); + char4 charWeight1 = (char4)(0, 0, 0, 0); + char4 charWeight2 = (char4)(0, 0, 0, 0); + char4 charWeight3 = (char4)(0, 0, 0, 0); + charWeight0.x = (charWeightInt40.s0 >> 4) - 8; + charWeight0.y = (charWeightInt40.s0 & MOD_NUM) - 8; + charWeight0.z = (charWeightInt40.s1 >> 4) - 8; + charWeight0.w = (charWeightInt40.s1 & MOD_NUM) - 8; + charWeight1.x = (charWeightInt41.s0 >> 4) - 8; + charWeight1.y = (charWeightInt41.s0 & MOD_NUM) - 8; + charWeight1.z = (charWeightInt41.s1 >> 4) - 8; + charWeight1.w = (charWeightInt41.s1 & MOD_NUM) - 8; + charWeight2.x = (charWeightInt42.s0 >> 4) - 8; + charWeight2.y = (charWeightInt42.s0 & MOD_NUM) - 8; + charWeight2.z = (charWeightInt42.s1 >> 4) - 8; + charWeight2.w = (charWeightInt42.s1 & MOD_NUM) - 8; + charWeight3.x = (charWeightInt43.s0 >> 4) - 8; + charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; + charWeight3.z = (charWeightInt43.s1 >> 4) - 8; + charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; + FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC03, dequantOffsetC03); +#else FLOAT4 weight0 = vload4(0, weight+weight_offset); FLOAT4 weight1 = vload4(0, weight+weight_offset+weight_ic_offset); FLOAT4 weight2 = vload4(0, weight+weight_offset+weight_ic_offset*2); FLOAT4 weight3 = vload4(0, weight+weight_offset+weight_ic_offset*3); - +#endif out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); out0 = mad(in0.z, weight2, out0); @@ -1253,11 +1966,50 @@ void conv_2d_c8h2w1(GLOBAL_SIZE_2_DIMS out1 = mad(in1.z, weight2, out1); out1 = mad(in1.w, weight3, out1); +#if (defined USE_LOW_BIT_WEIGHT_INT8) + charWeight0 = vload4(0, weight+weight_offset+weight_oc_offset); + charWeight1 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset); + charWeight2 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*2); + charWeight3 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*3); + weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC47, dequantOffsetC47); + weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC47, dequantOffsetC47); + weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC47, dequantOffsetC47); + weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC47, dequantOffsetC47); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + charWeightInt40 = vload2(0, weight+weight_offset/2+weight_oc_offset/2); + charWeightInt41 = vload2(0, weight+weight_offset/2+weight_oc_offset/2+weight_ic_offset/2); + charWeightInt42 = vload2(0, weight+weight_offset/2+weight_oc_offset/2+weight_ic_offset*2/2); + charWeightInt43 = vload2(0, weight+weight_offset/2+weight_oc_offset/2+weight_ic_offset*3/2); + charWeight0 = (char4)(0, 0, 0, 0); + charWeight1 = (char4)(0, 0, 0, 0); + charWeight2 = (char4)(0, 0, 0, 0); + charWeight3 = (char4)(0, 0, 0, 0); + charWeight0.x = (charWeightInt40.s0 >> 4) - 8; + charWeight0.y = (charWeightInt40.s0& MOD_NUM) - 8; + charWeight0.z = (charWeightInt40.s1 >> 4) - 8; + charWeight0.w = (charWeightInt40.s1& MOD_NUM) - 8; + charWeight1.x = (charWeightInt41.s0 >> 4) - 8; + charWeight1.y = (charWeightInt41.s0& MOD_NUM) - 8; + charWeight1.z = (charWeightInt41.s1 >> 4) - 8; + charWeight1.w = (charWeightInt41.s1& MOD_NUM) - 8; + charWeight2.x = (charWeightInt42.s0 >> 4) - 8; + charWeight2.y = (charWeightInt42.s0& MOD_NUM) - 8; + charWeight2.z = (charWeightInt42.s1 >> 4) - 8; + charWeight2.w = (charWeightInt42.s1& MOD_NUM) - 8; + charWeight3.x = (charWeightInt43.s0 >> 4) - 8; + charWeight3.y = (charWeightInt43.s0& MOD_NUM) - 8; + charWeight3.z = (charWeightInt43.s1 >> 4) - 8; + charWeight3.w = (charWeightInt43.s1& MOD_NUM) - 8; + weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC47, dequantOffsetC47); + weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC47, dequantOffsetC47); + weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC47, dequantOffsetC47); + weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC47, dequantOffsetC47); +#else weight0 = vload4(0, weight+weight_offset+weight_oc_offset); - weight1 = vload4(0, weight+weight_offset+weight_ic_offset+weight_oc_offset); - weight2 = vload4(0, weight+weight_offset+weight_ic_offset*2+weight_oc_offset); - weight3 = vload4(0, weight+weight_offset+weight_ic_offset*3+weight_oc_offset); - + weight1 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset); + weight2 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*2); + weight3 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*3); +#endif out2 = mad(in0.x, weight0, out2); out2 = mad(in0.y, weight1, out2); out2 = mad(in0.z, weight2, out2); @@ -1324,7 +2076,17 @@ void conv_2d_c8h2w1(GLOBAL_SIZE_2_DIMS __kernel void conv_2d_c8h1w4(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#else __global const FLOAT *weight, +#endif __global const FLOAT *bias, __global FLOAT *output, __private const int2 in_hw, @@ -1347,6 +2109,12 @@ void conv_2d_c8h1w4(GLOBAL_SIZE_2_DIMS const int out_w_idx = (out_c_w_idx % out_w_blocks) << 2; const int out_b_idx = out_b_h_idx / out_hw.x;//equal to in_b_idx const int out_h_idx = out_b_h_idx % out_hw.x; +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 dequantScaleC03 = vload4(out_c_idx, dequantScale); + const FLOAT4 dequantOffsetC03 = vload4(out_c_idx, dequantOffset); + const FLOAT4 dequantScaleC47 = vload4(out_c_idx + 1, dequantScale); + const FLOAT4 dequantOffsetC47 = vload4(out_c_idx + 1, dequantOffset); +#endif FLOAT4 out0 = vload4(out_c_idx, bias); FLOAT4 out1 = out0; @@ -1390,11 +2158,51 @@ void conv_2d_c8h1w4(GLOBAL_SIZE_2_DIMS FLOAT4 in2 = (in_w2_idx < 0 || in_w2_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w2_idx, input+inp_offset_base); FLOAT4 in3 = (in_w3_idx < 0 || in_w3_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w3_idx, input+inp_offset_base); +#if (defined USE_LOW_BIT_WEIGHT_INT8) + char4 charWeight0 = vload4(0, weight+weight_offset); + char4 charWeight1 = vload4(0, weight+weight_offset+weight_ic_offset); + char4 charWeight2 = vload4(0, weight+weight_offset+weight_ic_offset*2); + char4 charWeight3 = vload4(0, weight+weight_offset+weight_ic_offset*3); + FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC03, dequantOffsetC03); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar2 charWeightInt40 = vload2(0, weight+weight_offset/2); + uchar2 charWeightInt41 = vload2(0, weight+weight_offset/2+weight_ic_offset/2); + uchar2 charWeightInt42 = vload2(0, weight+weight_offset/2+weight_ic_offset*2/2); + uchar2 charWeightInt43 = vload2(0, weight+weight_offset/2+weight_ic_offset*3/2); + char4 charWeight0 = (char4)(0, 0, 0, 0); + char4 charWeight1 = (char4)(0, 0, 0, 0); + char4 charWeight2 = (char4)(0, 0, 0, 0); + char4 charWeight3 = (char4)(0, 0, 0, 0); + charWeight0.x = (charWeightInt40.s0 >> 4) - 8; + charWeight0.y = (charWeightInt40.s0 & MOD_NUM) - 8; + charWeight0.z = (charWeightInt40.s1 >> 4) - 8; + charWeight0.w = (charWeightInt40.s1 & MOD_NUM) - 8; + charWeight1.x = (charWeightInt41.s0 >> 4) - 8; + charWeight1.y = (charWeightInt41.s0 & MOD_NUM) - 8; + charWeight1.z = (charWeightInt41.s1 >> 4) - 8; + charWeight1.w = (charWeightInt41.s1 & MOD_NUM) - 8; + charWeight2.x = (charWeightInt42.s0 >> 4) - 8; + charWeight2.y = (charWeightInt42.s0 & MOD_NUM) - 8; + charWeight2.z = (charWeightInt42.s1 >> 4) - 8; + charWeight2.w = (charWeightInt42.s1 & MOD_NUM) - 8; + charWeight3.x = (charWeightInt43.s0 >> 4) - 8; + charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; + charWeight3.z = (charWeightInt43.s1 >> 4) - 8; + charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; + FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC03, dequantOffsetC03); + FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC03, dequantOffsetC03); +#else FLOAT4 weight0 = vload4(0, weight+weight_offset); FLOAT4 weight1 = vload4(0, weight+weight_offset+weight_ic_offset); FLOAT4 weight2 = vload4(0, weight+weight_offset+weight_ic_offset*2); FLOAT4 weight3 = vload4(0, weight+weight_offset+weight_ic_offset*3); - +#endif + out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); out0 = mad(in0.z, weight2, out0); @@ -1415,10 +2223,50 @@ void conv_2d_c8h1w4(GLOBAL_SIZE_2_DIMS out3 = mad(in3.z, weight2, out3); out3 = mad(in3.w, weight3, out3); - weight0 = vload4(0, weight+weight_oc_offset+weight_offset); - weight1 = vload4(0, weight+weight_oc_offset+weight_offset+weight_ic_offset); - weight2 = vload4(0, weight+weight_oc_offset+weight_offset+weight_ic_offset*2); - weight3 = vload4(0, weight+weight_oc_offset+weight_offset+weight_ic_offset*3); +#if (defined USE_LOW_BIT_WEIGHT_INT8) + charWeight0 = vload4(0, weight+weight_offset+weight_oc_offset); + charWeight1 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset); + charWeight2 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*2); + charWeight3 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*3); + weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC47, dequantOffsetC47); + weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC47, dequantOffsetC47); + weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC47, dequantOffsetC47); + weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC47, dequantOffsetC47); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + charWeightInt40 = vload2(0, weight+weight_offset/2+weight_oc_offset/2); + charWeightInt41 = vload2(0, weight+weight_offset/2+weight_oc_offset/2+weight_ic_offset/2); + charWeightInt42 = vload2(0, weight+weight_offset/2+weight_oc_offset/2+weight_ic_offset*2/2); + charWeightInt43 = vload2(0, weight+weight_offset/2+weight_oc_offset/2+weight_ic_offset*3/2); + charWeight0 = (char4)(0, 0, 0, 0); + charWeight1 = (char4)(0, 0, 0, 0); + charWeight2 = (char4)(0, 0, 0, 0); + charWeight3 = (char4)(0, 0, 0, 0); + charWeight0.x = (charWeightInt40.s0 >> 4) - 8; + charWeight0.y = (charWeightInt40.s0 & MOD_NUM) - 8; + charWeight0.z = (charWeightInt40.s1 >> 4) - 8; + charWeight0.w = (charWeightInt40.s1 & MOD_NUM) - 8; + charWeight1.x = (charWeightInt41.s0 >> 4) - 8; + charWeight1.y = (charWeightInt41.s0 & MOD_NUM)- 8; + charWeight1.z = (charWeightInt41.s1 >> 4) - 8; + charWeight1.w = (charWeightInt41.s1 & MOD_NUM) - 8; + charWeight2.x = (charWeightInt42.s0 >> 4) - 8; + charWeight2.y = (charWeightInt42.s0 & MOD_NUM) - 8; + charWeight2.z = (charWeightInt42.s1 >> 4) - 8; + charWeight2.w = (charWeightInt42.s1 & MOD_NUM) - 8; + charWeight3.x = (charWeightInt43.s0 >> 4) - 8; + charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; + charWeight3.z = (charWeightInt43.s1 >> 4) - 8; + charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; + weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC47, dequantOffsetC47); + weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC47, dequantOffsetC47); + weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC47, dequantOffsetC47); + weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC47, dequantOffsetC47); +#else + weight0 = vload4(0, weight+weight_offset+weight_oc_offset); + weight1 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset); + weight2 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*2); + weight3 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*3); +#endif out4 = mad(in0.x, weight0, out4); out4 = mad(in0.y, weight1, out4); diff --git a/source/backend/opencl/execution/cl/gemm.cl b/source/backend/opencl/execution/cl/gemm.cl index 629275926..23513ce89 100644 --- a/source/backend/opencl/execution/cl/gemm.cl +++ b/source/backend/opencl/execution/cl/gemm.cl @@ -1,6 +1,15 @@ #ifdef MNN_SUPPORT_FP16 #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif + +#define GLOBAL_SIZE_DIM2 \ + __private int global_size_dim0, __private int global_size_dim1, + +#define UNIFORM_BOUNDRY_CHECK(index0, index1) \ + if(index0 >= global_size_dim0 || index1 >= global_size_dim1) { \ + return; \ + } + __constant sampler_t SAMPLER = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST; __kernel void gemm(__read_only image2d_t uInput, __read_only image2d_t uKernel, __write_only image2d_t uOutput, @@ -267,3 +276,203 @@ __kernel void gemmWinogradW2(__read_only image2d_t uInput, __read_only image2d_t } } } + +__kernel void gemm_conv(GLOBAL_SIZE_DIM2 + __read_only image2d_t input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#else + __global const FLOAT *weight, +#endif + __global const FLOAT *bias, + __write_only image2d_t output, + __private const int dstChannelC4, + __private const int srcChannelC4, + __private const int batch) { + int2 pos = (int2)(get_global_id(0), get_global_id(1)); //cout/4, b + UNIFORM_BOUNDRY_CHECK(pos.x, pos.y); + int pos_x = pos.x << 2; + + FLOAT4 bias0 = vload4(0, bias + pos_x); + FLOAT sum = 0; + FLOAT4 out = 0; + +#if (defined USE_LOW_BIT_WEIGHT_INT8) + int weight_offset = pos.x * 16; + int weight_oc_offset = dstChannelC4 * 16; +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + int weight_offset = pos.x * 8; + int weight_oc_offset = dstChannelC4 * 8; +#else + int weight_offset = pos.x * 16; + int weight_oc_offset = dstChannelC4 * 16; +#endif + +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 Scale = vload4(pos.x, dequantScale); + const FLOAT4 Offset = vload4(pos.x, dequantOffset); +#endif + + for (int k = 0; k < srcChannelC4; ++k) { + FLOAT4 in = RI_F(input, SAMPLER, (int2)(k, pos.y)); +#if (defined USE_LOW_BIT_WEIGHT_INT8) + FLOAT16 weights = CONVERT_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset)); + weights = mad(weights, dequantScale16, dequantOffset16); + sum += in.x + in.y + in.z + in.w; +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar8 charWeightsInt4 = vload8(0, weight + weight_offset + k * weight_oc_offset); + char16 charWeights = 0; + charWeights.s0 = (charWeightsInt4.s0 >> 4) - 8; + charWeights.s1 = (charWeightsInt4.s0 & 15) - 8; + charWeights.s2 = (charWeightsInt4.s1 >> 4) - 8; + charWeights.s3 = (charWeightsInt4.s1 & 15) - 8; + charWeights.s4 = (charWeightsInt4.s2 >> 4) - 8; + charWeights.s5 = (charWeightsInt4.s2 & 15) - 8; + charWeights.s6 = (charWeightsInt4.s3 >> 4) - 8; + charWeights.s7 = (charWeightsInt4.s3 & 15) - 8; + charWeights.s8 = (charWeightsInt4.s4 >> 4) - 8; + charWeights.s9 = (charWeightsInt4.s4 & 15) - 8; + charWeights.sa = (charWeightsInt4.s5 >> 4) - 8; + charWeights.sb = (charWeightsInt4.s5 & 15) - 8; + charWeights.sc = (charWeightsInt4.s6 >> 4) - 8; + charWeights.sd = (charWeightsInt4.s6 & 15) - 8; + charWeights.se = (charWeightsInt4.s7 >> 4) - 8; + charWeights.sf = (charWeightsInt4.s7 & 15) - 8; + FLOAT16 weights = CONVERT_FLOAT16(charWeights); + sum += in.x + in.y + in.z + in.w; + +#else + FLOAT16 weights = vload16(0, weight + weight_offset + k * weight_oc_offset); +#endif + + out = mad((FLOAT4)in.x, (FLOAT4)weights.s0123, out); + out = mad((FLOAT4)in.y, (FLOAT4)weights.s4567, out); + out = mad((FLOAT4)in.z, (FLOAT4)weights.s89ab, out); + out = mad((FLOAT4)in.w, (FLOAT4)weights.scdef, out); + } + +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + out = bias0 + mad(out, Scale, sum * Offset); +#endif +#ifdef RELU + out = fmax(out, (FLOAT4)0); +#endif + +#ifdef RELU6 + out = clamp(out, (FLOAT4)0, (FLOAT4)6); +#endif + + WI_F(output, (int2)(pos.x, pos.y), out); +} + +__kernel void gemm_conv_b2(GLOBAL_SIZE_DIM2 + __read_only image2d_t input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#else + __global const FLOAT *weight, +#endif + __global const FLOAT *bias, + __write_only image2d_t output, + __private const int dstChannelC4, + __private const int srcChannelC4, + __private const int batch) { + int2 pos = (int2)(get_global_id(0), get_global_id(1)); //cout/4, b + UNIFORM_BOUNDRY_CHECK(pos.x, pos.y); + int pos_x = pos.x << 2; + int pos_y = pos.y << 1; + + FLOAT4 bias0 = vload4(0, bias + pos_x); + FLOAT sum0 = 0, sum1 = 0; + FLOAT4 out0 = (FLOAT4)0, out1 = (FLOAT4)0; + +#if (defined USE_LOW_BIT_WEIGHT_INT8) + int weight_offset = pos.x * 16; + int weight_oc_offset = dstChannelC4 * 16; +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + int weight_offset = pos.x * 8; + int weight_oc_offset = dstChannelC4 * 8; +#else + int weight_offset = pos.x * 16; + int weight_oc_offset = dstChannelC4 * 16; +#endif + +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 Scale = vload4(pos.x, dequantScale); + const FLOAT4 Offset = vload4(pos.x, dequantOffset); +#endif + + for (int k = 0; k < srcChannelC4; ++k) { + FLOAT4 in0 = RI_F(input, SAMPLER, (int2)(k, pos_y)); + FLOAT4 in1 = RI_F(input, SAMPLER, (int2)(k, pos_y + 1)); +#if (defined USE_LOW_BIT_WEIGHT_INT8) + FLOAT16 weights = CONVERT_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset)); + weights = mad(weights, dequantScale16, dequantOffset16); + sum0 += in0.x + in0.y + in0.z + in0.w; + sum1 += in1.x + in1.y + in1.z + in1.w; +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar8 charWeightsInt4 = vload8(0, weight + weight_offset + k * weight_oc_offset); + char16 charWeights = 0; + charWeights.s0 = (charWeightsInt4.s0 >> 4) - 8; + charWeights.s1 = (charWeightsInt4.s0 & 15) - 8; + charWeights.s2 = (charWeightsInt4.s1 >> 4) - 8; + charWeights.s3 = (charWeightsInt4.s1 & 15) - 8; + charWeights.s4 = (charWeightsInt4.s2 >> 4) - 8; + charWeights.s5 = (charWeightsInt4.s2 & 15) - 8; + charWeights.s6 = (charWeightsInt4.s3 >> 4) - 8; + charWeights.s7 = (charWeightsInt4.s3 & 15) - 8; + charWeights.s8 = (charWeightsInt4.s4 >> 4) - 8; + charWeights.s9 = (charWeightsInt4.s4 & 15) - 8; + charWeights.sa = (charWeightsInt4.s5 >> 4) - 8; + charWeights.sb = (charWeightsInt4.s5 & 15) - 8; + charWeights.sc = (charWeightsInt4.s6 >> 4) - 8; + charWeights.sd = (charWeightsInt4.s6 & 15) - 8; + charWeights.se = (charWeightsInt4.s7 >> 4) - 8; + charWeights.sf = (charWeightsInt4.s7 & 15) - 8; + FLOAT16 weights = CONVERT_FLOAT16(charWeights); + sum0 += in0.x + in0.y + in0.z + in0.w; + sum1 += in1.x + in1.y + in1.z + in1.w; +#else + FLOAT16 weights = vload16(0, weight + weight_offset + k * weight_oc_offset); +#endif + + out0 = mad((FLOAT4)in0.x, (FLOAT4)weights.s0123, out0); + out0 = mad((FLOAT4)in0.y, (FLOAT4)weights.s4567, out0); + out0 = mad((FLOAT4)in0.z, (FLOAT4)weights.s89ab, out0); + out0 = mad((FLOAT4)in0.w, (FLOAT4)weights.scdef, out0); + + out1 = mad((FLOAT4)in1.x, (FLOAT4)weights.s0123, out1); + out1 = mad((FLOAT4)in1.y, (FLOAT4)weights.s4567, out1); + out1 = mad((FLOAT4)in1.z, (FLOAT4)weights.s89ab, out1); + out1 = mad((FLOAT4)in1.w, (FLOAT4)weights.scdef, out1); + } +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + out0 = bias0 + mad(out0, Scale, sum0 * Offset); + out1 = bias0 + mad(out1, Scale, sum1 * Offset); +#endif +#ifdef RELU + out0 = fmax(out0, (FLOAT4)0); + out1 = fmax(out1, (FLOAT4)0); +#endif + +#ifdef RELU6 + out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); + out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); +#endif + + WI_F(output, (int2)(pos.x, pos_y), out0); + if(pos_y + 1 < batch) + WI_F(output, (int2)(pos.x, pos_y + 1), out1); +} diff --git a/source/backend/opencl/execution/cl/gemm_buf.cl b/source/backend/opencl/execution/cl/gemm_buf.cl index 4b357113b..de33be07c 100644 --- a/source/backend/opencl/execution/cl/gemm_buf.cl +++ b/source/backend/opencl/execution/cl/gemm_buf.cl @@ -129,3 +129,204 @@ __kernel void gemm_buf2(GLOBAL_SIZE_DIM2 vstore4(o1.s89ab, 1, output+out_offset+8*width); vstore4(o1.scdef, 1, output+out_offset+12*width); } + + +__kernel void gemm_conv_buf(GLOBAL_SIZE_DIM2 + __global const FLOAT* input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#else + __global const FLOAT *weight, +#endif + __global const FLOAT *bias, + __global FLOAT* output, + __private const int dstChannelC4, + __private const int srcChannelC4, + __private const int batch) { + int2 pos = (int2)(get_global_id(0), get_global_id(1)); //cout/4, b + UNIFORM_BOUNDRY_CHECK(pos.x, pos.y); + int pos_x = pos.x << 2; + + FLOAT4 bias0 = vload4(0, bias + pos_x); + FLOAT sum = 0; + FLOAT4 out = 0; + + int input_offset = pos.y * srcChannelC4 * 4; + int out_offset = pos.y * dstChannelC4 * 4; +#if (defined USE_LOW_BIT_WEIGHT_INT4) + int weight_offset = pos.x * 8; + int weight_oc_offset = dstChannelC4 * 8; +#else + int weight_offset = pos.x * 16; + int weight_oc_offset = dstChannelC4 * 16; +#endif + +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 Scale = vload4(pos.x, dequantScale); + const FLOAT4 Offset = vload4(pos.x, dequantOffset); +#endif + + for (int k = 0; k < srcChannelC4; ++k) { +#if (defined USE_LOW_BIT_WEIGHT_INT8) + FLOAT16 weights = CONVERT_FLOAT16(vload16(0, + weight_offset + k * weight_oc_offset)); + weights = mad(weights, dequantScale16, dequantOffset16); + sum += in.x + in.y + in.z + in.w; +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar8 charWeightsInt4 = vload8(0, weight + weight_offset + k * weight_oc_offset); + char16 charWeights = 0; + charWeights.s0 = (charWeightsInt4.s0 >> 4) - 8; + charWeights.s1 = (charWeightsInt4.s0 & 15) - 8; + charWeights.s2 = (charWeightsInt4.s1 >> 4) - 8; + charWeights.s3 = (charWeightsInt4.s1 & 15) - 8; + charWeights.s4 = (charWeightsInt4.s2 >> 4) - 8; + charWeights.s5 = (charWeightsInt4.s2 & 15) - 8; + charWeights.s6 = (charWeightsInt4.s3 >> 4) - 8; + charWeights.s7 = (charWeightsInt4.s3 & 15) - 8; + charWeights.s8 = (charWeightsInt4.s4 >> 4) - 8; + charWeights.s9 = (charWeightsInt4.s4 & 15) - 8; + charWeights.sa = (charWeightsInt4.s5 >> 4) - 8; + charWeights.sb = (charWeightsInt4.s5 & 15) - 8; + charWeights.sc = (charWeightsInt4.s6 >> 4) - 8; + charWeights.sd = (charWeightsInt4.s6 & 15) - 8; + charWeights.se = (charWeightsInt4.s7 >> 4) - 8; + charWeights.sf = (charWeightsInt4.s7 & 15) - 8; + FLOAT16 weights = CONVERT_FLOAT16(charWeights); + sum += in.x + in.y + in.z + in.w; + +#else + FLOAT16 weights = vload16(0, weight + weight_offset + k * weight_oc_offset); +#endif + FLOAT4 in = vload4(k, input + input_offset); + + out = mad((FLOAT4)in.x, (FLOAT4)weights.s0123, out); + out = mad((FLOAT4)in.y, (FLOAT4)weights.s4567, out); + out = mad((FLOAT4)in.z, (FLOAT4)weights.s89ab, out); + out = mad((FLOAT4)in.w, (FLOAT4)weights.scdef, out); + } + +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + out = bias0 + mad(out, Scale, sum * Offset); +#endif +#ifdef RELU + out = fmax(out, (FLOAT4)0); +#endif + +#ifdef RELU6 + out = clamp(out, (FLOAT4)0, (FLOAT4)6); +#endif + + vstore4(out, pos.x, output+out_offset); +} + +__kernel void gemm_conv_b2_buf(GLOBAL_SIZE_DIM2 + __global const FLOAT *input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *weight, + __global const FLOAT *dequantScale, + __global const FLOAT *dequantOffset, +#else + __global const FLOAT *weight, +#endif + __global const FLOAT *bias, + __global FLOAT *output, + __private const int dstChannelC4, + __private const int srcChannelC4, + __private const int batch) { + int2 pos = (int2)(get_global_id(0), get_global_id(1)); //cout/4, b + UNIFORM_BOUNDRY_CHECK(pos.x, pos.y); + int pos_x = pos.x << 2; + int pos_y = pos.y << 1; + + FLOAT4 bias0 = vload4(0, bias + pos_x); + FLOAT sum0 = 0, sum1 = 0; + FLOAT4 out0 = (FLOAT4)0, out1 = (FLOAT4)0; + + int input_offset = pos_y * srcChannelC4 * 4; + int out_offset = pos_y * dstChannelC4 * 4; +#if (defined USE_LOW_BIT_WEIGHT_INT4) + int weight_offset = pos.x * 8; + int weight_oc_offset = dstChannelC4 * 8; +#else + int weight_offset = pos.x * 16; + int weight_oc_offset = dstChannelC4 * 16; +#endif + +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + const FLOAT4 Scale = vload4(pos.x, dequantScale); + const FLOAT4 Offset = vload4(pos.x, dequantOffset); +#endif + + for (int k = 0; k < srcChannelC4; ++k) { + FLOAT4 in0 = vload4(k, input + input_offset); + FLOAT4 in1 = vload4(k, input + input_offset + srcChannelC4 * 4); +#if (defined USE_LOW_BIT_WEIGHT_INT8) + FLOAT16 weights = CONVERT_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset)); + weights = mad(weights, dequantScale16, dequantOffset16); + sum0 += in0.x + in0.y + in0.z + in0.w; + sum1 += in1.x + in1.y + in1.z + in1.w; +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar8 charWeightsInt4 = vload8(0, weight + weight_offset + k * weight_oc_offset); + char16 charWeights = 0; + charWeights.s0 = (charWeightsInt4.s0 >> 4) - 8; + charWeights.s1 = (charWeightsInt4.s0 & 15) - 8; + charWeights.s2 = (charWeightsInt4.s1 >> 4) - 8; + charWeights.s3 = (charWeightsInt4.s1 & 15) - 8; + charWeights.s4 = (charWeightsInt4.s2 >> 4) - 8; + charWeights.s5 = (charWeightsInt4.s2 & 15) - 8; + charWeights.s6 = (charWeightsInt4.s3 >> 4) - 8; + charWeights.s7 = (charWeightsInt4.s3 & 15) - 8; + charWeights.s8 = (charWeightsInt4.s4 >> 4) - 8; + charWeights.s9 = (charWeightsInt4.s4 & 15) - 8; + charWeights.sa = (charWeightsInt4.s5 >> 4) - 8; + charWeights.sb = (charWeightsInt4.s5 & 15) - 8; + charWeights.sc = (charWeightsInt4.s6 >> 4) - 8; + charWeights.sd = (charWeightsInt4.s6 & 15) - 8; + charWeights.se = (charWeightsInt4.s7 >> 4) - 8; + charWeights.sf = (charWeightsInt4.s7 & 15) - 8; + FLOAT16 weights = CONVERT_FLOAT16(charWeights); + sum0 += in0.x + in0.y + in0.z + in0.w; + sum1 += in1.x + in1.y + in1.z + in1.w; + +#else + FLOAT16 weights = vload16(0, weight + weight_offset + k * weight_oc_offset); +#endif + + out0 = mad((FLOAT4)in0.x, (FLOAT4)weights.s0123, out0); + out0 = mad((FLOAT4)in0.y, (FLOAT4)weights.s4567, out0); + out0 = mad((FLOAT4)in0.z, (FLOAT4)weights.s89ab, out0); + out0 = mad((FLOAT4)in0.w, (FLOAT4)weights.scdef, out0); + + out1 = mad((FLOAT4)in1.x, (FLOAT4)weights.s0123, out1); + out1 = mad((FLOAT4)in1.y, (FLOAT4)weights.s4567, out1); + out1 = mad((FLOAT4)in1.z, (FLOAT4)weights.s89ab, out1); + out1 = mad((FLOAT4)in1.w, (FLOAT4)weights.scdef, out1); + } + +#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) + out0 = bias0 + mad(out0, Scale, sum0 * Offset); + out1 = bias0 + mad(out1, Scale, sum1 * Offset); +#endif +#ifdef RELU + out0 = fmax(out0, (FLOAT4)0); + out1 = fmax(out1, (FLOAT4)0); +#endif + +#ifdef RELU6 + out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); + out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); +#endif + + vstore4(out0, pos.x, output+out_offset); + if(pos_y + 1 < batch) + vstore4(out1, pos.x, output+out_offset+dstChannelC4 * 4); +} diff --git a/source/backend/opencl/execution/cl/opencl_program.cc b/source/backend/opencl/execution/cl/opencl_program.cc index 64584877a..5706c42fe 100644 --- a/source/backend/opencl/execution/cl/opencl_program.cc +++ b/source/backend/opencl/execution/cl/opencl_program.cc @@ -8,7 +8,7 @@ extern const std::map> OpenCLProgramMap { { "conv_2d", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x69,0x2c,0x20,0x62,0x61,0x73,0x65,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x23,0x23,0x69,0x20,0x2b,0x20,0x62,0x61,0x73,0x65,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x23,0x23,0x69,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x62,0x5f,0x76,0x61,0x6c,0x75,0x65,0x29,0x29,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x69,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x20,0x20,0x20,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x69,0x2c,0x20,0x6a,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x6a,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x6a,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x6a,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x6a,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x4f,0x50,0x54,0x28,0x69,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x5f,0x73,0x6d,0x23,0x23,0x69,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x5d,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x5f,0x73,0x6d,0x23,0x23,0x69,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x5d,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x5f,0x73,0x6d,0x23,0x23,0x69,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x5d,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x5f,0x73,0x6d,0x23,0x23,0x69,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x5d,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x20,0x20,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x55,0x4e,0x49,0x54,0x20,0x34,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x23,0x69,0x66,0x20,0x53,0x45,0x54,0x5f,0x41,0x54,0x54,0x52,0x49,0x42,0x55,0x54,0x45,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x68,0x69,0x6e,0x74,0x28,0x31,0x36,0x2c,0x20,0x31,0x36,0x2c,0x20,0x31,0x29,0x29,0x29,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x6d,0x61,0x6c,0x69,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x55,0x46,0x46,0x45,0x52,0x5f,0x49,0x4e,0x50,0x5f,0x46,0x50,0x33,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x55,0x46,0x46,0x45,0x52,0x5f,0x49,0x4e,0x50,0x5f,0x46,0x50,0x33,0x32,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x3b,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x3b,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x3b,0x20,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x36,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x55,0x46,0x46,0x45,0x52,0x5f,0x49,0x4e,0x50,0x5f,0x46,0x50,0x33,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x6f,0x77,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x6f,0x6c,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x62,0x69,0x61,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x5f,0x73,0x6d,0x30,0x5b,0x55,0x4e,0x49,0x54,0x2a,0x55,0x4e,0x49,0x54,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x5f,0x73,0x6d,0x31,0x5b,0x55,0x4e,0x49,0x54,0x2a,0x55,0x4e,0x49,0x54,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x5f,0x73,0x6d,0x32,0x5b,0x55,0x4e,0x49,0x54,0x2a,0x55,0x4e,0x49,0x54,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x5f,0x73,0x6d,0x33,0x5b,0x55,0x4e,0x49,0x54,0x2a,0x55,0x4e,0x49,0x54,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x74,0x69,0x6c,0x65,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x55,0x4e,0x49,0x54,0x20,0x2d,0x31,0x29,0x2f,0x20,0x55,0x4e,0x49,0x54,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x6f,0x6c,0x5f,0x78,0x5f,0x75,0x6e,0x69,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x63,0x6f,0x6c,0x2c,0x20,0x55,0x4e,0x49,0x54,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x5f,0x78,0x5f,0x75,0x6e,0x69,0x74,0x20,0x2b,0x20,0x72,0x6f,0x77,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x74,0x20,0x3d,0x20,0x30,0x3b,0x20,0x74,0x20,0x3c,0x20,0x74,0x69,0x6c,0x65,0x73,0x3b,0x20,0x2b,0x2b,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x74,0x2c,0x20,0x55,0x4e,0x49,0x54,0x2c,0x20,0x72,0x6f,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x6d,0x30,0x5b,0x69,0x6e,0x5f,0x69,0x6e,0x64,0x65,0x78,0x5d,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x6d,0x31,0x5b,0x69,0x6e,0x5f,0x69,0x6e,0x64,0x65,0x78,0x5d,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2b,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x6d,0x32,0x5b,0x69,0x6e,0x5f,0x69,0x6e,0x64,0x65,0x78,0x5d,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2b,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x6d,0x33,0x5b,0x69,0x6e,0x5f,0x69,0x6e,0x64,0x65,0x78,0x5d,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2b,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x74,0x2c,0x20,0x55,0x4e,0x49,0x54,0x2a,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x55,0x4e,0x49,0x54,0x3b,0x20,0x6b,0x2b,0x2b,0x29,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x63,0x78,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x2c,0x20,0x34,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x69,0x6e,0x64,0x65,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x5f,0x78,0x5f,0x75,0x6e,0x69,0x74,0x20,0x2b,0x20,0x6b,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x63,0x78,0x34,0x2b,0x2b,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x63,0x78,0x34,0x2b,0x2b,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x63,0x78,0x34,0x2b,0x2b,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x63,0x78,0x34,0x2b,0x2b,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x4f,0x50,0x54,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x4f,0x50,0x54,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x4f,0x50,0x54,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x4f,0x50,0x54,0x28,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x23,0x69,0x66,0x20,0x53,0x45,0x54,0x5f,0x41,0x54,0x54,0x52,0x49,0x42,0x55,0x54,0x45,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x68,0x69,0x6e,0x74,0x28,0x31,0x36,0x2c,0x20,0x31,0x36,0x2c,0x20,0x31,0x29,0x29,0x29,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x62,0x69,0x61,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x43,0x4f,0x4e,0x56,0x5f,0x53,0x31,0x44,0x31,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x2b,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x2b,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x2b,0x20,0x33,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x2c,0x20,0x49,0x4e,0x54,0x5f,0x4d,0x49,0x4e,0x2c,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x2c,0x20,0x49,0x4e,0x54,0x5f,0x4d,0x49,0x4e,0x2c,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x2c,0x20,0x49,0x4e,0x54,0x5f,0x4d,0x49,0x4e,0x2c,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x2c,0x20,0x49,0x4e,0x54,0x5f,0x4d,0x49,0x4e,0x2c,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x34,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x23,0x69,0x66,0x20,0x53,0x45,0x54,0x5f,0x41,0x54,0x54,0x52,0x49,0x42,0x55,0x54,0x45,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x68,0x69,0x6e,0x74,0x28,0x31,0x36,0x2c,0x20,0x31,0x36,0x2c,0x20,0x31,0x29,0x29,0x29,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x38,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x62,0x69,0x61,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x62,0x69,0x61,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x43,0x4f,0x4e,0x56,0x5f,0x53,0x31,0x44,0x31,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x2b,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x2b,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x2b,0x20,0x33,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x2c,0x20,0x49,0x4e,0x54,0x5f,0x4d,0x49,0x4e,0x2c,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x2c,0x20,0x49,0x4e,0x54,0x5f,0x4d,0x49,0x4e,0x2c,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x2c,0x20,0x49,0x4e,0x54,0x5f,0x4d,0x49,0x4e,0x2c,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x2c,0x20,0x49,0x4e,0x54,0x5f,0x4d,0x49,0x4e,0x2c,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x34,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x34,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x34,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x35,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x36,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x37,0x2c,0x20,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x23,0x69,0x66,0x20,0x53,0x45,0x54,0x5f,0x41,0x54,0x54,0x52,0x49,0x42,0x55,0x54,0x45,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x68,0x69,0x6e,0x74,0x28,0x31,0x36,0x2c,0x20,0x31,0x36,0x2c,0x20,0x31,0x29,0x29,0x29,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x62,0x69,0x61,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x6c,0x65,0x6e,0x67,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x62,0x69,0x61,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3c,0x3c,0x32,0x2c,0x20,0x2d,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x31,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x32,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x33,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x43,0x4f,0x4e,0x56,0x5f,0x53,0x31,0x44,0x31,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x2c,0x20,0x31,0x2c,0x20,0x2d,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x20,0x20,0x20,0x3d,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x65,0x6e,0x64,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x20,0x2b,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x29,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x65,0x6e,0x64,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x20,0x2b,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x29,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x2c,0x20,0x69,0x6e,0x31,0x2c,0x20,0x69,0x6e,0x32,0x2c,0x20,0x69,0x6e,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x6c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x62,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x43,0x4f,0x4e,0x56,0x5f,0x53,0x31,0x44,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x31,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x32,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x33,0x2c,0x20,0x30,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x77,0x20,0x3d,0x20,0x31,0x3b,0x20,0x77,0x20,0x3c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x77,0x2b,0x2b,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x6e,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x6e,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x69,0x6e,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x33,0x2c,0x20,0x77,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x77,0x20,0x3c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x77,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x23,0x69,0x66,0x20,0x53,0x45,0x54,0x5f,0x41,0x54,0x54,0x52,0x49,0x42,0x55,0x54,0x45,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x68,0x69,0x6e,0x74,0x28,0x31,0x36,0x2c,0x20,0x31,0x36,0x2c,0x20,0x31,0x29,0x29,0x29,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x38,0x68,0x34,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x62,0x69,0x61,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x6c,0x65,0x6e,0x67,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x62,0x69,0x61,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x62,0x69,0x61,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3c,0x3c,0x32,0x2c,0x20,0x2d,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x69,0x7a,0x65,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x69,0x7a,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x2c,0x20,0x69,0x6e,0x31,0x2c,0x20,0x69,0x6e,0x32,0x2c,0x20,0x69,0x6e,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x6c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x30,0x29,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x30,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x2b,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x2b,0x20,0x69,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x2b,0x20,0x69,0x79,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x31,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x2b,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x2b,0x20,0x69,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x2b,0x20,0x69,0x79,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x32,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x2b,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x2b,0x20,0x69,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x2b,0x20,0x69,0x79,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x33,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x2b,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x2b,0x20,0x69,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x2b,0x20,0x69,0x79,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x78,0x20,0x3c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x69,0x78,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x30,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x69,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x69,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x69,0x78,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x30,0x2c,0x20,0x68,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x30,0x2c,0x20,0x68,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x30,0x2c,0x20,0x68,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x30,0x2c,0x20,0x68,0x33,0x29,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x34,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x35,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x36,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x37,0x2c,0x20,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x32,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x33,0x29,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x32,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x2b,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x32,0x29,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x33,0x29,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x32,0x29,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x23,0x69,0x66,0x20,0x53,0x45,0x54,0x5f,0x41,0x54,0x54,0x52,0x49,0x42,0x55,0x54,0x45,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x68,0x69,0x6e,0x74,0x28,0x31,0x36,0x2c,0x20,0x31,0x36,0x2c,0x20,0x31,0x29,0x29,0x29,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x34,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x62,0x69,0x61,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x6c,0x65,0x6e,0x67,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x62,0x69,0x61,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3c,0x3c,0x32,0x2c,0x20,0x2d,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x69,0x7a,0x65,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x69,0x7a,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x2c,0x20,0x69,0x6e,0x31,0x2c,0x20,0x69,0x6e,0x32,0x2c,0x20,0x69,0x6e,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x6c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x30,0x29,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x30,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x2b,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x2b,0x20,0x69,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x2b,0x20,0x69,0x79,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x31,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x2b,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x2b,0x20,0x69,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x2b,0x20,0x69,0x79,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x32,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x2b,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x2b,0x20,0x69,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x2b,0x20,0x69,0x79,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x33,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x2b,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x2b,0x20,0x69,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x2b,0x20,0x69,0x79,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x78,0x20,0x3c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x69,0x78,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x30,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x69,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x69,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x69,0x78,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x30,0x2c,0x20,0x68,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x30,0x2c,0x20,0x68,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x30,0x2c,0x20,0x68,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x30,0x2c,0x20,0x68,0x33,0x29,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x32,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x33,0x29,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x32,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x69,0x2c,0x20,0x62,0x61,0x73,0x65,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x23,0x23,0x69,0x20,0x2b,0x20,0x62,0x61,0x73,0x65,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x23,0x23,0x69,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x62,0x5f,0x76,0x61,0x6c,0x75,0x65,0x29,0x29,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x69,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x20,0x20,0x20,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x69,0x2c,0x20,0x6a,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x6a,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x6a,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x6a,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x6a,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x4f,0x50,0x54,0x28,0x69,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x5f,0x73,0x6d,0x23,0x23,0x69,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x5d,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x5f,0x73,0x6d,0x23,0x23,0x69,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x5d,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x5f,0x73,0x6d,0x23,0x23,0x69,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x5d,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x5f,0x73,0x6d,0x23,0x23,0x69,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x5d,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x20,0x20,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x55,0x4e,0x49,0x54,0x20,0x34,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x20,0x31,0x35,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x23,0x69,0x66,0x20,0x53,0x45,0x54,0x5f,0x41,0x54,0x54,0x52,0x49,0x42,0x55,0x54,0x45,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x68,0x69,0x6e,0x74,0x28,0x31,0x36,0x2c,0x20,0x31,0x36,0x2c,0x20,0x31,0x29,0x29,0x29,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x6d,0x61,0x6c,0x69,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x55,0x46,0x46,0x45,0x52,0x5f,0x49,0x4e,0x50,0x5f,0x46,0x50,0x33,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x55,0x46,0x46,0x45,0x52,0x5f,0x49,0x4e,0x50,0x5f,0x46,0x50,0x33,0x32,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x3b,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x3b,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x3b,0x20,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x36,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x55,0x46,0x46,0x45,0x52,0x5f,0x49,0x4e,0x50,0x5f,0x46,0x50,0x33,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x6f,0x77,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x6f,0x6c,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x62,0x69,0x61,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x5f,0x73,0x6d,0x30,0x5b,0x55,0x4e,0x49,0x54,0x2a,0x55,0x4e,0x49,0x54,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x5f,0x73,0x6d,0x31,0x5b,0x55,0x4e,0x49,0x54,0x2a,0x55,0x4e,0x49,0x54,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x5f,0x73,0x6d,0x32,0x5b,0x55,0x4e,0x49,0x54,0x2a,0x55,0x4e,0x49,0x54,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x5f,0x73,0x6d,0x33,0x5b,0x55,0x4e,0x49,0x54,0x2a,0x55,0x4e,0x49,0x54,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x74,0x69,0x6c,0x65,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x55,0x4e,0x49,0x54,0x20,0x2d,0x31,0x29,0x2f,0x20,0x55,0x4e,0x49,0x54,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x6f,0x6c,0x5f,0x78,0x5f,0x75,0x6e,0x69,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x63,0x6f,0x6c,0x2c,0x20,0x55,0x4e,0x49,0x54,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x5f,0x78,0x5f,0x75,0x6e,0x69,0x74,0x20,0x2b,0x20,0x72,0x6f,0x77,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x74,0x20,0x3d,0x20,0x30,0x3b,0x20,0x74,0x20,0x3c,0x20,0x74,0x69,0x6c,0x65,0x73,0x3b,0x20,0x2b,0x2b,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x74,0x2c,0x20,0x55,0x4e,0x49,0x54,0x2c,0x20,0x72,0x6f,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x6d,0x30,0x5b,0x69,0x6e,0x5f,0x69,0x6e,0x64,0x65,0x78,0x5d,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x6d,0x31,0x5b,0x69,0x6e,0x5f,0x69,0x6e,0x64,0x65,0x78,0x5d,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2b,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x6d,0x32,0x5b,0x69,0x6e,0x5f,0x69,0x6e,0x64,0x65,0x78,0x5d,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2b,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x6d,0x33,0x5b,0x69,0x6e,0x5f,0x69,0x6e,0x64,0x65,0x78,0x5d,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2b,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x74,0x2c,0x20,0x55,0x4e,0x49,0x54,0x2a,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x55,0x4e,0x49,0x54,0x3b,0x20,0x6b,0x2b,0x2b,0x29,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x63,0x78,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x2c,0x20,0x34,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x69,0x6e,0x64,0x65,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x5f,0x78,0x5f,0x75,0x6e,0x69,0x74,0x20,0x2b,0x20,0x6b,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x63,0x78,0x34,0x2b,0x2b,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x63,0x78,0x34,0x2b,0x2b,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x63,0x78,0x34,0x2b,0x2b,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x63,0x78,0x34,0x2b,0x2b,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x4f,0x50,0x54,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x4f,0x50,0x54,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x4f,0x50,0x54,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x4f,0x50,0x54,0x28,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x23,0x69,0x66,0x20,0x53,0x45,0x54,0x5f,0x41,0x54,0x54,0x52,0x49,0x42,0x55,0x54,0x45,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x68,0x69,0x6e,0x74,0x28,0x31,0x36,0x2c,0x20,0x31,0x36,0x2c,0x20,0x31,0x29,0x29,0x29,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x62,0x69,0x61,0x73,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x62,0x69,0x61,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x62,0x69,0x61,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x43,0x4f,0x4e,0x56,0x5f,0x53,0x31,0x44,0x31,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x2b,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x2b,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x2b,0x20,0x33,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x2c,0x20,0x49,0x4e,0x54,0x5f,0x4d,0x49,0x4e,0x2c,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x2c,0x20,0x49,0x4e,0x54,0x5f,0x4d,0x49,0x4e,0x2c,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x2c,0x20,0x49,0x4e,0x54,0x5f,0x4d,0x49,0x4e,0x2c,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x2c,0x20,0x49,0x4e,0x54,0x5f,0x4d,0x49,0x4e,0x2c,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x34,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x23,0x69,0x66,0x20,0x53,0x45,0x54,0x5f,0x41,0x54,0x54,0x52,0x49,0x42,0x55,0x54,0x45,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x68,0x69,0x6e,0x74,0x28,0x31,0x36,0x2c,0x20,0x31,0x36,0x2c,0x20,0x31,0x29,0x29,0x29,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x38,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x62,0x69,0x61,0x73,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x62,0x69,0x61,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x62,0x69,0x61,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x62,0x69,0x61,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x43,0x4f,0x4e,0x56,0x5f,0x53,0x31,0x44,0x31,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x2b,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x2b,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x2b,0x20,0x33,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3d,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x2c,0x20,0x49,0x4e,0x54,0x5f,0x4d,0x49,0x4e,0x2c,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x2c,0x20,0x49,0x4e,0x54,0x5f,0x4d,0x49,0x4e,0x2c,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x2c,0x20,0x49,0x4e,0x54,0x5f,0x4d,0x49,0x4e,0x2c,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x2c,0x20,0x49,0x4e,0x54,0x5f,0x4d,0x49,0x4e,0x2c,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x34,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x34,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x35,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x34,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x34,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x34,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x34,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x35,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x35,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x35,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x35,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x36,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x36,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x36,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x36,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x37,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x37,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x37,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x37,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x34,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x35,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x36,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x37,0x2c,0x20,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x23,0x69,0x66,0x20,0x53,0x45,0x54,0x5f,0x41,0x54,0x54,0x52,0x49,0x42,0x55,0x54,0x45,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x68,0x69,0x6e,0x74,0x28,0x31,0x36,0x2c,0x20,0x31,0x36,0x2c,0x20,0x31,0x29,0x29,0x29,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x62,0x69,0x61,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x6c,0x65,0x6e,0x67,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x62,0x69,0x61,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3c,0x3c,0x32,0x2c,0x20,0x2d,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x31,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x32,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x33,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x43,0x4f,0x4e,0x56,0x5f,0x53,0x31,0x44,0x31,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x2c,0x20,0x31,0x2c,0x20,0x2d,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x20,0x20,0x20,0x3d,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x65,0x6e,0x64,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x20,0x2b,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x29,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x65,0x6e,0x64,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x20,0x2b,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x29,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x2c,0x20,0x69,0x6e,0x31,0x2c,0x20,0x69,0x6e,0x32,0x2c,0x20,0x69,0x6e,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x6c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x62,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x43,0x4f,0x4e,0x56,0x5f,0x53,0x31,0x44,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x31,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x32,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x33,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x77,0x20,0x3d,0x20,0x31,0x3b,0x20,0x77,0x20,0x3c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x77,0x2b,0x2b,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x6e,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x6e,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x69,0x6e,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x33,0x2c,0x20,0x77,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x77,0x20,0x3c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x77,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x23,0x69,0x66,0x20,0x53,0x45,0x54,0x5f,0x41,0x54,0x54,0x52,0x49,0x42,0x55,0x54,0x45,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x68,0x69,0x6e,0x74,0x28,0x31,0x36,0x2c,0x20,0x31,0x36,0x2c,0x20,0x31,0x29,0x29,0x29,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x38,0x68,0x34,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x62,0x69,0x61,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x6c,0x65,0x6e,0x67,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x62,0x69,0x61,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x62,0x69,0x61,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3c,0x3c,0x32,0x2c,0x20,0x2d,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x69,0x7a,0x65,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x69,0x7a,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x2c,0x20,0x69,0x6e,0x31,0x2c,0x20,0x69,0x6e,0x32,0x2c,0x20,0x69,0x6e,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x6c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x30,0x29,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x30,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x2b,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x2b,0x20,0x69,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x2b,0x20,0x69,0x79,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x31,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x2b,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x2b,0x20,0x69,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x2b,0x20,0x69,0x79,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x32,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x2b,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x2b,0x20,0x69,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x2b,0x20,0x69,0x79,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x33,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x2b,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x2b,0x20,0x69,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x2b,0x20,0x69,0x79,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x78,0x20,0x3c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x69,0x78,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x30,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x69,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x69,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x69,0x78,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x30,0x2c,0x20,0x68,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x30,0x2c,0x20,0x68,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x30,0x2c,0x20,0x68,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x30,0x2c,0x20,0x68,0x33,0x29,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x34,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x35,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x36,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x53,0x34,0x28,0x37,0x2c,0x20,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x32,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x33,0x29,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x32,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x2b,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x32,0x29,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x33,0x29,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x32,0x29,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x23,0x69,0x66,0x20,0x53,0x45,0x54,0x5f,0x41,0x54,0x54,0x52,0x49,0x42,0x55,0x54,0x45,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x68,0x69,0x6e,0x74,0x28,0x31,0x36,0x2c,0x20,0x31,0x36,0x2c,0x20,0x31,0x29,0x29,0x29,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x34,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x62,0x69,0x61,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x6c,0x65,0x6e,0x67,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x62,0x69,0x61,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3c,0x3c,0x32,0x2c,0x20,0x2d,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x69,0x7a,0x65,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x69,0x7a,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x2c,0x20,0x69,0x6e,0x31,0x2c,0x20,0x69,0x6e,0x32,0x2c,0x20,0x69,0x6e,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x6c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x30,0x29,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x30,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x2b,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x2b,0x20,0x69,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x2b,0x20,0x69,0x79,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x31,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x2b,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x2b,0x20,0x69,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x2b,0x20,0x69,0x79,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x32,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x2b,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x2b,0x20,0x69,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x2b,0x20,0x69,0x79,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x33,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x2b,0x20,0x69,0x79,0x20,0x2b,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x2b,0x20,0x69,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x2b,0x20,0x69,0x79,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x78,0x20,0x3c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x69,0x78,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x30,0x20,0x3d,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x69,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x69,0x64,0x78,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x69,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x2b,0x20,0x69,0x78,0x20,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x30,0x2c,0x20,0x68,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x30,0x2c,0x20,0x68,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x30,0x2c,0x20,0x68,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x30,0x2c,0x20,0x68,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x42,0x55,0x46,0x46,0x45,0x52,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x79,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x32,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x33,0x29,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x32,0x29,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x79,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa, } }, { "deconv_2d", @@ -28,6 +28,10 @@ extern const std::map> OpenCLProgramMap "interp", { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x69,0x6e,0x74,0x65,0x72,0x70,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x63,0x61,0x6c,0x65,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x73,0x20,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73,0x63,0x61,0x6c,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x73,0x63,0x61,0x6c,0x65,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73,0x63,0x61,0x6c,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x63,0x61,0x6c,0x65,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x76,0x61,0x6c,0x2c,0x20,0x6d,0x69,0x6e,0x5f,0x76,0x61,0x6c,0x2c,0x20,0x6d,0x61,0x78,0x5f,0x76,0x61,0x6c,0x29,0x20,0x6d,0x61,0x78,0x28,0x6d,0x69,0x6e,0x28,0x76,0x61,0x6c,0x2c,0x20,0x6d,0x61,0x78,0x5f,0x76,0x61,0x6c,0x29,0x2c,0x20,0x6d,0x69,0x6e,0x5f,0x76,0x61,0x6c,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x66,0x6c,0x6f,0x6f,0x72,0x20,0x20,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x73,0x63,0x61,0x6c,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x6c,0x66,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x66,0x6c,0x6f,0x6f,0x72,0x2c,0x20,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2d,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x75,0x66,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x66,0x6c,0x6f,0x6f,0x72,0x20,0x2b,0x20,0x31,0x2c,0x20,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2d,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x66,0x6c,0x6f,0x6f,0x72,0x20,0x20,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x73,0x63,0x61,0x6c,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x6c,0x66,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x66,0x6c,0x6f,0x6f,0x72,0x2c,0x20,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2d,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x75,0x66,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x66,0x6c,0x6f,0x6f,0x72,0x20,0x2b,0x20,0x31,0x2c,0x20,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2d,0x20,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x67,0x61,0x70,0x20,0x3d,0x20,0x73,0x63,0x61,0x6c,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x66,0x6c,0x6f,0x6f,0x72,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x67,0x61,0x70,0x20,0x20,0x3d,0x20,0x73,0x63,0x61,0x6c,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2d,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x66,0x6c,0x6f,0x6f,0x72,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x74,0x6f,0x70,0x5f,0x6c,0x65,0x66,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x6c,0x66,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x6c,0x66,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x74,0x6f,0x70,0x5f,0x72,0x69,0x67,0x68,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x75,0x66,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x6c,0x66,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x6c,0x66,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x75,0x66,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x5f,0x72,0x69,0x67,0x68,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x75,0x66,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x75,0x66,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x74,0x6f,0x70,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x74,0x6f,0x70,0x5f,0x72,0x69,0x67,0x68,0x74,0x20,0x2d,0x20,0x74,0x6f,0x70,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x67,0x61,0x70,0x2c,0x20,0x74,0x6f,0x70,0x5f,0x6c,0x65,0x66,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x5f,0x72,0x69,0x67,0x68,0x74,0x20,0x2d,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x67,0x61,0x70,0x2c,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6f,0x75,0x74,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x20,0x2d,0x20,0x74,0x6f,0x70,0x29,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x67,0x61,0x70,0x2c,0x20,0x74,0x6f,0x70,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x77,0x72,0x69,0x74,0x65,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x29,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x7d,0xa, } }, +{ + "select", + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x5f,0x69,0x6d,0x67,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x64,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x64,0x78,0x2c,0x20,0x69,0x64,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x5f,0x76,0x65,0x63,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x64,0x78,0x2c,0x20,0x69,0x64,0x79,0x29,0x29,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x53,0x49,0x5a,0x45,0x31,0x5f,0x45,0x55,0x51,0x41,0x4c,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x30,0x2e,0x78,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x64,0x78,0x2c,0x20,0x69,0x64,0x79,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x53,0x49,0x5a,0x45,0x32,0x5f,0x45,0x55,0x51,0x41,0x4c,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x31,0x2e,0x78,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x64,0x78,0x2c,0x20,0x69,0x64,0x79,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x31,0x2c,0x20,0x69,0x6e,0x30,0x2c,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x5f,0x76,0x65,0x63,0x20,0x3d,0x3d,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x64,0x78,0x2c,0x20,0x69,0x64,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x7d,0xa, } + }, #ifndef MNN_OPENCL_BUFFER_CLOSED { "range_buf", @@ -84,7 +88,7 @@ extern const std::map> OpenCLProgramMap #ifdef MNN_SUPPORT_INTEL_SUBGROUP { "binary_subgroup_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6e,0x61,0x72,0x79,0x5f,0x62,0x75,0x66,0x5f,0x63,0x34,0x5f,0x63,0x34,0x5f,0x63,0x34,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6e,0x61,0x72,0x79,0x5f,0x62,0x75,0x66,0x5f,0x63,0x34,0x5f,0x63,0x34,0x5f,0x63,0x31,0x36,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x64,0x73,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6e,0x61,0x72,0x79,0x5f,0x62,0x75,0x66,0x5f,0x63,0x34,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6e,0x61,0x72,0x79,0x5f,0x62,0x75,0x66,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x5f,0x63,0x34,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6e,0x61,0x72,0x79,0x5f,0x62,0x75,0x66,0x5f,0x63,0x34,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x64,0x73,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6e,0x61,0x72,0x79,0x5f,0x62,0x75,0x66,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x5f,0x63,0x31,0x36,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x64,0x73,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x72,0x65,0x6c,0x75,0x5f,0x62,0x75,0x66,0x5f,0x63,0x34,0x5f,0x63,0x34,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x72,0x65,0x6c,0x75,0x5f,0x62,0x75,0x66,0x5f,0x63,0x34,0x5f,0x63,0x31,0x36,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x72,0x65,0x6c,0x75,0x5f,0x62,0x75,0x66,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x34,0x20,0x3e,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x25,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x34,0x28,0x6f,0x75,0x74,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x6f,0x75,0x74,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x72,0x65,0x6c,0x75,0x5f,0x62,0x75,0x66,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2a,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x32,0x29,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x34,0x20,0x3e,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x3f,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x25,0x20,0x34,0x29,0x20,0x3a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6e,0x61,0x72,0x79,0x5f,0x62,0x75,0x66,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x34,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x30,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x31,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x30,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x31,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3f,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x5b,0x30,0x5d,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3f,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x5b,0x30,0x5d,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3f,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x5b,0x30,0x5d,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3f,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x5b,0x30,0x5d,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3f,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x5b,0x30,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3f,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x5b,0x30,0x5d,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3f,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x5b,0x30,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3f,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x5b,0x30,0x5d,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x34,0x20,0x3e,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x25,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x34,0x28,0x6f,0x75,0x74,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x6f,0x75,0x74,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6e,0x61,0x72,0x79,0x5f,0x62,0x75,0x66,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x34,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x30,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x31,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2a,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x30,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x31,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x29,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3f,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x5b,0x30,0x5d,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3f,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x5b,0x30,0x5d,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3f,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x5b,0x30,0x5d,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3f,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x5b,0x30,0x5d,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3f,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x5b,0x30,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3f,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x5b,0x30,0x5d,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3f,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x5b,0x30,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3f,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x5b,0x30,0x5d,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x34,0x20,0x3e,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x3f,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x25,0x20,0x34,0x29,0x20,0x3a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x50,0x49,0x20,0x33,0x2e,0x31,0x34,0x31,0x35,0x39,0x32,0x36,0x35,0x33,0x35,0x38,0x39,0x66,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6e,0x61,0x72,0x79,0x5f,0x62,0x75,0x66,0x5f,0x63,0x34,0x5f,0x63,0x34,0x5f,0x63,0x34,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6e,0x61,0x72,0x79,0x5f,0x62,0x75,0x66,0x5f,0x63,0x34,0x5f,0x63,0x34,0x5f,0x63,0x31,0x36,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x64,0x73,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6e,0x61,0x72,0x79,0x5f,0x62,0x75,0x66,0x5f,0x63,0x34,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6e,0x61,0x72,0x79,0x5f,0x62,0x75,0x66,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x5f,0x63,0x34,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6e,0x61,0x72,0x79,0x5f,0x62,0x75,0x66,0x5f,0x63,0x34,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x64,0x73,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6e,0x61,0x72,0x79,0x5f,0x62,0x75,0x66,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x5f,0x63,0x31,0x36,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x2a,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x30,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x31,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x64,0x73,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x72,0x65,0x6c,0x75,0x5f,0x62,0x75,0x66,0x5f,0x63,0x34,0x5f,0x63,0x34,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x72,0x65,0x6c,0x75,0x5f,0x62,0x75,0x66,0x5f,0x63,0x34,0x5f,0x63,0x31,0x36,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x5f,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x72,0x65,0x6c,0x75,0x5f,0x62,0x75,0x66,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x34,0x20,0x3e,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x25,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x34,0x28,0x6f,0x75,0x74,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x6f,0x75,0x74,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x72,0x65,0x6c,0x75,0x5f,0x62,0x75,0x66,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2a,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x32,0x29,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x34,0x20,0x3e,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x3f,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x25,0x20,0x34,0x29,0x20,0x3a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6e,0x61,0x72,0x79,0x5f,0x62,0x75,0x66,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x34,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x30,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x31,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x30,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x31,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3f,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x5b,0x30,0x5d,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3f,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x5b,0x30,0x5d,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3f,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x5b,0x30,0x5d,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3f,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x5b,0x30,0x5d,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3f,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x5b,0x30,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3f,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x5b,0x30,0x5d,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3f,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x5b,0x30,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3f,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x5b,0x30,0x5d,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x34,0x20,0x3e,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x25,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x34,0x28,0x6f,0x75,0x74,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x6f,0x75,0x74,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6e,0x61,0x72,0x79,0x5f,0x62,0x75,0x66,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x4e,0x2c,0x48,0x2c,0x57,0x2c,0x43,0x34,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x30,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x31,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2a,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x30,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x30,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x31,0x36,0x2b,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x72,0x63,0x31,0x5f,0x77,0x69,0x64,0x74,0x68,0x2b,0x77,0x5f,0x69,0x64,0x78,0x2b,0x69,0x6e,0x70,0x75,0x74,0x31,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x2b,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x29,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4e,0x54,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3f,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x5b,0x30,0x5d,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3f,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x5b,0x30,0x5d,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3f,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x5b,0x30,0x5d,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3f,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x5b,0x30,0x5d,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3f,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x5b,0x30,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3f,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x5b,0x30,0x5d,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x78,0x20,0x3f,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x30,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x5b,0x30,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x69,0x73,0x46,0x75,0x6c,0x6c,0x2e,0x79,0x20,0x3f,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x5b,0x30,0x5d,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x61,0x63,0x74,0x69,0x76,0x61,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x34,0x20,0x3e,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x3f,0x20,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x25,0x20,0x34,0x29,0x20,0x3a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa, } }, #endif #endif @@ -157,7 +161,7 @@ extern const std::map> OpenCLProgramMap #ifndef MNN_OPENCL_BUFFER_CLOSED { "gemm_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x69,0x6e,0x64,0x65,0x78,0x30,0x2c,0x20,0x69,0x6e,0x64,0x65,0x78,0x31,0x29,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x64,0x65,0x78,0x30,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x64,0x65,0x78,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x2f,0x2f,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x77,0x55,0x6e,0x69,0x74,0x2a,0x68,0x55,0x6e,0x69,0x74,0x2c,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x2f,0x2f,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6f,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x59,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x48,0x57,0x43,0x20,0x20,0x5b,0x31,0x2c,0x20,0x31,0x2c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2a,0x34,0x5d,0x20,0x78,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x5b,0x30,0x2c,0x20,0x30,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x2a,0x77,0x69,0x64,0x74,0x68,0x2b,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x20,0x20,0x20,0x69,0x6e,0x64,0x65,0x78,0x2b,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x31,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6b,0x20,0x2a,0x20,0x28,0x61,0x6c,0x70,0x68,0x61,0x32,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2b,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x29,0x20,0x2a,0x20,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2a,0x34,0x29,0x20,0x2b,0x20,0x69,0x6e,0x64,0x65,0x78,0x29,0x2a,0x34,0x20,0x2b,0x20,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6b,0x5f,0x76,0x31,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x2a,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x29,0x20,0x2b,0x20,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x61,0x6c,0x70,0x68,0x61,0x2a,0x61,0x6c,0x70,0x68,0x61,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x34,0x5d,0x20,0x78,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x6f,0x73,0x5f,0x78,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x28,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2a,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x6b,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x38,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x63,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x2c,0x20,0x6f,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x39,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x64,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x2c,0x20,0x6f,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x61,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x65,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x2c,0x20,0x6f,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x62,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x66,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x2c,0x20,0x6f,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x2c,0x20,0x34,0x2c,0x20,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x77,0x55,0x6e,0x69,0x74,0x2a,0x68,0x55,0x6e,0x69,0x74,0x2c,0x34,0x29,0x5d,0x20,0x78,0x20,0x34,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x20,0x30,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x70,0x6f,0x73,0x5f,0x79,0x20,0x2a,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x34,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x38,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x31,0x32,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x7d,0xa,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x62,0x75,0x66,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x2f,0x2f,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x77,0x55,0x6e,0x69,0x74,0x2a,0x68,0x55,0x6e,0x69,0x74,0x2c,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x2f,0x2f,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x28,0x77,0x69,0x64,0x74,0x68,0x2b,0x31,0x29,0x20,0x3e,0x3e,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6f,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6f,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2a,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x48,0x57,0x43,0x20,0x20,0x5b,0x31,0x2c,0x20,0x31,0x2c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2a,0x34,0x5d,0x20,0x78,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x5b,0x30,0x2c,0x20,0x30,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x2a,0x77,0x69,0x64,0x74,0x68,0x2b,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x20,0x20,0x20,0x69,0x6e,0x64,0x65,0x78,0x2b,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x31,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6b,0x20,0x2a,0x20,0x28,0x61,0x6c,0x70,0x68,0x61,0x32,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2b,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x29,0x20,0x2a,0x20,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2a,0x34,0x29,0x20,0x2b,0x20,0x69,0x6e,0x64,0x65,0x78,0x29,0x2a,0x34,0x20,0x2b,0x20,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6b,0x5f,0x76,0x31,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x61,0x6c,0x70,0x68,0x61,0x2a,0x61,0x6c,0x70,0x68,0x61,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x34,0x5d,0x20,0x78,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x6f,0x73,0x5f,0x78,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x38,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x63,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x39,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x64,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x61,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x65,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x62,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x66,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x38,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x63,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x39,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x64,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x61,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x65,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x62,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x66,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x2c,0x20,0x34,0x2c,0x20,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x77,0x55,0x6e,0x69,0x74,0x2a,0x68,0x55,0x6e,0x69,0x74,0x2c,0x34,0x29,0x5d,0x20,0x78,0x20,0x34,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x20,0x30,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x70,0x6f,0x73,0x5f,0x79,0x20,0x2a,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x30,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x30,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x34,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x30,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x38,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x30,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x31,0x32,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x70,0x6f,0x73,0x5f,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x34,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x38,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x31,0x32,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x69,0x6e,0x64,0x65,0x78,0x30,0x2c,0x20,0x69,0x6e,0x64,0x65,0x78,0x31,0x29,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x64,0x65,0x78,0x30,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x64,0x65,0x78,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x2f,0x2f,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x77,0x55,0x6e,0x69,0x74,0x2a,0x68,0x55,0x6e,0x69,0x74,0x2c,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x2f,0x2f,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6f,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x59,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x48,0x57,0x43,0x20,0x20,0x5b,0x31,0x2c,0x20,0x31,0x2c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2a,0x34,0x5d,0x20,0x78,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x5b,0x30,0x2c,0x20,0x30,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x2a,0x77,0x69,0x64,0x74,0x68,0x2b,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x20,0x20,0x20,0x69,0x6e,0x64,0x65,0x78,0x2b,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x31,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6b,0x20,0x2a,0x20,0x28,0x61,0x6c,0x70,0x68,0x61,0x32,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2b,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x29,0x20,0x2a,0x20,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2a,0x34,0x29,0x20,0x2b,0x20,0x69,0x6e,0x64,0x65,0x78,0x29,0x2a,0x34,0x20,0x2b,0x20,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6b,0x5f,0x76,0x31,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x2a,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x29,0x20,0x2b,0x20,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x61,0x6c,0x70,0x68,0x61,0x2a,0x61,0x6c,0x70,0x68,0x61,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x34,0x5d,0x20,0x78,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x6f,0x73,0x5f,0x78,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x28,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2a,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x6b,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x38,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x63,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x2c,0x20,0x6f,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x39,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x64,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x2c,0x20,0x6f,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x61,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x65,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x2c,0x20,0x6f,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x62,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x66,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x2c,0x20,0x6f,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x2c,0x20,0x34,0x2c,0x20,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x77,0x55,0x6e,0x69,0x74,0x2a,0x68,0x55,0x6e,0x69,0x74,0x2c,0x34,0x29,0x5d,0x20,0x78,0x20,0x34,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x20,0x30,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x70,0x6f,0x73,0x5f,0x79,0x20,0x2a,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x34,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x38,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x31,0x32,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x7d,0xa,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x62,0x75,0x66,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x2f,0x2f,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x77,0x55,0x6e,0x69,0x74,0x2a,0x68,0x55,0x6e,0x69,0x74,0x2c,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x2f,0x2f,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x28,0x77,0x69,0x64,0x74,0x68,0x2b,0x31,0x29,0x20,0x3e,0x3e,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6f,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6f,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2a,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x48,0x57,0x43,0x20,0x20,0x5b,0x31,0x2c,0x20,0x31,0x2c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2a,0x34,0x5d,0x20,0x78,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x5b,0x30,0x2c,0x20,0x30,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x2a,0x77,0x69,0x64,0x74,0x68,0x2b,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x20,0x20,0x20,0x69,0x6e,0x64,0x65,0x78,0x2b,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x31,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6b,0x20,0x2a,0x20,0x28,0x61,0x6c,0x70,0x68,0x61,0x32,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2b,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x29,0x20,0x2a,0x20,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2a,0x34,0x29,0x20,0x2b,0x20,0x69,0x6e,0x64,0x65,0x78,0x29,0x2a,0x34,0x20,0x2b,0x20,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6b,0x5f,0x76,0x31,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x61,0x6c,0x70,0x68,0x61,0x2a,0x61,0x6c,0x70,0x68,0x61,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x34,0x5d,0x20,0x78,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x6f,0x73,0x5f,0x78,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x38,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x63,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x39,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x64,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x61,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x65,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x62,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x66,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x38,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x63,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x39,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x64,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x61,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x65,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x62,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x66,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x2c,0x20,0x34,0x2c,0x20,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x77,0x55,0x6e,0x69,0x74,0x2a,0x68,0x55,0x6e,0x69,0x74,0x2c,0x34,0x29,0x5d,0x20,0x78,0x20,0x34,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x20,0x30,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x70,0x6f,0x73,0x5f,0x79,0x20,0x2a,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x30,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x30,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x34,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x30,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x38,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x30,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x31,0x32,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x70,0x6f,0x73,0x5f,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x34,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x38,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x31,0x32,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x63,0x6f,0x6e,0x76,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x6f,0x75,0x74,0x2f,0x34,0x2c,0x20,0x62,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x62,0x69,0x61,0x73,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x38,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x63,0x61,0x6c,0x65,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x31,0x36,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x77,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x38,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x38,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x30,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x31,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x32,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x32,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x33,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x33,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x34,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x34,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x35,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x35,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x36,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x36,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x37,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x37,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x2e,0x78,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x2e,0x79,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x2e,0x7a,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x2e,0x77,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x63,0x6f,0x6e,0x76,0x5f,0x62,0x32,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x6f,0x75,0x74,0x2f,0x34,0x2c,0x20,0x62,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x62,0x69,0x61,0x73,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x30,0x20,0x3d,0x20,0x30,0x2c,0x20,0x73,0x75,0x6d,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x2a,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x38,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x63,0x61,0x6c,0x65,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x31,0x36,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x30,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x30,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x77,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x38,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x38,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x30,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x31,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x32,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x32,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x33,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x33,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x34,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x34,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x35,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x35,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x36,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x36,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x37,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x37,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x30,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x30,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x30,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x31,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x70,0x6f,0x73,0x5f,0x79,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x62,0x61,0x74,0x63,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x7d,0xa, } }, #endif { @@ -192,12 +196,16 @@ extern const std::map> OpenCLProgramMap #endif { "gemm", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x28,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6d,0x75,0x6c,0x74,0x69,0x4c,0x65,0x6e,0x67,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x20,0x77,0x69,0x64,0x74,0x68,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x3c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x32,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x33,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x59,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x6d,0x75,0x6c,0x74,0x69,0x4c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2c,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2b,0x31,0x2c,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2b,0x32,0x2c,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2b,0x33,0x2c,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2b,0x31,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2b,0x32,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2b,0x33,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x59,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x59,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x59,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x59,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x29,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x57,0x69,0x6e,0x6f,0x67,0x72,0x61,0x64,0x28,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6d,0x75,0x6c,0x74,0x69,0x4c,0x65,0x6e,0x67,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x34,0x20,0x3d,0x20,0x28,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x34,0x20,0x2a,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x3c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x20,0x2a,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x25,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2f,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x25,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x77,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2f,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x32,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x33,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x59,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x77,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x58,0x20,0x3d,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x6d,0x75,0x6c,0x74,0x69,0x4c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x2c,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x77,0x2c,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x73,0x72,0x63,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2d,0x20,0x73,0x72,0x63,0x58,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x57,0x69,0x6e,0x6f,0x67,0x72,0x61,0x64,0x57,0x32,0x28,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6d,0x75,0x6c,0x74,0x69,0x4c,0x65,0x6e,0x67,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x38,0x20,0x3d,0x20,0x28,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x37,0x29,0x20,0x2f,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x38,0x20,0x2a,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x3c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x20,0x2a,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x25,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2f,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x25,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x77,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2f,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x32,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x33,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x34,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x35,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x36,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x37,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x59,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x77,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x58,0x20,0x3d,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3c,0x3c,0x20,0x33,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x6d,0x75,0x6c,0x74,0x69,0x4c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x2c,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x34,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x35,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x35,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x36,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x36,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x37,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x37,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x34,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x34,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x34,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x34,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x35,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x35,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x35,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x35,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x35,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x36,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x36,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x36,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x36,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x37,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x37,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x37,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x37,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x77,0x2c,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x73,0x72,0x63,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2d,0x20,0x73,0x72,0x63,0x58,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x38,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x34,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x36,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x37,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x37,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x34,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x36,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x36,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x34,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x35,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x34,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x69,0x6e,0x64,0x65,0x78,0x30,0x2c,0x20,0x69,0x6e,0x64,0x65,0x78,0x31,0x29,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x64,0x65,0x78,0x30,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x64,0x65,0x78,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x28,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6d,0x75,0x6c,0x74,0x69,0x4c,0x65,0x6e,0x67,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x20,0x77,0x69,0x64,0x74,0x68,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x3c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x32,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x33,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x59,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x6d,0x75,0x6c,0x74,0x69,0x4c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2c,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2b,0x31,0x2c,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2b,0x32,0x2c,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2b,0x33,0x2c,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2b,0x31,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2b,0x32,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2b,0x33,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x59,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x59,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x59,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x59,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x29,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x57,0x69,0x6e,0x6f,0x67,0x72,0x61,0x64,0x28,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6d,0x75,0x6c,0x74,0x69,0x4c,0x65,0x6e,0x67,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x34,0x20,0x3d,0x20,0x28,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x34,0x20,0x2a,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x3c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x20,0x2a,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x25,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2f,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x25,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x77,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2f,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x32,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x33,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x59,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x77,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x58,0x20,0x3d,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x6d,0x75,0x6c,0x74,0x69,0x4c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x2c,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x77,0x2c,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x73,0x72,0x63,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2d,0x20,0x73,0x72,0x63,0x58,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x57,0x69,0x6e,0x6f,0x67,0x72,0x61,0x64,0x57,0x32,0x28,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6d,0x75,0x6c,0x74,0x69,0x4c,0x65,0x6e,0x67,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x38,0x20,0x3d,0x20,0x28,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x37,0x29,0x20,0x2f,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x38,0x20,0x2a,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x3c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x20,0x2a,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x25,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2f,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x25,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x77,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2f,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x32,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x33,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x34,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x35,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x36,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x37,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x59,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x77,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x58,0x20,0x3d,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3c,0x3c,0x20,0x33,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x6d,0x75,0x6c,0x74,0x69,0x4c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x2c,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6b,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x32,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x33,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x34,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x35,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x35,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x36,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x36,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x37,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x73,0x72,0x63,0x58,0x20,0x2b,0x20,0x78,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x37,0x2c,0x20,0x73,0x72,0x63,0x59,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x30,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x31,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x32,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x33,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x34,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x34,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x34,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x34,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x35,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x35,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x35,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x35,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x35,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x36,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x36,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x36,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x36,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x37,0x2e,0x78,0x2c,0x20,0x6b,0x30,0x2c,0x20,0x6f,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x37,0x2e,0x79,0x2c,0x20,0x6b,0x31,0x2c,0x20,0x6f,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x37,0x2e,0x7a,0x2c,0x20,0x6b,0x32,0x2c,0x20,0x6f,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x37,0x2e,0x77,0x2c,0x20,0x6b,0x33,0x2c,0x20,0x6f,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x77,0x2c,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x73,0x72,0x63,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2d,0x20,0x73,0x72,0x63,0x58,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x38,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x34,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x36,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x37,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x37,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x34,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x36,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x36,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x34,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x35,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x34,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x78,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x63,0x6f,0x6e,0x76,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x6f,0x75,0x74,0x2f,0x34,0x2c,0x20,0x62,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x62,0x69,0x61,0x73,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x38,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x63,0x61,0x6c,0x65,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6b,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x31,0x36,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x77,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x38,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x38,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x30,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x31,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x32,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x32,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x33,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x33,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x34,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x34,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x35,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x35,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x36,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x36,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x37,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x37,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x2e,0x78,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x2e,0x79,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x2e,0x7a,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x2e,0x77,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x63,0x6f,0x6e,0x76,0x5f,0x62,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x6f,0x75,0x74,0x2f,0x34,0x2c,0x20,0x62,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x62,0x69,0x61,0x73,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x30,0x20,0x3d,0x20,0x30,0x2c,0x20,0x73,0x75,0x6d,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x38,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x63,0x61,0x6c,0x65,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6b,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6b,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x2b,0x20,0x31,0x29,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x31,0x36,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x30,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x30,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x77,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x38,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x38,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x30,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x31,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x32,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x32,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x33,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x33,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x34,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x34,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x35,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x35,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x36,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x36,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x37,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x37,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x30,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x30,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x77,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x30,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x31,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x70,0x6f,0x73,0x5f,0x79,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x62,0x61,0x74,0x63,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x2b,0x20,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x7d,0xa, } }, { "depthwise_deconv2d", { 0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x69,0x2c,0x20,0x62,0x61,0x73,0x65,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x23,0x23,0x69,0x20,0x2b,0x20,0x62,0x61,0x73,0x65,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x23,0x23,0x69,0x20,0x3d,0x20,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x62,0x5f,0x76,0x61,0x6c,0x75,0x65,0x29,0x29,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x69,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x64,0x65,0x63,0x6f,0x6e,0x76,0x32,0x64,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x4e,0x4f,0x5f,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x61,0x6c,0x69,0x67,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x4e,0x4f,0x5f,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x62,0x69,0x61,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x28,0x30,0x2e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x61,0x6c,0x69,0x67,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x2f,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x79,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x61,0x6c,0x69,0x67,0x6e,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x2f,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x64,0x65,0x61,0x6c,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x20,0x3d,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x64,0x65,0x61,0x6c,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x79,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x31,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x69,0x6d,0x61,0x67,0x65,0x5f,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x69,0x64,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x5f,0x79,0x20,0x3d,0x20,0x64,0x65,0x61,0x6c,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x64,0x78,0x5f,0x68,0x20,0x3d,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x79,0x3b,0x20,0x6b,0x5f,0x79,0x20,0x3e,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x5f,0x79,0x20,0x2d,0x3d,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x69,0x64,0x78,0x5f,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x69,0x64,0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x69,0x64,0x78,0x5f,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x62,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x69,0x64,0x79,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x69,0x64,0x78,0x5f,0x68,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x64,0x78,0x5f,0x68,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x5f,0x78,0x20,0x3d,0x20,0x64,0x65,0x61,0x6c,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x78,0x3b,0x20,0x6b,0x5f,0x78,0x20,0x3e,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x5f,0x78,0x20,0x2d,0x3d,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x30,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x69,0x6d,0x61,0x67,0x65,0x5f,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x5f,0x79,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x6b,0x5f,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x69,0x6d,0x61,0x67,0x65,0x5f,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x30,0x2c,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x6d,0x61,0x67,0x65,0x5f,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x72,0x69,0x74,0x65,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x69,0x6d,0x61,0x67,0x65,0x5f,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa, } }, +{ + "range", + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x72,0x61,0x6e,0x67,0x65,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x68,0x20,0x3d,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x77,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x34,0x20,0x69,0x6e,0x64,0x65,0x78,0x34,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x28,0x69,0x6e,0x64,0x65,0x78,0x2c,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x73,0x69,0x7a,0x65,0x2c,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x73,0x69,0x7a,0x65,0x20,0x2a,0x20,0x32,0x2c,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x73,0x69,0x7a,0x65,0x20,0x2a,0x20,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x2c,0x20,0x30,0x29,0x29,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x74,0x65,0x70,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x2c,0x20,0x30,0x29,0x29,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x6e,0x64,0x65,0x78,0x34,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x74,0x65,0x70,0x3b,0xa,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x63,0x77,0x2c,0x20,0x62,0x68,0x29,0x2c,0x20,0x76,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x7d,0xa, } + }, #ifndef MNN_OPENCL_BUFFER_CLOSED { "scale_buf", @@ -217,7 +225,7 @@ extern const std::map> OpenCLProgramMap #ifndef MNN_OPENCL_BUFFER_CLOSED { "conv_2d_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x69,0x2c,0x20,0x62,0x61,0x73,0x65,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x23,0x23,0x69,0x20,0x2b,0x20,0x62,0x61,0x73,0x65,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x25,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x6c,0x65,0x6e,0x67,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x23,0x23,0x69,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x29,0x3d,0x3d,0x2d,0x31,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x69,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x78,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x20,0x3d,0x20,0x28,0x69,0x78,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2f,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x2f,0x2f,0x67,0x65,0x6e,0x65,0x72,0x61,0x74,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x27,0x73,0x20,0x6e,0x75,0x6d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x34,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x61,0x64,0x64,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2a,0x6f,0x75,0x74,0x5f,0x77,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x61,0x64,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x38,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x38,0x20,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x31,0x29,0x2b,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x35,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x36,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x37,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x20,0x3d,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x34,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x2a,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x38,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x38,0x20,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x31,0x29,0x2b,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x35,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x36,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x37,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x20,0x3d,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x34,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x2a,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x34,0x68,0x31,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x34,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x34,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x38,0x68,0x34,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x38,0x68,0x32,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x38,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x69,0x2c,0x20,0x62,0x61,0x73,0x65,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x23,0x23,0x69,0x20,0x2b,0x20,0x62,0x61,0x73,0x65,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x25,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x6c,0x65,0x6e,0x67,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x23,0x23,0x69,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x29,0x3d,0x3d,0x2d,0x31,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x69,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x20,0x31,0x35,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x34,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x20,0x2f,0x2f,0x20,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x20,0x2f,0x2f,0x20,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x61,0x64,0x64,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2a,0x6f,0x75,0x74,0x5f,0x77,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x78,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x79,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x7a,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x77,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x77,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x78,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x79,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x7a,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x77,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x77,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x61,0x64,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x38,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x38,0x20,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x29,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x29,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x31,0x29,0x2b,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x35,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x36,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x37,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2e,0x78,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2e,0x79,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2e,0x7a,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2e,0x77,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2e,0x78,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2e,0x79,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2e,0x7a,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2e,0x77,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x2e,0x77,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x35,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x35,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x36,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x37,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x34,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x34,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x34,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x34,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x35,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x35,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x35,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x35,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x36,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x36,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x36,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x36,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x37,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x37,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x37,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x37,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2e,0x78,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2e,0x79,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2e,0x7a,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2e,0x77,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2e,0x78,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2e,0x79,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2e,0x7a,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2e,0x77,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x2e,0x77,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x35,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x36,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x37,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x20,0x3d,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x34,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x2a,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x38,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0x20,0x2f,0x2f,0x20,0x6f,0x63,0x20,0x2f,0x20,0x34,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x38,0x20,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x29,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x29,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x31,0x29,0x2b,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x35,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x36,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x37,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2e,0x78,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2e,0x79,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2e,0x7a,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2e,0x77,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2e,0x78,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2e,0x79,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2e,0x7a,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2e,0x77,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x2e,0x77,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x35,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x35,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x36,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x37,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x34,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x34,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x34,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x34,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x35,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x35,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x35,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x35,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x36,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x36,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x36,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x36,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x37,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x37,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x37,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x37,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2e,0x78,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2e,0x79,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2e,0x7a,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2e,0x77,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2e,0x78,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2e,0x79,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2e,0x7a,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2e,0x77,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x2e,0x77,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x35,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x36,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x37,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x20,0x3d,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x34,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x2a,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x34,0x68,0x31,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x78,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x79,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x7a,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x77,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x77,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x78,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x79,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x7a,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x77,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x77,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x34,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x78,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x79,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x7a,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x77,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x77,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x78,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x79,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x7a,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2e,0x77,0x20,0x2b,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x2e,0x77,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x78,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x20,0x3d,0x20,0x28,0x69,0x78,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2f,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x2f,0x2f,0x67,0x65,0x6e,0x65,0x72,0x61,0x74,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x27,0x73,0x20,0x6e,0x75,0x6d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x34,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x38,0x68,0x34,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x38,0x68,0x32,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x20,0x5b,0x69,0x63,0x2f,0x34,0x2c,0x20,0x6f,0x63,0x2c,0x20,0x34,0x5d,0x2c,0x20,0x6c,0x6f,0x6f,0x70,0x3a,0x20,0x69,0x63,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x38,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa, } }, #endif { @@ -240,10 +248,6 @@ extern const std::map> OpenCLProgramMap { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x45,0x58,0x50,0x20,0x65,0x78,0x70,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x73,0x6f,0x66,0x74,0x6d,0x61,0x78,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x29,0x20,0x7b,0x2f,0x2f,0x4e,0x43,0x48,0x57,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x68,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x77,0x2c,0x20,0x62,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x68,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x68,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x30,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2b,0x77,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x20,0x3e,0x3d,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x79,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x20,0x2d,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x79,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x20,0x2d,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x73,0x6f,0x66,0x74,0x6d,0x61,0x78,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x20,0x2f,0x2f,0x20,0x4e,0x43,0x48,0x57,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x63,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x77,0x63,0x2c,0x20,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x77,0x63,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x20,0x3d,0x20,0x77,0x63,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x63,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x30,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2b,0x77,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x20,0x3e,0x3d,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x4d,0x61,0x78,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x45,0x78,0x70,0x20,0x53,0x75,0x6d,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x52,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x4d,0x61,0x78,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x45,0x78,0x70,0x20,0x53,0x75,0x6d,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x52,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x73,0x6f,0x66,0x74,0x6d,0x61,0x78,0x5f,0x77,0x69,0x64,0x74,0x68,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x20,0x2f,0x2f,0x20,0x4e,0x43,0x48,0x57,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x68,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x63,0x2c,0x20,0x62,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x62,0x68,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x20,0x3d,0x20,0x62,0x68,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x63,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x68,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2b,0x30,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x20,0x3e,0x3d,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x4d,0x61,0x78,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x45,0x78,0x70,0x20,0x53,0x75,0x6d,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x52,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x4d,0x61,0x78,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x45,0x78,0x70,0x20,0x53,0x75,0x6d,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x52,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa, } }, #endif -{ - "convert_int8", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x67,0x65,0x6c,0x75,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x30,0x2e,0x37,0x39,0x37,0x38,0x38,0x34,0x35,0x38,0x66,0x20,0x2a,0x20,0x28,0x30,0x2e,0x30,0x34,0x34,0x37,0x31,0x35,0x66,0x20,0x2a,0x20,0x69,0x6e,0x20,0x2a,0x20,0x69,0x6e,0x20,0x2a,0x20,0x69,0x6e,0x20,0x2b,0x20,0x69,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x78,0x32,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3e,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x35,0x2e,0x30,0x66,0x20,0x3f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x31,0x2e,0x30,0x66,0x20,0x3a,0x20,0x28,0x76,0x61,0x6c,0x75,0x65,0x20,0x3c,0x3d,0x20,0x2d,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x35,0x2e,0x30,0x66,0x20,0x3f,0x20,0x2d,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x31,0x2e,0x30,0x66,0x20,0x3a,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x76,0x61,0x6c,0x75,0x65,0x20,0x2a,0x20,0x28,0x31,0x33,0x35,0x31,0x33,0x35,0x2e,0x30,0x66,0x20,0x2b,0x20,0x78,0x32,0x20,0x2a,0x20,0x28,0x31,0x37,0x33,0x32,0x35,0x2e,0x30,0x66,0x20,0x2b,0x20,0x78,0x32,0x20,0x2a,0x20,0x28,0x33,0x37,0x38,0x2e,0x30,0x66,0x20,0x2b,0x20,0x78,0x32,0x29,0x29,0x29,0x29,0x20,0x2f,0x20,0x28,0x31,0x33,0x35,0x31,0x33,0x35,0x2e,0x30,0x66,0x20,0x2b,0x20,0x78,0x32,0x20,0x2a,0x20,0x28,0x36,0x32,0x33,0x37,0x30,0x2e,0x30,0x66,0x20,0x2b,0x20,0x78,0x32,0x20,0x2a,0x20,0x28,0x33,0x31,0x35,0x30,0x2e,0x30,0x66,0x20,0x2b,0x20,0x78,0x32,0x20,0x2a,0x20,0x32,0x38,0x2e,0x30,0x66,0x29,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x28,0x31,0x2e,0x30,0x66,0x20,0x2b,0x20,0x64,0x73,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x20,0x2a,0x20,0x30,0x2e,0x35,0x66,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x66,0x6c,0x6f,0x61,0x74,0x5f,0x32,0x5f,0x69,0x6e,0x74,0x38,0x5f,0x73,0x69,0x6e,0x67,0x6c,0x65,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73,0x63,0x61,0x6c,0x65,0x44,0x61,0x74,0x61,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x7a,0x65,0x72,0x6f,0x50,0x6f,0x69,0x6e,0x74,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x63,0x6c,0x61,0x6d,0x70,0x4d,0x61,0x78,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x63,0x6c,0x61,0x6d,0x70,0x4d,0x69,0x6e,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x62,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x77,0x2c,0x20,0x68,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x70,0x6f,0x73,0x2c,0x20,0x68,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x69,0x6e,0x20,0x2a,0x20,0x73,0x63,0x61,0x6c,0x65,0x44,0x61,0x74,0x61,0x29,0x20,0x2b,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x7a,0x65,0x72,0x6f,0x50,0x6f,0x69,0x6e,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6f,0x75,0x74,0x2c,0x20,0x63,0x6c,0x61,0x6d,0x70,0x4d,0x61,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x63,0x6c,0x61,0x6d,0x70,0x4d,0x69,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x70,0x6f,0x73,0x2c,0x20,0x68,0x62,0x29,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x7d,0xa, } - }, #ifndef MNN_OPENCL_BUFFER_CLOSED #ifdef MNN_SUPPORT_INTEL_SUBGROUP { @@ -264,10 +268,14 @@ extern const std::map> OpenCLProgramMap { 0x2f,0x2f,0x20,0x54,0x4f,0x44,0x4f,0x3a,0x20,0x75,0x73,0x65,0x20,0x49,0x4e,0x49,0x54,0x5f,0x53,0x43,0x41,0x4c,0x41,0x52,0x5f,0x56,0x41,0x4c,0x55,0x45,0x2c,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x2c,0x20,0x46,0x49,0x4e,0x41,0x4c,0x5f,0x4f,0x50,0x45,0x52,0x41,0x54,0x4f,0x52,0x5f,0x4f,0x4e,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x6d,0x61,0x63,0x72,0x6f,0x20,0x61,0x62,0x73,0x74,0x72,0x61,0x63,0x74,0x20,0x61,0x6e,0x64,0x20,0x73,0x69,0x6d,0x70,0x6c,0x69,0x66,0x79,0x20,0x63,0x6f,0x64,0x65,0xa,0x2f,0x2f,0x20,0x54,0x4f,0x44,0x4f,0x3a,0x20,0x73,0x75,0x70,0x70,0x6f,0x72,0x74,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x20,0x64,0x69,0x6d,0x73,0x20,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x62,0x61,0x74,0x63,0x68,0xa,0x2f,0x2f,0x20,0x54,0x4f,0x44,0x4f,0x3a,0x20,0x73,0x75,0x70,0x70,0x6f,0x72,0x74,0x20,0x6b,0x65,0x65,0x70,0x5f,0x64,0x69,0x6d,0x3d,0x46,0x61,0x6c,0x73,0x65,0xa,0x2f,0x2f,0x20,0x54,0x4f,0x44,0x4f,0x3a,0x20,0x66,0x69,0x78,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x72,0x65,0x2d,0x70,0x61,0x63,0x6b,0x20,0x70,0x72,0x6f,0x62,0x6c,0x65,0x6d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x72,0x65,0x64,0x75,0x63,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x42,0x61,0x74,0x63,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x56,0x41,0x4c,0x55,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x20,0x3e,0x20,0x30,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2c,0x20,0x69,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2c,0x20,0x69,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x45,0x54,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x20,0x2f,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x72,0x65,0x64,0x75,0x63,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x42,0x61,0x74,0x63,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x20,0x3e,0x20,0x30,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x56,0x41,0x4c,0x55,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2c,0x20,0x69,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x56,0x41,0x4c,0x55,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2c,0x20,0x69,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x45,0x54,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x20,0x2f,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x72,0x65,0x64,0x75,0x63,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x42,0x61,0x74,0x63,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x20,0x3e,0x20,0x30,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2d,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x56,0x41,0x4c,0x55,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x50,0x74,0x72,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x29,0x26,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x20,0x2b,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2c,0x20,0x69,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x78,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2e,0x78,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x78,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2e,0x78,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x78,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2e,0x78,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x78,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6a,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6a,0x20,0x3c,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x3b,0x20,0x2b,0x2b,0x6a,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x78,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x50,0x74,0x72,0x5b,0x6a,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x45,0x54,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x2e,0x78,0x20,0x2f,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2d,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x56,0x41,0x4c,0x55,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x50,0x74,0x72,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x29,0x26,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x20,0x2d,0x20,0x31,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6a,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6a,0x20,0x3c,0x20,0x34,0x3b,0x20,0x2b,0x2b,0x6a,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2c,0x20,0x69,0x6e,0x50,0x74,0x72,0x5b,0x6a,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6a,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6a,0x20,0x3c,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x3b,0x20,0x2b,0x2b,0x6a,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2c,0x20,0x69,0x6e,0x50,0x74,0x72,0x5b,0x6a,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x45,0x54,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x20,0x2f,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x72,0x65,0x64,0x75,0x63,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x42,0x61,0x74,0x63,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x20,0x3e,0x20,0x30,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2d,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x56,0x41,0x4c,0x55,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x50,0x74,0x72,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x29,0x26,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x20,0x2b,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2c,0x20,0x69,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x78,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2e,0x78,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x78,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2e,0x78,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x78,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2e,0x78,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x78,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6a,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6a,0x20,0x3c,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x3b,0x20,0x2b,0x2b,0x6a,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x78,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x50,0x74,0x72,0x5b,0x6a,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x45,0x54,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x2e,0x78,0x20,0x2f,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2d,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x56,0x41,0x4c,0x55,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x50,0x74,0x72,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x29,0x26,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x20,0x2d,0x20,0x31,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6a,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6a,0x20,0x3c,0x20,0x34,0x3b,0x20,0x2b,0x2b,0x6a,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2c,0x20,0x69,0x6e,0x50,0x74,0x72,0x5b,0x6a,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6a,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6a,0x20,0x3c,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x3b,0x20,0x2b,0x2b,0x6a,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2c,0x20,0x69,0x6e,0x50,0x74,0x72,0x5b,0x6a,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x45,0x54,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x20,0x2f,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x72,0x65,0x64,0x75,0x63,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x42,0x61,0x74,0x63,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x20,0x3e,0x20,0x30,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x30,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x30,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x56,0x41,0x4c,0x55,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x42,0x61,0x74,0x63,0x68,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x20,0x2a,0x20,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2c,0x20,0x69,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x45,0x54,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x20,0x2f,0x20,0x69,0x6e,0x70,0x75,0x74,0x42,0x61,0x74,0x63,0x68,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x30,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x30,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x56,0x41,0x4c,0x55,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x42,0x61,0x74,0x63,0x68,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x20,0x2a,0x20,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x4f,0x50,0x45,0x52,0x41,0x54,0x45,0x28,0x6f,0x75,0x74,0x2c,0x20,0x69,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x45,0x54,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x20,0x2f,0x20,0x69,0x6e,0x70,0x75,0x74,0x42,0x61,0x74,0x63,0x68,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa, } }, #endif +{ + "cast", + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x61,0x73,0x74,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x54,0x4f,0x5f,0x42,0x4f,0x4f,0x4c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x3d,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x30,0x20,0x3f,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x30,0x20,0x3a,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x76,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa, } + }, #ifndef MNN_OPENCL_BUFFER_CLOSED { "buffer_convert_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x68,0x77,0x63,0x29,0x20,0x74,0x6f,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x34,0x68,0x77,0x34,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x68,0x77,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x5f,0x70,0x74,0x72,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2b,0x33,0x29,0x2f,0x34,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x68,0x77,0x63,0x29,0x20,0x74,0x6f,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x34,0x68,0x77,0x34,0x29,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x68,0x77,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x69,0x6e,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x5f,0x70,0x74,0x72,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2b,0x33,0x29,0x2f,0x34,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x68,0x77,0x29,0x20,0x74,0x6f,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x34,0x68,0x77,0x34,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x20,0x20,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x3d,0x20,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2b,0x33,0x29,0x2f,0x34,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x68,0x77,0x29,0x20,0x74,0x6f,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x34,0x68,0x77,0x34,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x69,0x6e,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x20,0x20,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x3d,0x20,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2b,0x33,0x29,0x2f,0x34,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x69,0x6e,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x5b,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x3b,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x6f,0x75,0x74,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x29,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x5b,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x3b,0xa,0x7d,0xa,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6f,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x28,0x62,0x20,0x68,0x2c,0x20,0x69,0x63,0x2f,0x34,0x20,0x77,0x20,0x69,0x63,0x34,0x29,0x20,0x74,0x6f,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x68,0x77,0x63,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x68,0x77,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2b,0x33,0x29,0x2f,0x34,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2b,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x2b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x2b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x2b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6f,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x28,0x62,0x20,0x68,0x2c,0x20,0x69,0x63,0x2f,0x34,0x20,0x77,0x20,0x69,0x63,0x34,0x29,0x20,0x74,0x6f,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x68,0x77,0x63,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x68,0x77,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x6f,0x75,0x74,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2b,0x33,0x29,0x2f,0x34,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2b,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x2b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x2b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x2b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x34,0x68,0x77,0x34,0x29,0x20,0x74,0x6f,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x68,0x77,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2b,0x33,0x29,0x2f,0x34,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2b,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x34,0x68,0x77,0x34,0x29,0x20,0x74,0x6f,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x68,0x77,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x6f,0x75,0x74,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2b,0x33,0x29,0x2f,0x34,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2b,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x72,0x63,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x73,0x74,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0xa,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x73,0x72,0x63,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x20,0x2a,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x20,0x2a,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x78,0x20,0x2b,0x20,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x79,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x78,0x20,0x2b,0x20,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x79,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x73,0x72,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x64,0x73,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x69,0x6e,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x72,0x63,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x73,0x74,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0xa,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x73,0x72,0x63,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x20,0x2a,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x20,0x2a,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x78,0x20,0x2b,0x20,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x79,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x78,0x20,0x2b,0x20,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x79,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x73,0x72,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x64,0x73,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x6f,0x75,0x74,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x72,0x63,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x73,0x74,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0xa,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x73,0x72,0x63,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x20,0x2a,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x20,0x2a,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x78,0x20,0x2b,0x20,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x79,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x78,0x20,0x2b,0x20,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x79,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x73,0x72,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x73,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x64,0x73,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x69,0x6e,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x6f,0x75,0x74,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x72,0x63,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x73,0x74,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0xa,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x73,0x72,0x63,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x20,0x2a,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x20,0x2a,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x78,0x20,0x2b,0x20,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x79,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x78,0x20,0x2b,0x20,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x79,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x73,0x72,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x73,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x64,0x73,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x3a,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6f,0x69,0x68,0x77,0x29,0x20,0x74,0x6f,0x20,0x69,0x6d,0x61,0x67,0x65,0x28,0x6f,0x63,0x2f,0x34,0x20,0x68,0x20,0x77,0x20,0x2c,0x20,0x69,0x63,0x20,0x6f,0x63,0x34,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x69,0x63,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x68,0x20,0x77,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x2a,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2b,0x33,0x29,0x2f,0x34,0x29,0x2b,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x3a,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6f,0x69,0x68,0x77,0x29,0x20,0x74,0x6f,0x20,0x69,0x6d,0x61,0x67,0x65,0x28,0x6f,0x63,0x2f,0x34,0x20,0x68,0x20,0x77,0x20,0x2c,0x20,0x69,0x63,0x20,0x6f,0x63,0x34,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x69,0x6e,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x69,0x63,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x68,0x20,0x77,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x2a,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2b,0x33,0x29,0x2f,0x34,0x29,0x2b,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6d,0x69,0x68,0x77,0x29,0x20,0x74,0x6f,0x20,0x69,0x6d,0x61,0x67,0x65,0x28,0x69,0x63,0x2f,0x34,0x2c,0x20,0x69,0x63,0x34,0x20,0x68,0x20,0x77,0x20,0x6d,0x29,0xa,0x2f,0x2f,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,0x64,0x77,0x20,0x6f,0x6e,0x6c,0x79,0x20,0x73,0x75,0x70,0x70,0x6f,0x72,0x74,0x20,0x6d,0x20,0x3d,0x3d,0x20,0x31,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x64,0x77,0x5f,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x31,0x2c,0x20,0x43,0x6f,0x75,0x74,0x2c,0x20,0x66,0x68,0x2c,0x20,0x66,0x77,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x66,0x68,0x2a,0x66,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x43,0x6f,0x75,0x74,0x2c,0x20,0x34,0x29,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2c,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x70,0x75,0x74,0x20,0x5b,0x31,0x2c,0x20,0x43,0x6f,0x75,0x74,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x68,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x77,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x5b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x31,0x2c,0x20,0x66,0x77,0x2a,0x66,0x68,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x31,0x2c,0x20,0x43,0x6f,0x75,0x74,0x2f,0x34,0x5d,0x78,0x20,0x6f,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x20,0x30,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2a,0x28,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x33,0x29,0x2f,0x34,0x29,0x2b,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x64,0x77,0x5f,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x69,0x6e,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x31,0x2c,0x20,0x43,0x6f,0x75,0x74,0x2c,0x20,0x66,0x68,0x2c,0x20,0x66,0x77,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x66,0x68,0x2a,0x66,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x43,0x6f,0x75,0x74,0x2c,0x20,0x34,0x29,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2c,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x70,0x75,0x74,0x20,0x5b,0x31,0x2c,0x20,0x43,0x6f,0x75,0x74,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x68,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x77,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x5b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x31,0x2c,0x20,0x66,0x77,0x2a,0x66,0x68,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x31,0x2c,0x20,0x43,0x6f,0x75,0x74,0x2f,0x34,0x5d,0x78,0x20,0x6f,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x20,0x30,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2a,0x28,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x33,0x29,0x2f,0x34,0x29,0x2b,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x68,0x77,0x63,0x29,0x20,0x74,0x6f,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x34,0x68,0x77,0x34,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x68,0x77,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x5f,0x70,0x74,0x72,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2b,0x33,0x29,0x2f,0x34,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x68,0x77,0x63,0x29,0x20,0x74,0x6f,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x34,0x68,0x77,0x34,0x29,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x68,0x77,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x69,0x6e,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x5f,0x70,0x74,0x72,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2b,0x33,0x29,0x2f,0x34,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x68,0x77,0x29,0x20,0x74,0x6f,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x34,0x68,0x77,0x34,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x20,0x20,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x3d,0x20,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2b,0x33,0x29,0x2f,0x34,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x68,0x77,0x29,0x20,0x74,0x6f,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x34,0x68,0x77,0x34,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x69,0x6e,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x20,0x20,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x3d,0x20,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2b,0x33,0x29,0x2f,0x34,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x69,0x6e,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x5b,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x3b,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x6f,0x75,0x74,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x29,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x5b,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x3b,0xa,0x7d,0xa,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6f,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x28,0x62,0x20,0x68,0x2c,0x20,0x69,0x63,0x2f,0x34,0x20,0x77,0x20,0x69,0x63,0x34,0x29,0x20,0x74,0x6f,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x68,0x77,0x63,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x68,0x77,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2b,0x33,0x29,0x2f,0x34,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2b,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x2b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x2b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x2b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6f,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x28,0x62,0x20,0x68,0x2c,0x20,0x69,0x63,0x2f,0x34,0x20,0x77,0x20,0x69,0x63,0x34,0x29,0x20,0x74,0x6f,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x68,0x77,0x63,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x68,0x77,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x6f,0x75,0x74,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2b,0x33,0x29,0x2f,0x34,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2b,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x2b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x2b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x2b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x34,0x68,0x77,0x34,0x29,0x20,0x74,0x6f,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x68,0x77,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2b,0x33,0x29,0x2f,0x34,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2b,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x34,0x68,0x77,0x34,0x29,0x20,0x74,0x6f,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6e,0x63,0x68,0x77,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x6f,0x75,0x74,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x3d,0x20,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2b,0x33,0x29,0x2f,0x34,0x29,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x20,0x20,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2b,0x69,0x6e,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x72,0x63,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x73,0x74,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0xa,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x73,0x72,0x63,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x20,0x2a,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x20,0x2a,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x78,0x20,0x2b,0x20,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x79,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x78,0x20,0x2b,0x20,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x79,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x73,0x72,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x64,0x73,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x69,0x6e,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x72,0x63,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x73,0x74,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0xa,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x73,0x72,0x63,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x20,0x2a,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x20,0x2a,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x78,0x20,0x2b,0x20,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x79,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x78,0x20,0x2b,0x20,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x79,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x73,0x72,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x64,0x73,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x6f,0x75,0x74,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x72,0x63,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x73,0x74,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0xa,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x73,0x72,0x63,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x20,0x2a,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x20,0x2a,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x78,0x20,0x2b,0x20,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x79,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x78,0x20,0x2b,0x20,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x79,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x73,0x72,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x73,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x64,0x73,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x69,0x6e,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x6f,0x75,0x74,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x72,0x63,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x73,0x74,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0xa,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x73,0x72,0x63,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x20,0x2a,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x5f,0x73,0x74,0x72,0x69,0x64,0x65,0x20,0x2a,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x78,0x20,0x2b,0x20,0x73,0x72,0x63,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x79,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x78,0x20,0x2b,0x20,0x64,0x73,0x74,0x5f,0x62,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2e,0x79,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x73,0x72,0x63,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x73,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x64,0x73,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x3a,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6f,0x69,0x68,0x77,0x29,0x20,0x74,0x6f,0x20,0x69,0x6d,0x61,0x67,0x65,0x28,0x6f,0x63,0x2f,0x34,0x20,0x68,0x20,0x77,0x20,0x2c,0x20,0x69,0x63,0x20,0x6f,0x63,0x34,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x69,0x63,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x68,0x20,0x77,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x2a,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2b,0x33,0x29,0x2f,0x34,0x29,0x2b,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x3a,0x20,0x66,0x72,0x6f,0x6d,0x20,0x69,0x6e,0x74,0x38,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6f,0x69,0x68,0x77,0x29,0x20,0x74,0x6f,0x20,0x69,0x6e,0x74,0x38,0x20,0x69,0x6d,0x61,0x67,0x65,0x28,0x6f,0x63,0x2f,0x34,0x20,0x68,0x20,0x77,0x20,0x2c,0x20,0x69,0x63,0x20,0x6f,0x63,0x34,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x69,0x6e,0x74,0x38,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x69,0x63,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x68,0x20,0x77,0xa,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x2a,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2b,0x33,0x29,0x2f,0x34,0x29,0x2b,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x3a,0x20,0x66,0x72,0x6f,0x6d,0x20,0x69,0x6e,0x74,0x38,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6f,0x69,0x68,0x77,0x29,0x20,0x74,0x6f,0x20,0x69,0x6e,0x74,0x34,0x20,0x69,0x6d,0x61,0x67,0x65,0x28,0x6f,0x63,0x2f,0x34,0x20,0x68,0x20,0x77,0x20,0x2c,0x20,0x69,0x63,0x20,0x6f,0x63,0x34,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x69,0x6e,0x74,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x69,0x63,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x68,0x20,0x77,0xa,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x38,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x38,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x38,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x38,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x38,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x38,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x38,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x38,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x38,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x38,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x38,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0xa,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x34,0x20,0x3d,0x20,0x28,0x75,0x63,0x68,0x61,0x72,0x32,0x29,0x28,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x34,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x38,0x2e,0x78,0x20,0x2b,0x20,0x38,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x38,0x2e,0x79,0x20,0x2b,0x20,0x38,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x34,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x38,0x2e,0x7a,0x20,0x2b,0x20,0x38,0x29,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x38,0x2e,0x77,0x20,0x2b,0x20,0x38,0x29,0x3b,0xa,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x2a,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2b,0x33,0x29,0x2f,0x34,0x29,0x2b,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x32,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x5f,0x69,0x6e,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x3a,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6f,0x69,0x68,0x77,0x29,0x20,0x74,0x6f,0x20,0x69,0x6d,0x61,0x67,0x65,0x28,0x6f,0x63,0x2f,0x34,0x20,0x68,0x20,0x77,0x20,0x2c,0x20,0x69,0x63,0x20,0x6f,0x63,0x34,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x69,0x6e,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x69,0x63,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x68,0x20,0x77,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x69,0x63,0x5f,0x68,0x5f,0x77,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x2a,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2b,0x33,0x29,0x2f,0x34,0x29,0x2b,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0xa,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x66,0x72,0x6f,0x6d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x6d,0x69,0x68,0x77,0x29,0x20,0x74,0x6f,0x20,0x69,0x6d,0x61,0x67,0x65,0x28,0x69,0x63,0x2f,0x34,0x2c,0x20,0x69,0x63,0x34,0x20,0x68,0x20,0x77,0x20,0x6d,0x29,0xa,0x2f,0x2f,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,0x64,0x77,0x20,0x6f,0x6e,0x6c,0x79,0x20,0x73,0x75,0x70,0x70,0x6f,0x72,0x74,0x20,0x6d,0x20,0x3d,0x3d,0x20,0x31,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x64,0x77,0x5f,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x31,0x2c,0x20,0x43,0x6f,0x75,0x74,0x2c,0x20,0x66,0x68,0x2c,0x20,0x66,0x77,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x66,0x68,0x2a,0x66,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x43,0x6f,0x75,0x74,0x2c,0x20,0x34,0x29,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2c,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x70,0x75,0x74,0x20,0x5b,0x31,0x2c,0x20,0x43,0x6f,0x75,0x74,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x68,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x77,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x5b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x31,0x2c,0x20,0x66,0x77,0x2a,0x66,0x68,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x31,0x2c,0x20,0x43,0x6f,0x75,0x74,0x2f,0x34,0x5d,0x78,0x20,0x6f,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x20,0x30,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2a,0x28,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x33,0x29,0x2f,0x34,0x29,0x2b,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x64,0x77,0x5f,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x74,0x6f,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x69,0x6e,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0x2f,0x2f,0x5b,0x31,0x2c,0x20,0x43,0x6f,0x75,0x74,0x2c,0x20,0x66,0x68,0x2c,0x20,0x66,0x77,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x66,0x68,0x2a,0x66,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x43,0x6f,0x75,0x74,0x2c,0x20,0x34,0x29,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2c,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x70,0x75,0x74,0x20,0x5b,0x31,0x2c,0x20,0x43,0x6f,0x75,0x74,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x68,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x77,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x5b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x2c,0x20,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x34,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x77,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x79,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2e,0x78,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2a,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x31,0x2c,0x20,0x66,0x77,0x2a,0x66,0x68,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x31,0x2c,0x20,0x43,0x6f,0x75,0x74,0x2f,0x34,0x5d,0x78,0x20,0x6f,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x20,0x30,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x2a,0x28,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x33,0x29,0x2f,0x34,0x29,0x2b,0x69,0x6d,0x61,0x67,0x65,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa, } }, #endif { diff --git a/source/backend/opencl/execution/cl/range.cl b/source/backend/opencl/execution/cl/range.cl new file mode 100644 index 000000000..28a9d8ff5 --- /dev/null +++ b/source/backend/opencl/execution/cl/range.cl @@ -0,0 +1,42 @@ +#ifdef MNN_SUPPORT_FP16 +#pragma OPENCL EXTENSION cl_khr_fp16 : enable +#endif + +#define GLOBAL_SIZE_3_DIMS \ +__private const int global_size_dim0, __private const int global_size_dim1, __private const int global_size_dim2, + +#define DEAL_NON_UNIFORM_DIM3(input1, input2, input3) \ + if (input1 >= global_size_dim0 || input2 >= global_size_dim1 || input3 >= global_size_dim2) { \ + return; \ + } +__constant sampler_t SAMPLER = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST; + +__kernel void range(GLOBAL_SIZE_3_DIMS + __read_only image2d_t input0, + __read_only image2d_t input2, + __write_only image2d_t output, + __private const int width, + __private const int height, + __private const int channel, + __private const int channelBlock + ) { + const int width_idx = get_global_id(0); + const int height_idx = get_global_id(1); + const int batch_channel_idx = get_global_id(2); + + DEAL_NON_UNIFORM_DIM3(width_idx, height_idx, batch_channel_idx); + + const int batch_idx = batch_channel_idx / channelBlock; + const int channel_idx = batch_channel_idx % channelBlock; + + const int bh = batch_idx * height + height_idx; + const int cw = channel_idx * width + width_idx; + const int channel4 = channel_idx << 2; + int index = (((batch_idx * channel) + channel4) * height + height_idx) * width + width_idx; + int size = height * width; + int4 index4 = (int4)(index, index + size, index + size * 2, index + size * 3); + FLOAT start = RI_F(input0, SAMPLER, (int2)(0, 0)).x; + FLOAT step = RI_F(input2, SAMPLER, (int2)(0, 0)).x; + FLOAT4 value = (FLOAT4)start + CONVERT_FLOAT4(index4) * (FLOAT4)step; + WI_F(output, (int2)(cw, bh), value); +} diff --git a/source/backend/opencl/execution/cl/select.cl b/source/backend/opencl/execution/cl/select.cl new file mode 100644 index 000000000..4b3e60511 --- /dev/null +++ b/source/backend/opencl/execution/cl/select.cl @@ -0,0 +1,40 @@ +#ifdef MNN_SUPPORT_FP16 +#pragma OPENCL EXTENSION cl_khr_fp16 : enable +#endif + +#define GLOBAL_SIZE_2_DIMS \ +__private const int global_size_dim0, __private const int global_size_dim1, + +#define DEAL_NON_UNIFORM_DIM2(input1, input2) \ + if (input1 >= global_size_dim0 || input2 >= global_size_dim1) { \ + return; \ + } + +__constant sampler_t SAMPLER = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST; +__kernel void select_img(GLOBAL_SIZE_2_DIMS + __read_only image2d_t input, + __read_only image2d_t input0, + __read_only image2d_t input1, + __write_only image2d_t output + ) { + const int idx = get_global_id(0); + const int idy = get_global_id(1); + + DEAL_NON_UNIFORM_DIM2(idx, idy); + int4 select_vec = convert_int4(RI_F(input, SAMPLER, (int2)(idx, idy))); +#ifdef INSIZE1_EUQAL_1 + FLOAT4 in0 = RI_F(input0, SAMPLER, (int2)(0, 0)); + in0 = (FLOAT4)(in0.x); +#else + FLOAT4 in0 = RI_F(input0, SAMPLER, (int2)(idx, idy)); +#endif + +#ifdef INSIZE2_EUQAL_1 + FLOAT4 in1 = RI_F(input1, SAMPLER, (int2)(0, 0)); + in1 = (FLOAT4)(in1.x); +#else + FLOAT4 in1 = RI_F(input1, SAMPLER, (int2)(idx, idy)); +#endif + FLOAT4 out = select(in1, in0, select_vec == (int4)1); + WI_F(output, (int2)(idx, idy), out); +} diff --git a/source/backend/opencl/execution/image/CastExecution.cpp b/source/backend/opencl/execution/image/CastExecution.cpp new file mode 100644 index 000000000..ad5a63ee0 --- /dev/null +++ b/source/backend/opencl/execution/image/CastExecution.cpp @@ -0,0 +1,158 @@ +// +// CastExecution.cpp +// MNN +// +// Created by MNN on 2023/12/1. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#include "backend/opencl/execution/image/CastExecution.hpp" +#include "core/Macro.h" +#include "core/TensorUtils.hpp" +#include "backend/opencl/core/OpenCLBackend.hpp" + +namespace MNN { +namespace OpenCL { + +CastExecution::CastExecution(const std::string& compute, Backend* backend) : Execution(backend) { + mBuildOptions.emplace(compute); +} +ErrorCode CastExecution::onResize(const std::vector& inputs, const std::vector& outputs) { + Tensor* input = inputs[0]; + Tensor* output = outputs[0]; + auto openCLBackend = static_cast(backend()); + auto runtime = openCLBackend->getOpenCLRuntime(); + openCLBackend->startRecord(mRecording); + mKernel = runtime->buildKernel("cast", "cast", mBuildOptions); + mMaxWorkGroupSize = static_cast(runtime->getMaxWorkGroupSize(mKernel)); + + std::vector inputShape = tensorShapeFormat(input); + std::vector outputShape = tensorShapeFormat(output); + + int batch = outputShape.at(0); + int outputHeight = outputShape.at(1); + int outputWidth = outputShape.at(2); + int channels = outputShape.at(3); + + int channelBlocks = (channels + 3) / 4; + + mGlobalWorkSize = { + static_cast(outputWidth), + static_cast(outputHeight), + static_cast(batch * channelBlocks), + }; + + uint32_t idx = 0; + cl_int ret = CL_SUCCESS; + ret |= mKernel.setArg(idx++, mGlobalWorkSize[0]); + ret |= mKernel.setArg(idx++, mGlobalWorkSize[1]); + ret |= mKernel.setArg(idx++, mGlobalWorkSize[2]); + ret |= mKernel.setArg(idx++, openCLImage(input)); + ret |= mKernel.setArg(idx++, openCLImage(output)); + ret |= mKernel.setArg(idx++, outputWidth); + ret |= mKernel.setArg(idx++, outputHeight); + ret |= mKernel.setArg(idx++, channelBlocks); + MNN_CHECK_CL_SUCCESS(ret, "setArg CastExecution"); + + std::string kernelName = "cast"; + mLocalSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, openCLBackend->getOpenCLRuntime(), kernelName, mKernel).first; + openCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalSize); + openCLBackend->endRecord(mRecording); + return NO_ERROR; +} + +ErrorCode CastExecution::onExecute(const std::vector& inputs, const std::vector& outputs) { +#ifdef LOG_VERBOSE + MNN_PRINT("start CastExecution onExecute..."); +#endif + auto mOpenCLBackend = static_cast(backend()); + +#ifdef ENABLE_OPENCL_TIME_PROFILER + cl::Event event; + run3DKernelDefault(mKernel, mGlobalWorkSize, mLocalSize, + mOpenCLBackend->getOpenCLRuntime(), &event); + + mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Cast", event}); +#else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End CastExecution onExecute... \n"); +#endif + return NO_ERROR; + } + run3DKernelDefault(mKernel, mGlobalWorkSize, mLocalSize, + mOpenCLBackend->getOpenCLRuntime()); +#endif + +#ifdef LOG_VERBOSE + MNN_PRINT("end CastExecution onExecute..."); +#endif + return NO_ERROR; +} + +static DataType _mapDataType(DataType src) { + if (DataType_DT_BOOL == src) { + return DataType_DT_INT32; + } + if (DataType_DT_INT64 == src) { + return DataType_DT_INT32; + } + if (DataType_DT_DOUBLE == src) { + return DataType_DT_FLOAT; + } + return src; +} + +class CastCreator : public OpenCLBackend::Creator { +public: + virtual Execution* onCreate(const std::vector& inputs, const std::vector& outputs, + const MNN::Op* op, Backend* backend) const override { + auto cast = op->main_as_CastParam(); + // cast param srcT is invalid + // auto srcT = _mapDataType(cast->srcT()); + auto dstT = _mapDataType(cast->dstT()); + + const auto &inputDataType = inputs[0]->getType(); + if (inputDataType.bytes() == 4 && cast->dstT() == MNN::DataType_DT_BOOL) { + return new CastExecution("-DTO_BOOL", backend); + } + if (inputs[0]->buffer().type == outputs[0]->buffer().type) { + return new CastExecution("", backend); + } + if (dstT == MNN::DataType_DT_INT32 && halide_type_of() == inputDataType) { + return new CastExecution("", backend); + } + if (dstT == MNN::DataType_DT_FLOAT && halide_type_of() == inputDataType) { + return new CastExecution("", backend); + } + if (dstT == MNN::DataType_DT_FLOAT && halide_type_of() == inputDataType) { + return new CastExecution("", backend); + } + if (dstT == MNN::DataType_DT_FLOAT && halide_type_of() == inputDataType) { + return new CastExecution("", backend); + } + if (dstT == MNN::DataType_DT_INT8 && halide_type_of() == inputDataType) { + return new CastExecution("", backend); + } + if (dstT == MNN::DataType_DT_UINT8 && halide_type_of() == inputDataType) { + return new CastExecution("", backend); + } + if (dstT == MNN::DataType_DT_UINT8 && halide_type_of() == inputDataType) { + return new CastExecution("", backend); + } + if (dstT == MNN::DataType_DT_INT32 && halide_type_of() == inputDataType) { + return new CastExecution("", backend); + } + if (dstT == MNN::DataType_DT_INT32 && halide_type_of() == inputDataType) { + return new CastExecution("", backend); + } + MNN_PRINT("Don't support cast form %d, %d to %d\n", inputDataType.code, inputDataType.bits, cast->dstT()); + return nullptr; + } +}; + +REGISTER_OPENCL_OP_CREATOR(CastCreator, OpType_Cast, IMAGE); +} // namespace OpenCL +} // namespace MNN diff --git a/source/backend/opencl/execution/image/CastExecution.hpp b/source/backend/opencl/execution/image/CastExecution.hpp new file mode 100644 index 000000000..67567f287 --- /dev/null +++ b/source/backend/opencl/execution/image/CastExecution.hpp @@ -0,0 +1,41 @@ +// +// CastBufExecution.hpp +// MNN +// +// Created by MNN on 2023/12/1. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#ifndef CastExecution_hpp +#define CastExecution_hpp + +#include "core/Execution.hpp" + +#include +#include "MNN_generated.h" +#include "backend/opencl/core/OpenCLBackend.hpp" +#include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" + +namespace MNN { +namespace OpenCL { + +class CastExecution : public Execution, public CommonExtension { +public: + CastExecution(const std::string &compute, Backend *backend); + virtual ~CastExecution() = default; + + virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; + virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + +private: + cl::Kernel mKernel; + uint32_t mMaxWorkGroupSize; + std::vector mGlobalWorkSize = {1, 1, 1}; + std::vector mLocalSize = {1, 1, 1}; + std::set mBuildOptions; +}; + +} // namespace OpenCL +} // namespace MNN +#endif /* CastExecution_hpp */ diff --git a/source/backend/opencl/execution/image/CommonExecution.cpp b/source/backend/opencl/execution/image/CommonExecution.cpp index 04f425dc5..1bcb08c58 100644 --- a/source/backend/opencl/execution/image/CommonExecution.cpp +++ b/source/backend/opencl/execution/image/CommonExecution.cpp @@ -15,13 +15,14 @@ CommonExecution::CommonExecution(Backend *backend, const MNN::Op *Op) mOpType = Op->type(); } ErrorCode CommonExecution::onExecute(const std::vector &inputs, const std::vector &outputs) { - auto runtime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); + auto openCLBackend = static_cast(backend()); + auto runtime = openCLBackend->getOpenCLRuntime(); #ifdef ENABLE_OPENCL_TIME_PROFILER int idx = 0; #else - if(runtime->isUseRecordQueue()){ - if(runtime->isDevideOpRecord()) - runtime->getRecordings()->emplace_back(mRecording); + if(openCLBackend->isUseRecordQueue()){ + if(openCLBackend->isDevideOpRecord()) + openCLBackend->addRecord(mRecording); return NO_ERROR; } #endif diff --git a/source/backend/opencl/execution/image/ConvExecution.cpp b/source/backend/opencl/execution/image/ConvExecution.cpp index dc86fa8ff..0691c8496 100644 --- a/source/backend/opencl/execution/image/ConvExecution.cpp +++ b/source/backend/opencl/execution/image/ConvExecution.cpp @@ -13,6 +13,7 @@ #include "core/TensorUtils.hpp" #include "backend/opencl/core/OpenCLBackend.hpp" #include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "ConvLowMemoryExecution.hpp" #define UNIT 4 namespace MNN { @@ -32,7 +33,7 @@ ConvCommonExecution::ConvCommonExecution(const Convolution2D *conv2dParams, Back cl::Buffer biasBuffer(openclBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size); cl_int error; auto biasPtrCL = openclBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer( - biasBuffer, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); + biasBuffer, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); if(biasPtrCL != nullptr && error == CL_SUCCESS){ if(openclBackend->getOpenCLRuntime()->isWeightCpuTransHalf()){ for(int i=0; igetOpenCLRuntime(), biasBuffer, openCLImage(mBias.get()), UP_DIV(biasSize, 4), 1); } ConvCommonExecution::~ConvCommonExecution() { - MNN_ASSERT(nullptr != mBias); - backend()->onReleaseBuffer(mBias.get(), Backend::STATIC); + if (mBias) { + backend()->onReleaseBuffer(mBias.get(), Backend::STATIC); + } } ConvExecution::ConvExecution(const std::vector &inputs, const std::vector &outputs, const MNN::Op *op, Backend *backend) - : ConvCommonExecution(op->main_as_Convolution2D(), backend) { +: ConvCommonExecution(op->main_as_Convolution2D(), backend) { #ifdef LOG_VERBOSE MNN_PRINT("Start ConvExecution init !\n"); #endif @@ -69,11 +71,11 @@ ConvExecution::ConvExecution(const std::vector &inputs, const std::vec mConv2dCommonParams = conv2dCommonParams; mStrides = {conv2dCommonParams->strideY(), conv2dCommonParams->strideX()}; mDilations = {conv2dCommonParams->dilateY(), conv2dCommonParams->dilateX()}; - + auto pad = ConvolutionCommon::convolutionPad(inputs[0], outputs[0], mConv2dCommonParams); mPaddings[0] = pad.second; mPaddings[1] = pad.first; - + int kernelWidth = conv2dCommonParams->kernelX(); int kernelHeight = conv2dCommonParams->kernelY(); int outputChannel = conv2dCommonParams->outputCount(); @@ -81,10 +83,10 @@ ConvExecution::ConvExecution(const std::vector &inputs, const std::vec #ifndef MNN_OPENCL_BUFFER_CLOSED mWeightUseBuffer = gpuType == GpuType::MALI; #endif - + int weightSize = 0; const float *filterDataPtr = nullptr; - + std::shared_ptr quanCommon; if (nullptr != conv2dParams->quanParameter()) { quanCommon = ConvolutionCommon::load(conv2dParams, backend, true); @@ -100,14 +102,14 @@ ConvExecution::ConvExecution(const std::vector &inputs, const std::vec } else if (nullptr == conv2dParams->weight() || nullptr == conv2dParams->bias()) { MNN_ERROR("%s has no weight or bias. The model may be benchmark model, please revert the weight/bias firstly\n", op->name()->c_str()); } - + if (nullptr == filterDataPtr) { weightSize = conv2dParams->weight()->size(); filterDataPtr = conv2dParams->weight()->data(); } int inputChannel = weightSize / (kernelWidth * kernelHeight * outputChannel); - - + + //select opt conv method std::string kernelName = "conv_2d_c4h1w4"; if (kernelHeight == kernelWidth && kernelHeight == 1 && mPaddings[0] == 0 && @@ -132,7 +134,7 @@ ConvExecution::ConvExecution(const std::vector &inputs, const std::vec } } } - + if(mConv1x1Opt && !mUseLocalMem){ cl_int error; std::shared_ptr filterBuffer(Tensor::createDevice({UP_DIV(outputChannel, 4)*4, UP_DIV(inputChannel, 4)*4, kernelWidth, kernelHeight})); @@ -163,7 +165,7 @@ ConvExecution::ConvExecution(const std::vector &inputs, const std::vec MNN_ERROR("Map error ptrCL == nullptr \n"); } mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(*(mKernelBuffer.get()), kernelBufferPtr); - + //bias int biasSize = conv2dParams->bias()->size(); const float *biasDataPtr = conv2dParams->bias()->data(); @@ -177,7 +179,7 @@ ConvExecution::ConvExecution(const std::vector &inputs, const std::vec mBiasBuffer.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size)); auto biasPtrCL = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer( - *(mBiasBuffer.get()), true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); + *(mBiasBuffer.get()), true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); if(biasPtrCL != nullptr && error == CL_SUCCESS){ if(mOpenCLBackend->getOpenCLRuntime()->isSupportedFP16()){ for (int i = 0; i < biasSize; i++) @@ -195,7 +197,7 @@ ConvExecution::ConvExecution(const std::vector &inputs, const std::vec MNN_ERROR("Map error biasPtrCL == nullptr \n"); } mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(*(mBiasBuffer.get()), biasPtrCL); - + }else if(kernelHeight == kernelWidth && kernelHeight == 1 && mPaddings[0] == 0 && mPaddings[1] == 0 && mWeightUseBuffer){ cl_int error; std::shared_ptr filterBuffer(Tensor::createDevice({UP_DIV(outputChannel, 4), ROUND_UP(inputChannel, 4), 4})); @@ -229,7 +231,7 @@ ConvExecution::ConvExecution(const std::vector &inputs, const std::vec }else{ std::vector filterImageShape{(int)inputChannel, (int)(UP_DIV(outputChannel, 4) * kernelWidth * kernelHeight)}; std::shared_ptr filterBuffer( - Tensor::createDevice({outputChannel, inputChannel, kernelWidth, kernelHeight})); + Tensor::createDevice({outputChannel, inputChannel, kernelWidth, kernelHeight})); int buffer_size = filterBuffer->elementSize(); if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()) { @@ -239,7 +241,7 @@ ConvExecution::ConvExecution(const std::vector &inputs, const std::vec } cl::Buffer filterBufferCL(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size); filterBuffer->buffer().device = (uint64_t)(&filterBufferCL); - + cl_int error; auto ptrCL = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(filterBufferCL, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); if(ptrCL != nullptr && error == CL_SUCCESS) { @@ -287,7 +289,7 @@ ConvExecution::ConvExecution(const std::vector &inputs, const std::vec imageBufferConvertor.convertBufferToImage(filterBuffer.get(), MNN::OpenCL::CONV2D_FILTER, mFilter.get(), false, buildOption); } } - + // Create Kernel if (mStrides[0] == 1 && mStrides[1] == 1 && mDilations[0] == 1 && mDilations[1] == 1) { mBuildOptions.emplace("-DMNN_CONV_S1D1"); @@ -301,11 +303,11 @@ ConvExecution::ConvExecution(const std::vector &inputs, const std::vec if(mWeightUseBuffer){ mBuildOptions.emplace("-DUSE_BUFFER"); } - - + + mKernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("conv_2d", kernelName, mBuildOptions); mMaxWorkGroupSize = static_cast(mOpenCLBackend->getOpenCLRuntime()->getMaxWorkGroupSize(mKernel)); - + #ifdef LOG_VERBOSE MNN_PRINT("end ConvExecution init !\n"); #endif @@ -321,19 +323,19 @@ ErrorCode ConvExecution::onResize(const std::vector &inputs, const std #ifdef LOG_VERBOSE MNN_PRINT("Start ConvExecution onResize !\n"); #endif - startRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->startRecord(mRecording); auto input = inputs[0]; auto output = outputs[0]; - + std::vector inputShape = tensorShapeFormat(input); std::vector outputShape = tensorShapeFormat(output); const int height = outputShape.at(1); const int width = outputShape.at(2); - + const int inputHeight = inputShape.at(1); const int inputWidth = inputShape.at(2); const int inputChannels = inputShape.at(3); - + const int inputChannelBlocks = UP_DIV(inputChannels, 4); int kernelHeight = mConv2dCommonParams->kernelY(); int kernelWidth = mConv2dCommonParams->kernelX(); @@ -345,13 +347,13 @@ ErrorCode ConvExecution::onResize(const std::vector &inputs, const std std::string info = std::to_string(inputChannels) + "_" + std::to_string(kernelHeight) + "_" + std::to_string(kernelWidth) + "_" + std::to_string(mStrides[0]) + "_" + std::to_string(mStrides[1]) + "_" + std::to_string(mDilations[0]) + "_" + std::to_string(mDilations[1]); if (kernelHeight == kernelWidth && kernelHeight == 1 && mPaddings[0] == 0 && mPaddings[1] == 0) { if(mConv1x1Opt){ - + auto kernel = &mKernel; uint32_t idx = 0; - + if(mUseLocalMem){ mGlobalWorkSize = {static_cast(UP_DIV(outputShape.at(3), 4)), static_cast(UP_DIV(outputShape.at(2), 4)), - static_cast(outputShape.at(0) * outputShape.at(1))}; + static_cast(outputShape.at(0) * outputShape.at(1))}; std::vector lws{UNIT, UNIT, 1}; mLocalWorkSize = lws; kernel->setArg(idx++, mGlobalWorkSize[0]); @@ -364,10 +366,10 @@ ErrorCode ConvExecution::onResize(const std::vector &inputs, const std kernel->setArg(idx++, static_cast(inputChannelBlocks)); kernel->setArg(idx++, height); kernel->setArg(idx++, width); - recordKernel3d(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); + mOpenCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalWorkSize); }else{ mGlobalWorkSize = {static_cast(UP_DIV(outputShape.at(3), 4) * UP_DIV(outputShape.at(2), 4)), - static_cast(outputShape.at(0) * outputShape.at(1))}; + static_cast(outputShape.at(0) * outputShape.at(1))}; kernel->setArg(idx++, mGlobalWorkSize[0]); kernel->setArg(idx++, mGlobalWorkSize[1]); kernel->setArg(idx++, UP_DIV(width, 4)); @@ -381,10 +383,10 @@ ErrorCode ConvExecution::onResize(const std::vector &inputs, const std std::string kernelName = "conv_2d_1x1_mali"; mLocalWorkSize = localWS2DDefault(mGlobalWorkSize, mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), kernelName, mKernel).first; - recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); + mOpenCLBackend->recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize); } - - + + }else{ int inputImageShape[2] = {inputHeight, inputWidth}; int outputImageShape[2] = {height, width}; @@ -396,7 +398,7 @@ ErrorCode ConvExecution::onResize(const std::vector &inputs, const std int itemW[total_kernel] = {4, 4}; int actual_kernel = total_kernel; - + cl::Kernel kernel[total_kernel]; std::vector globalWorkSize[total_kernel]; std::vector localWorkSize[total_kernel]; @@ -439,7 +441,7 @@ ErrorCode ConvExecution::onResize(const std::vector &inputs, const std //printf("min_index = %d %d\n", min_index, min_cost.first); mGlobalWorkSize = {globalWorkSize[min_index][0], globalWorkSize[min_index][1]}; mKernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("conv_2d", kernelName[min_index], mBuildOptions); - + uint32_t idx = 0; mKernel.setArg(idx++, mGlobalWorkSize[0]); mKernel.setArg(idx++, mGlobalWorkSize[1]); @@ -457,7 +459,7 @@ ErrorCode ConvExecution::onResize(const std::vector &inputs, const std mKernel.setArg(idx++, sizeof(stideShape), stideShape); mKernel.setArg(idx++, UP_DIV(width, 4)); mKernel.setArg(idx++, UP_DIV(outputShape.at(3), 4)); - recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); + mOpenCLBackend->recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize); } }else { int inputImageShape[2] = {inputHeight, inputWidth}; @@ -466,16 +468,16 @@ ErrorCode ConvExecution::onResize(const std::vector &inputs, const std int strideShape[2] = {mStrides[0], mStrides[1]}; int paddingShape[2] = {mPaddings[0], mPaddings[1]}; int dilationShape[2] = {mDilations[0], mDilations[1]}; - + const int total_kernel = 3; std::string kernelName[total_kernel] = {"conv_2d_c4h1w4", "conv_2d_c4h4w1", "conv_2d_c8h4w1" }; int itemC[total_kernel] = {4, 4, 8}; int itemH[total_kernel] = {1, 4, 4}; int itemW[total_kernel] = {4, 1, 1}; - - + + int actual_kernel = total_kernel; - + cl::Kernel kernel[total_kernel]; std::vector globalWorkSize[total_kernel]; std::vector localWorkSize[total_kernel]; @@ -484,7 +486,7 @@ ErrorCode ConvExecution::onResize(const std::vector &inputs, const std for(int knl_idx = 0; knl_idx < total_kernel; knl_idx++) { kernel[knl_idx] = mOpenCLBackend->getOpenCLRuntime()->buildKernel("conv_2d", kernelName[knl_idx], mBuildOptions); uint32_t maxWorkGroupSize = static_cast(mOpenCLBackend->getOpenCLRuntime()->getMaxWorkGroupSize(kernel[knl_idx])); - + globalWorkSize[knl_idx] = {static_cast(UP_DIV(outputShape.at(3), itemC[knl_idx]) * UP_DIV(outputShape.at(2), itemW[knl_idx])), static_cast(outputShape.at(0) * UP_DIV(outputShape.at(1), itemH[knl_idx]))}; uint32_t idx = 0; cl_int ret = CL_SUCCESS; @@ -509,7 +511,7 @@ ErrorCode ConvExecution::onResize(const std::vector &inputs, const std ret |= kernel[knl_idx].setArg(idx++, UP_DIV(outputShape.at(3), 4)); ret |= kernel[knl_idx].setArg(idx++, UP_DIV(height, itemH[knl_idx])); MNN_CHECK_CL_SUCCESS(ret, "setArg ConvExecution Kernel Select"); - + std::pair, uint32_t> retTune; retTune = localWS2DDefault(globalWorkSize[knl_idx], mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), kernelName[knl_idx] + info, kernel[knl_idx]); @@ -522,7 +524,7 @@ ErrorCode ConvExecution::onResize(const std::vector &inputs, const std int min_index = min_cost.second; mGlobalWorkSize = {globalWorkSize[min_index][0], globalWorkSize[min_index][1]}; mKernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("conv_2d", kernelName[min_index], mBuildOptions); - + uint32_t idx = 0; cl_int ret = CL_SUCCESS; ret |= mKernel.setArg(idx++, mGlobalWorkSize[0]); @@ -546,10 +548,10 @@ ErrorCode ConvExecution::onResize(const std::vector &inputs, const std ret |= mKernel.setArg(idx++, UP_DIV(outputShape.at(3), 4)); ret |= mKernel.setArg(idx++, UP_DIV(height, itemH[min_index])); MNN_CHECK_CL_SUCCESS(ret, "setArg ConvExecution"); - recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); + mOpenCLBackend->recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize); } - endRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->endRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("end ConvExecution onResize !\n"); #endif @@ -560,25 +562,29 @@ ErrorCode ConvExecution::onExecute(const std::vector &inputs, const st #ifdef LOG_VERBOSE MNN_PRINT("Start ConvExecution onExecute !\n"); #endif + +#ifndef ENABLE_OPENCL_TIME_PROFILER + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE +MNN_PRINT("end ConvExecution onExecute !\n"); +#endif + return NO_ERROR; + } +#endif + if(mUseLocalMem){ - #ifdef ENABLE_OPENCL_TIME_PROFILER +#ifdef ENABLE_OPENCL_TIME_PROFILER cl::Event event; run3DKernelDefault(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime(), &event); mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Conv UseLocalMem", event}); #else - if(mOpenCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); -#ifdef LOG_VERBOSE - MNN_PRINT("end ConvExecution onExecute !\n"); -#endif - return NO_ERROR; - } run3DKernelDefault(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); - #endif +#endif } #ifdef ENABLE_OPENCL_TIME_PROFILER @@ -588,14 +594,6 @@ ErrorCode ConvExecution::onExecute(const std::vector &inputs, const st mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Conv2D", event}); #else - if(mOpenCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); -#ifdef LOG_VERBOSE - MNN_PRINT("end ConvExecution onExecute !\n"); -#endif - return NO_ERROR; - } runKernel2D(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); #endif @@ -611,6 +609,25 @@ class ConvolutionCreator : public OpenCLBackend::Creator { virtual ~ConvolutionCreator() = default; virtual Execution *onCreate(const std::vector &inputs, const std::vector &outputs, const MNN::Op *op, Backend *backend) const override { + auto conv2D = op->main_as_Convolution2D(); + std::vector inputShape = tensorShapeFormat(inputs[0]); + const int inputChannels = inputShape.at(3); +#ifdef MNN_LOW_MEMORY + { + auto conv2dParams = op->main_as_Convolution2D(); + if ((static_cast(backend)->getMemory() == BackendConfig::Memory_Low) && (conv2dParams->quanParameter() != nullptr)) { + if (((conv2dParams->quanParameter()->type() == 4) || + (conv2dParams->quanParameter()->type() == 1) || + (conv2dParams->quanParameter()->type() == 2))) { + // Todo: support int4 inputchannel % 4 not equal 4 + return new ConvLowMemoryExecution(inputs, outputs, op, backend); + } else { + MNN_ERROR("OpenCL Conv buf low memory init error. For Opencl Backend, only support low memory mode of int8 or int4 dequantization currently.\n"); + MNN_ASSERT(false); + } + } + } +#endif if(op->main_as_Convolution2D()->common()->group() > 1){ // Don't support group > 1 now return nullptr; @@ -628,19 +645,17 @@ class ConvolutionCreator : public OpenCLBackend::Creator { } } } - - auto conv2D = op->main_as_Convolution2D(); int maxWidth = static_cast(backend)->getOpenCLRuntime()->getMaxImage2DSize()[0]; int maxHeight = static_cast(backend)->getOpenCLRuntime()->getMaxImage2DSize()[1]; if (ConvWinograd::valid(conv2D->common(), inputs[0], outputs[0], maxWidth, maxHeight)) { return new ConvWinograd(conv2D, backend); } - + return new ConvExecution(inputs, outputs, op, backend); } }; -OpenCLCreatorRegister __conv_op(OpType_Convolution, IMAGE); +REGISTER_OPENCL_OP_CREATOR(ConvolutionCreator, OpType_Convolution, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/ConvExecution.hpp b/source/backend/opencl/execution/image/ConvExecution.hpp index bfd16e94d..91696fb04 100644 --- a/source/backend/opencl/execution/image/ConvExecution.hpp +++ b/source/backend/opencl/execution/image/ConvExecution.hpp @@ -24,10 +24,14 @@ namespace OpenCL { class ConvCommonExecution : public Execution, public CommonExtension { public: ConvCommonExecution(const Convolution2D *op, Backend *backend); + ConvCommonExecution(Backend *backend) : Execution(backend){ + mOpenCLBackend = static_cast(backend); + } virtual ~ConvCommonExecution(); protected: std::shared_ptr mBias; + OpenCLBackend *mOpenCLBackend; }; class ConvExecution : public ConvCommonExecution { @@ -51,7 +55,6 @@ class ConvExecution : public ConvCommonExecution { cl::Kernel mKernel; uint32_t mMaxWorkGroupSize; bool mIsTurn = false; - OpenCLBackend *mOpenCLBackend; bool mConv1x1Opt{false}; bool mUseLocalMem{false}; std::shared_ptr mKernelBuffer; diff --git a/source/backend/opencl/execution/image/ConvLowMemoryExecution.cpp b/source/backend/opencl/execution/image/ConvLowMemoryExecution.cpp new file mode 100644 index 000000000..887e54323 --- /dev/null +++ b/source/backend/opencl/execution/image/ConvLowMemoryExecution.cpp @@ -0,0 +1,615 @@ +// ConvLowMemoryExecution.cpp +// +// Created by MNN on 2023/12/1. +// Copyright © 2018, Alibaba Group Holding Limited +// +#ifdef MNN_LOW_MEMORY +#include "ConvLowMemoryExecution.hpp" +// #define LOG_VERBOSE +namespace MNN { +namespace OpenCL { + +// set mDequantScale mDequantOffset mNumQuantBit mFilterDataPtr from mConv2dParams +void ConvLowMemoryExecution::getInfoFromOpLowMemory(std::shared_ptr & quanCommon) { + quanCommon = ConvolutionCommon::load(mConv2dParams, this->backend(), false, true); + if ((mOpenCLBackend->getMemory() == BackendConfig::Memory_Low) && (mConv2dParams->quanParameter() != nullptr)) { + mLowMemoryFlag = true; + } else { + MNN_ERROR("Conv buf low memory init error.\n"); + MNN_ASSERT(false); + } + // set mNumQuantBit + if (quanCommon->quan->type() == 4) { + mNumQuantBit = 8; + } else if (quanCommon->quan->type() == 1 || quanCommon->quan->type() == 2) { + mNumQuantBit = 4; + } else {/* More types to be supported. */} + // src of alpha in CPU + float * dequantAlpha = quanCommon->alpha.get(); + int numAlpha = mOutputChannel; + // set mDequantScale mDequantOffset + int numAlphaPack = ROUND_UP(numAlpha, 16); + int numBiasPack = ROUND_UP(mOutputChannel, 16); + int bytes = mOpenCLBackend->fpBytes(); + mResource->biasBuffer.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, ROUND_UP(mOutputChannel, 16) * bytes)); + mResource->dequantScaleBuffer.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, numAlphaPack * bytes)); + mResource->dequantOffsetBuffer.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, numAlphaPack * bytes)); + // transfer data from src in cpu to dst in gpu + cl_int resBias, resScale, resOffset; + auto biasPtrCL = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(*(mResource->biasBuffer.get()), true, CL_MAP_WRITE, 0, numBiasPack * bytes, nullptr, nullptr, &resBias); + void * dequantScaleBufferMap = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(*(mResource->dequantScaleBuffer.get()), true, CL_MAP_WRITE, 0, numAlphaPack * bytes, nullptr, nullptr, &resScale); + void * dequantOffsetBufferMap = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(*(mResource->dequantOffsetBuffer.get()), true, CL_MAP_WRITE, 0, numAlphaPack * bytes, nullptr, nullptr, &resOffset); + + if (biasPtrCL != nullptr && resBias == CL_SUCCESS) { + ::memset(biasPtrCL, 0, numBiasPack * bytes); + if (nullptr != mConv2dParams->bias()) { + const float *biasDataPtr = mConv2dParams->bias()->data(); + if (bytes == 2){ + for(int i = 0; i < mOutputChannel; i++) { + ((half_float::half*)biasPtrCL)[i] = (half_float::half)(biasDataPtr[i]); + } + } else { + ::memcpy(biasPtrCL, biasDataPtr, mOutputChannel * sizeof(float)); + } + } + } + ::memset(dequantScaleBufferMap, -1, numAlphaPack * bytes); + ::memset(dequantOffsetBufferMap, 0, numAlphaPack * bytes); + if (dequantScaleBufferMap != nullptr && dequantOffsetBufferMap != nullptr && resScale == CL_SUCCESS && resOffset == CL_SUCCESS) { + if (bytes == 2) { + if (quanCommon->asymmetric) { + for (int i = 0; i < numAlpha; ++i) { + ((half_float::half *)dequantOffsetBufferMap)[i] = (half_float::half)dequantAlpha[2 * i]; + ((half_float::half *)dequantScaleBufferMap)[i] = (half_float::half)dequantAlpha[2 * i + 1]; + } + } else { + for (int i = 0; i < numAlpha; ++i) { + ((half_float::half *)dequantScaleBufferMap)[i] = (half_float::half)dequantAlpha[i]; + ((half_float::half *)dequantOffsetBufferMap)[i] = 0.0f; + } + } + } else { + if (quanCommon->asymmetric) { + for (int i = 0; i < numAlpha; ++i) { + ((float *)dequantOffsetBufferMap)[i] = dequantAlpha[2 * i]; + ((float *)dequantScaleBufferMap)[i] = dequantAlpha[2 * i + 1]; + } + } else { + for (int i = 0; i < numAlpha; ++i) { + ((float *)dequantScaleBufferMap)[i] = dequantAlpha[i]; + ((float *)dequantOffsetBufferMap)[i] = 0.0f; + } + } + } + } else { + MNN_ERROR("Map error dequantBufferMap == nullptr \n"); + MNN_ASSERT(false); + } + mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(*(mResource->biasBuffer.get()), biasPtrCL); + mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(*(mResource->dequantScaleBuffer.get()), dequantScaleBufferMap); + mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(*(mResource->dequantOffsetBuffer.get()), dequantOffsetBufferMap); + // set mFilterDataPtr + mFilterDataPtr = (void *)quanCommon->weight.get(); +} +// set mKernelBuffer for the 1x1 kernels +void ConvLowMemoryExecution::set1x1WeightLowMemory(int packCout, int packCin, void * filterDataPtr, std::shared_ptr & quanCommon) { + cl_int res; + std::shared_ptr filterBuffer(Tensor::createDevice({ROUND_UP(mOutputChannel, 8)/*Cout pack set to max 8*/, ROUND_UP(mInputChannel, packCin), mKernelWidth, mKernelHeight})); + size_t buffer_size = filterBuffer->usize() / sizeof(float); + float *dequantAlpha = quanCommon->alpha.get(); + // shared part for all cases + if (mNumQuantBit == 8) { + // int8 case + buffer_size *= sizeof(int8_t); + } else if (mNumQuantBit == 4){ + // int4 case + buffer_size /= 2; + } else {/* More types to be supported. */} + mResource->kernelBuffer.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size)); + auto kernelBufferPtr = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(*(mResource->kernelBuffer.get()), true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &res); + if(kernelBufferPtr != nullptr && res == CL_SUCCESS){ + ::memset(kernelBufferPtr, 0, buffer_size); + + if(mResource->gemmOpt){ + for(int o = 0; o < mOutputChannel; o++){ + float zero = 0; + if(quanCommon->asymmetric){ + zero = (-dequantAlpha[2 * o + 1])/dequantAlpha[2 * o]; + } + int i = 0; + for(; i < mInputChannel; i++){ + int bufferIdx = (o/packCout) * packCin*packCout + (i/packCin)*packCin*ROUND_UP(mOutputChannel, packCout) + (i%packCin)*packCout + (o%packCout);//(Ci/packCin, Co/packCout, packCin, packCout) + int filterIdx = o*mInputChannel + i; + if (mNumQuantBit == 8) { + // int8 case + ((int8_t *)kernelBufferPtr)[bufferIdx] = (int8_t)(((int8_t *)filterDataPtr)[filterIdx]); + } else if (mNumQuantBit == 4){ + // int4 case + if (bufferIdx % 2 == 0) { + ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)((((int8_t *)filterDataPtr)[filterIdx] + 8) * 16); + } else { + ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)(((int8_t *)filterDataPtr)[filterIdx] + 8); + } + } else {/* More types to be supported. */} + } + for(; i < ROUND_UP(mInputChannel, 4); i++){ + int bufferIdx = (o/packCout) * packCin*packCout + (i/packCin)*packCin*ROUND_UP(mOutputChannel, packCout) + (i%packCin)*packCout + (o%packCout);//(Ci/packCin, Co/packCout, packCin, packCout) + if (mNumQuantBit == 8) { + // int8 case + ((int8_t *)kernelBufferPtr)[bufferIdx] = (int8_t)(zero); + } else if (mNumQuantBit == 4){ + // int4 case + if (bufferIdx % 2 == 0) { + ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)((zero + 8) * 16); + } else { + ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)(zero + 8); + } + } + } + } + }else{ + for(int o = 0; o < mOutputChannel; o++){ + float zero = 0; + if(quanCommon->asymmetric){ + zero = (-dequantAlpha[2 * o + 1])/dequantAlpha[2 * o]; + } + int i = 0; + for(; i < mInputChannel; i++){ + int bufferIdx = (o/packCout) * ROUND_UP(mInputChannel, packCin)*packCout + (i/packCin)*packCin*packCout + (o%packCout) + (i%packCin)*packCout;//(Co/packCout, Ci/packCin, packCin, packCout) + int filterIdx = o*mInputChannel + i; + if (mNumQuantBit == 8) { + // int8 case + ((int8_t *)kernelBufferPtr)[bufferIdx] = (int8_t)(((int8_t *)filterDataPtr)[filterIdx]); + } else if (mNumQuantBit == 4){ + // int4 case + if (bufferIdx % 2 == 0) { + ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)((((int8_t *)filterDataPtr)[filterIdx] + 8) * 16); + } else { + ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)(((int8_t *)filterDataPtr)[filterIdx] + 8); + } + } else {/* More types to be supported. */} + } + for(; i < ROUND_UP(mInputChannel, 4); i++){ + int bufferIdx = (o/packCout) * ROUND_UP(mInputChannel, packCin)*packCout + (i/packCin)*packCin*packCout + (o%packCout)*packCin + (i%packCin);//(Co/packCout, Ci/packCin, packCout, packCin) + if (mNumQuantBit == 8) { + // int8 case + ((int8_t *)kernelBufferPtr)[bufferIdx] = (int8_t)(zero); + } else if (mNumQuantBit == 4){ + // int4 case + if (bufferIdx % 2 == 0) { + ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)((zero + 8) * 16); + } else { + ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)(zero + 8); + } + } + } + } + } + } else { + MNN_ERROR("set1x1WeightLowMemory: Map error ptrCL == nullptr \n"); + MNN_ASSERT(false); + } + mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(*(mResource->kernelBuffer.get()), kernelBufferPtr); +} +// set mFilter for the general kernels +void ConvLowMemoryExecution::setGeneralWeightLowMemory(void* filterDataPtr, std::shared_ptr & quanCommon) { + if (filterDataPtr != nullptr) { + std::vector filterImageShape{ROUND_UP(mInputChannel, 4), (UP_DIV(mOutputChannel, 4) * mKernelWidth * mKernelHeight)}; + std::shared_ptr filterBuffer(Tensor::createDevice({mOutputChannel, ROUND_UP(mInputChannel, 4), mKernelWidth, mKernelHeight})); + // int buffer_size = filterBuffer->elementSize(); + size_t buffer_size = filterBuffer->usize() / sizeof(float); + buffer_size *= sizeof(int8_t); + cl::Buffer filterBufferCL(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size); + filterBuffer->buffer().device = (uint64_t)(&filterBufferCL); + float *dequantAlpha = quanCommon->alpha.get(); + // map and pack data from filterDataPtr + cl_int res; + auto ptrCL = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(filterBufferCL, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &res); + if(ptrCL != nullptr && res == CL_SUCCESS) { + ::memset(ptrCL, 0, buffer_size); + const int copy_size = mKernelWidth * mKernelHeight * sizeof(int8_t); + for(int oc=0; ocasymmetric){ + zero = (-dequantAlpha[2 * oc + 1])/dequantAlpha[2 * oc]; + } + int ic = 0; + for(; icgetOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(filterBufferCL, ptrCL); + // convert to NC4HW4 + if (mNumQuantBit == 8) { + // ROUND_UP(IC, 4), UP_DIV(OC, 4) * mKernelWidth * mKernelHeight + mResource->filter.reset(Tensor::createDevice({1, filterImageShape[1], 1, 4 * filterImageShape[0]})); + mResource->kernelBuffer.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size)); + mResource->filter->buffer().device = (uint64_t)(mResource->kernelBuffer.get()); + MNN::OpenCL::BufferConvertor bufferConvertor{mOpenCLBackend->getOpenCLRuntime()}; + // filterBuffer shape: {OC, ROUND_UP(IC, 4), mKernelWidth, mKernelHeight} + bufferConvertor.convertToNC4HW4Buffer(filterBuffer.get(), MNN::OpenCL::CONV2D_FILTER, mResource->filter.get(), false, true, mLowMemoryFlag, mNumQuantBit); + } else if (mNumQuantBit == 4){ + // ROUND_UP(IC, 4), UP_DIV(OC, 4) * mKernelWidth * mKernelHeight + // For int4 case, data stored in mFilter should be uint8_t + // while "Tensor::createDevice" occupies more memory than "Tensor::createDevice". + // Therefore, we use "Tensor::createDevice" currently, leaving "Tensor::createDevice" to be supported. + mResource->filter.reset(Tensor::createDevice({1, filterImageShape[1], 1, 2 * filterImageShape[0]})); + mResource->kernelBuffer.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size/2)); + mResource->filter->buffer().device = (uint64_t)(mResource->kernelBuffer.get()); + MNN::OpenCL::BufferConvertor bufferConvertor{mOpenCLBackend->getOpenCLRuntime()}; + // filterBuffer shape: {OC, ROUND_UP(IC, 4), mKernelWidth, mKernelHeight} + bufferConvertor.convertToNC4HW4Buffer(filterBuffer.get(), MNN::OpenCL::CONV2D_FILTER, mResource->filter.get(), false, true, mLowMemoryFlag, mNumQuantBit); + } else {/* More types to be supported. */} + } else { + MNN_ERROR("GetConvParams Error: filterDataPtr == nullptr. \n"); + MNN_ASSERT(false); + } +} +// select the fastest kernel for the 1x1 cases by tuning +void ConvLowMemoryExecution::tune1x1CaseLowMemory(Tensor * input, Tensor * output) { + std::vector inputShape = tensorShapeFormat(input); + std::vector outputShape = tensorShapeFormat(output); + auto runTime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); + const int height = outputShape.at(1); + const int width = outputShape.at(2); + const int outChannel = outputShape.at(3); + const int inputHeight = inputShape.at(1); + const int inputWidth = inputShape.at(2); + const int inputChannels = inputShape.at(3); + const int inputChannelBlocks = UP_DIV(inputChannels, 4); + std::string info = std::to_string(inputChannels) + "_" + std::to_string(mKernelHeight) + "_" + std::to_string(mKernelWidth) + "_" + std::to_string(mStrides[0]) + "_" + std::to_string(mStrides[1]) + "_" + std::to_string(mDilations[0]) + "_" + std::to_string(mDilations[1]); + int inputImageShape[2] = {inputHeight, inputWidth}; + int outputImageShape[2] = {height, width}; + int stideShape[2] = {mStrides[0], mStrides[1]}; + const int total_kernel = 2; + std::string kernelName[total_kernel] = {"conv_2d_1x1", "conv_2d_1x1_c8h1w4"}; + int itemC[total_kernel] = {4, 8}; + int itemH[total_kernel] = {1, 1}; + int itemW[total_kernel] = {4, 4}; + int actual_kernel = total_kernel; + + cl::Kernel kernel[total_kernel]; + std::vector globalWorkSize[total_kernel]; + std::vector localWorkSize[total_kernel]; + std::pair min_cost(INT_MAX, 0);//(min_time, min_index) + cl_int ret = CL_SUCCESS; + for(int knl_idx = 0; knl_idx < actual_kernel; knl_idx++) { + std::set buildOption = mResource->buildOptions; + kernel[knl_idx] = mOpenCLBackend->getOpenCLRuntime()->buildKernel("conv_2d", kernelName[knl_idx], buildOption); + uint32_t maxWorkGroupSize = static_cast(mOpenCLBackend->getOpenCLRuntime()->getMaxWorkGroupSize(kernel[knl_idx])); + + globalWorkSize[knl_idx] = {static_cast(UP_DIV(outputShape.at(3), itemC[knl_idx]) * UP_DIV(outputShape.at(2), itemW[knl_idx])), static_cast(outputShape.at(0) * UP_DIV(outputShape.at(1), itemH[knl_idx]))}; + uint32_t idx = 0; + ret |= kernel[knl_idx].setArg(idx++, globalWorkSize[knl_idx][0]); + ret |= kernel[knl_idx].setArg(idx++, globalWorkSize[knl_idx][1]); + ret |= kernel[knl_idx].setArg(idx++, openCLImage(input)); + ret |= kernel[knl_idx].setArg(idx++, *mResource->kernelBuffer.get()); + ret |= kernel[knl_idx].setArg(idx++, *mResource->dequantScaleBuffer.get()); + ret |= kernel[knl_idx].setArg(idx++, *mResource->dequantOffsetBuffer.get()); + ret |= kernel[knl_idx].setArg(idx++, *mResource->biasBuffer.get()); + ret |= kernel[knl_idx].setArg(idx++, openCLImage(output)); + ret |= kernel[knl_idx].setArg(idx++, sizeof(inputImageShape), inputImageShape); + ret |= kernel[knl_idx].setArg(idx++, static_cast(inputChannelBlocks)); + ret |= kernel[knl_idx].setArg(idx++, sizeof(outputImageShape), outputImageShape); + ret |= kernel[knl_idx].setArg(idx++, sizeof(stideShape), stideShape); + ret |= kernel[knl_idx].setArg(idx++, UP_DIV(width, 4)); + ret |= kernel[knl_idx].setArg(idx++, UP_DIV(outputShape.at(3), 4)); + + std::pair, uint32_t> retTune; + retTune = localWS2DDefault(globalWorkSize[knl_idx], maxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), kernelName[knl_idx] + info, kernel[knl_idx]); + + //printf("conv1x1 kernel_%d = %d [%d, %d]\n", knl_idx, retTune.second, retTune.first[0], retTune.first[1]); + if(min_cost.first > retTune.second) { + min_cost.first = retTune.second; + min_cost.second = knl_idx; + mLocalWorkSize = {retTune.first[0], retTune.first[1]}; + } + } + + int min_index = min_cost.second; + mGlobalWorkSize = {globalWorkSize[min_index][0], globalWorkSize[min_index][1]}; + std::set buildOption = mResource->buildOptions; + mKernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("conv_2d", kernelName[min_index], buildOption); + uint32_t idx = 0; + ret |= mKernel.setArg(idx++, mGlobalWorkSize[0]); + ret |= mKernel.setArg(idx++, mGlobalWorkSize[1]); + ret |= mKernel.setArg(idx++, openCLImage(input)); + ret |= mKernel.setArg(idx++, *mResource->kernelBuffer.get()); + ret |= mKernel.setArg(idx++, *mResource->dequantScaleBuffer.get()); + ret |= mKernel.setArg(idx++, *mResource->dequantOffsetBuffer.get()); + ret |= mKernel.setArg(idx++, *mResource->biasBuffer.get()); + ret |= mKernel.setArg(idx++, openCLImage(output)); + ret |= mKernel.setArg(idx++, sizeof(inputImageShape), inputImageShape); + ret |= mKernel.setArg(idx++, static_cast(inputChannelBlocks)); + ret |= mKernel.setArg(idx++, sizeof(outputImageShape), outputImageShape); + ret |= mKernel.setArg(idx++, sizeof(stideShape), stideShape); + ret |= mKernel.setArg(idx++, UP_DIV(width, 4)); + ret |= mKernel.setArg(idx++, UP_DIV(outputShape.at(3), 4)); + MNN_CHECK_CL_SUCCESS(ret, "setArg Conv1x1LowMemory"); + mOpenCLBackend->recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); + return; +} +// select the fastest kernel for the general cases by tuning +void ConvLowMemoryExecution::tuneGeneralCaseLowMemory(Tensor * input, Tensor * output) { + std::vector inputShape = tensorShapeFormat(input); + std::vector outputShape = tensorShapeFormat(output); + auto runTime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); + const int height = outputShape.at(1); + const int width = outputShape.at(2); + const int outChannel = outputShape.at(3); + const int inputHeight = inputShape.at(1); + const int inputWidth = inputShape.at(2); + const int inputChannels = inputShape.at(3); + const int inputChannelBlocks = UP_DIV(inputChannels, 4); + std::string info = std::to_string(inputChannels) + "_" + std::to_string(mKernelHeight) + "_" + std::to_string(mKernelWidth) + "_" + std::to_string(mStrides[0]) + "_" + std::to_string(mStrides[1]) + "_" + std::to_string(mDilations[0]) + "_" + std::to_string(mDilations[1]); + int inputImageShape[2] = {inputHeight, inputWidth}; + int outputImageShape[2] = {height, width}; + int kernelShape[2] = {mKernelHeight, mKernelWidth}; + int strideShape[2] = {mStrides[0], mStrides[1]}; + int paddingShape[2] = {mPaddings[0], mPaddings[1]}; + int dilationShape[2] = {mDilations[0], mDilations[1]}; + const int total_kernel = 3; + std::string kernelName[total_kernel] = {"conv_2d_c4h1w4", "conv_2d_c4h4w1", "conv_2d_c8h4w1" }; + int itemC[total_kernel] = {4, 4, 8}; + int itemH[total_kernel] = {1, 4, 4}; + int itemW[total_kernel] = {4, 1, 1}; + int actual_kernel = total_kernel; + cl::Kernel kernel[total_kernel]; + std::vector globalWorkSize[total_kernel]; + std::vector localWorkSize[total_kernel]; + std::pair min_cost(INT_MAX, 0);//(min_time, min_index) + // MNN_PRINT("Checking kernel %d.\n", knlCheck); + for (int knl_idx = 0; knl_idx < actual_kernel; knl_idx++) { + std::set buildOption = mResource->buildOptions; + kernel[knl_idx] = mOpenCLBackend->getOpenCLRuntime()->buildKernel("conv_2d", kernelName[knl_idx], buildOption); + uint32_t maxWorkGroupSize = static_cast(mOpenCLBackend->getOpenCLRuntime()->getMaxWorkGroupSize(kernel[knl_idx])); + + globalWorkSize[knl_idx] = {static_cast(UP_DIV(outputShape.at(3), itemC[knl_idx]) * UP_DIV(outputShape.at(2), itemW[knl_idx])), static_cast(outputShape.at(0) * UP_DIV(outputShape.at(1), itemH[knl_idx]))}; + uint32_t idx = 0; + cl_int ret = CL_SUCCESS; + ret |= kernel[knl_idx].setArg(idx++, globalWorkSize[knl_idx][0]); + ret |= kernel[knl_idx].setArg(idx++, globalWorkSize[knl_idx][1]); + ret |= kernel[knl_idx].setArg(idx++, openCLImage(input)); + ret |= kernel[knl_idx].setArg(idx++, openCLBuffer(mResource->filter.get())); + ret |= kernel[knl_idx].setArg(idx++, *mResource->dequantScaleBuffer.get()); + ret |= kernel[knl_idx].setArg(idx++, *mResource->dequantOffsetBuffer.get()); + ret |= kernel[knl_idx].setArg(idx++, *mResource->biasBuffer.get()); + ret |= kernel[knl_idx].setArg(idx++, openCLImage(output)); + ret |= kernel[knl_idx].setArg(idx++, sizeof(inputImageShape), inputImageShape); + ret |= kernel[knl_idx].setArg(idx++, inputChannelBlocks); + ret |= kernel[knl_idx].setArg(idx++, sizeof(outputImageShape), outputImageShape); + ret |= kernel[knl_idx].setArg(idx++, sizeof(kernelShape), kernelShape); + ret |= kernel[knl_idx].setArg(idx++, sizeof(strideShape), strideShape); + ret |= kernel[knl_idx].setArg(idx++, sizeof(paddingShape), paddingShape); + ret |= kernel[knl_idx].setArg(idx++, sizeof(dilationShape), dilationShape); + ret |= kernel[knl_idx].setArg(idx++, UP_DIV(width, itemW[knl_idx])); + ret |= kernel[knl_idx].setArg(idx++, UP_DIV(outputShape.at(3), 4)); + ret |= kernel[knl_idx].setArg(idx++, UP_DIV(height, itemH[knl_idx])); + MNN_CHECK_CL_SUCCESS(ret, "setArg ConvLowMemory Kernel Select"); + std::pair, int> retTune; + retTune = localWS2DDefault(globalWorkSize[knl_idx], maxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), kernelName[knl_idx] + info, kernel[knl_idx]); + if(min_cost.first > retTune.second) { + min_cost.first = retTune.second; + min_cost.second = knl_idx; + mLocalWorkSize = {retTune.first[0], retTune.first[1]}; + } + } + int min_index = min_cost.second; + mGlobalWorkSize = {globalWorkSize[min_index][0], globalWorkSize[min_index][1]}; + + std::set buildOption = mResource->buildOptions; + mKernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("conv_2d", kernelName[min_index], buildOption); + + uint32_t idx = 0; + cl_int ret = CL_SUCCESS; + ret |= mKernel.setArg(idx++, mGlobalWorkSize[0]); + ret |= mKernel.setArg(idx++, mGlobalWorkSize[1]); + ret |= mKernel.setArg(idx++, openCLImage(input)); + ret |= mKernel.setArg(idx++, openCLBuffer(mResource->filter.get())); + ret |= mKernel.setArg(idx++, *mResource->dequantScaleBuffer.get()); + ret |= mKernel.setArg(idx++, *mResource->dequantOffsetBuffer.get()); + ret |= mKernel.setArg(idx++, *mResource->biasBuffer.get()); + ret |= mKernel.setArg(idx++, openCLImage(output)); + ret |= mKernel.setArg(idx++, sizeof(inputImageShape), inputImageShape); + ret |= mKernel.setArg(idx++, inputChannelBlocks); + ret |= mKernel.setArg(idx++, sizeof(outputImageShape), outputImageShape); + ret |= mKernel.setArg(idx++, sizeof(kernelShape), kernelShape); + ret |= mKernel.setArg(idx++, sizeof(strideShape), strideShape); + ret |= mKernel.setArg(idx++, sizeof(paddingShape), paddingShape); + ret |= mKernel.setArg(idx++, sizeof(dilationShape), dilationShape); + ret |= mKernel.setArg(idx++, UP_DIV(width, itemW[min_index])); + ret |= mKernel.setArg(idx++, UP_DIV(outputShape.at(3), 4)); + ret |= mKernel.setArg(idx++, UP_DIV(height, itemH[min_index])); + MNN_CHECK_CL_SUCCESS(ret, "setArg ConvLowMemory"); + mOpenCLBackend->recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); + return; +} +void ConvLowMemoryExecution::tuneGemmLowMemory(Tensor * input, Tensor * output) { + std::vector inputShape = tensorShapeFormat(input); + std::vector outputShape = tensorShapeFormat(output); + auto runTime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); + mOpenCLBackend->startRecord(mRecording); + const int outChannel = outputShape.at(3); + const int inputChannels = inputShape.at(3); + const int batch = outputShape.at(0); + const int inputChannelBlocks = UP_DIV(inputChannels, 4); + const int outputChannelBlocks = UP_DIV(outChannel, 4); + std::string kernelname = "gemm_conv"; + int global_x = outputChannelBlocks; + int global_y = batch; + if(batch > 1) + { + kernelname = "gemm_conv_b2"; + global_y = UP_DIV(batch, 2); + } + mKernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("gemm", kernelname, mResource->buildOptions); + uint32_t maxWorkGroupSize = static_cast(mOpenCLBackend->getOpenCLRuntime()->getMaxWorkGroupSize(mKernel)); + mGlobalWorkSize = {static_cast(global_x), static_cast(global_y)}; + // MNN_PRINT("Kernel is %d.\n", min_index); + uint32_t idx = 0; + cl_int ret = CL_SUCCESS; + ret |= mKernel.setArg(idx++, mGlobalWorkSize[0]); + ret |= mKernel.setArg(idx++, mGlobalWorkSize[1]); + ret |= mKernel.setArg(idx++, openCLImage(input)); + ret |= mKernel.setArg(idx++, *mResource->kernelBuffer.get()); + ret |= mKernel.setArg(idx++, *mResource->dequantScaleBuffer.get()); + ret |= mKernel.setArg(idx++, *mResource->dequantOffsetBuffer.get()); + ret |= mKernel.setArg(idx++, *mResource->biasBuffer.get()); + ret |= mKernel.setArg(idx++, openCLImage(output)); + ret |= mKernel.setArg(idx++, static_cast(outputChannelBlocks)); + ret |= mKernel.setArg(idx++, static_cast(inputChannelBlocks)); + ret |= mKernel.setArg(idx++, static_cast(batch)); + MNN_CHECK_CL_SUCCESS(ret, "setArg gemm_conv"); + + mLocalWorkSize = localWS2DDefault(mGlobalWorkSize, maxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), kernelname, mKernel).first; + mOpenCLBackend->recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); + return; +} +ConvLowMemoryExecution::ConvLowMemoryExecution(const std::vector &inputs, const std::vector &outputs, const MNN::Op *op, Backend *backend) + : ConvCommonExecution(backend) { +#ifdef LOG_VERBOSE + MNN_PRINT("Start ConvLowMemoryExecution init !\n"); +#endif + mResource.reset(new ConvResource); + mOpenCLBackend = static_cast(backend); + const auto *conv2dParams = op->main_as_Convolution2D(); + const auto *conv2dCommonParams = conv2dParams->common(); + mConv2dParams = conv2dParams; + mResource->conv2dCommonParams = conv2dCommonParams; + mStrides = {conv2dCommonParams->strideY(), conv2dCommonParams->strideX()}; + mDilations = {conv2dCommonParams->dilateY(), conv2dCommonParams->dilateX()}; + auto padding = ConvolutionCommon::convolutionPad(inputs[0], outputs[0], conv2dCommonParams); + mPaddings[0] = padding.second;//padY + mPaddings[1] = padding.first;//padX + + mKernelWidth = conv2dCommonParams->kernelX(); + mKernelHeight = conv2dCommonParams->kernelY(); + mOutputChannel = conv2dCommonParams->outputCount(); + mInputChannel = inputs[0]->channel(); + std::shared_ptr quanCommon; + // set mDequantScale, mDequantOffset, mFilterDataPtr + // prepare mDequantScale mDequantOffset mFilterDataPtr + getInfoFromOpLowMemory(quanCommon); + //select opt conv method + //std::vector inputShape = tensorShapeFormat(inputs[0]); + //const int inputChannels = inputShape.at(3); + //const int batch = inputShape.at(0); + mResource->gemmOpt = (mKernelHeight == mKernelWidth && mKernelHeight == 1 && mPaddings[0] == 0 && mPaddings[1] == 0 && mStrides[0] == 1 && mStrides[1] == 1 && inputs[0]->width() == 1 && inputs[0]->height() == 1); + mResource->conv1x1Opt = (mKernelHeight == mKernelWidth && mKernelHeight == 1 && mPaddings[0] == 0 && mPaddings[1] == 0 && mStrides[0] == 1 && mStrides[1] == 1 && inputs[0]->width() >= 4); + //printf("mConv1x1Opt = %d mKernelHeight = %d mKernelWidth = %d mPaddings[0] = %d mPaddings[1] = %d mStrides[0] = %d mStrides[1] = %d inputs[0]->width() = %d inputs[0]->height() = %d mOutputChannel = %d inputChannels = %d batch = %d\n", mConv1x1Opt, mKernelHeight, mKernelWidth, + //mPaddings[0], mPaddings[1], mStrides[0], mStrides[1], inputs[0]->width(), inputs[0]->height(), mOutputChannel, inputChannels, batch); + if (mResource->conv1x1Opt) { + // set mKernelBuffer for 1x1 case + // At first, set packCout equal to 4 + set1x1WeightLowMemory(4, 4, mFilterDataPtr, quanCommon); + } else if(mResource->gemmOpt){ + set1x1WeightLowMemory(4, 4, mFilterDataPtr, quanCommon); + }else { + // set mFilter for not 1x1 case + setGeneralWeightLowMemory(mFilterDataPtr, quanCommon); + } + // Create Kernel + mResource->buildOptions.emplace("-DBIAS"); + if (conv2dCommonParams->relu()) { + mResource->buildOptions.emplace("-DRELU"); + } else if (conv2dCommonParams->relu6()) { + mResource->buildOptions.emplace("-DRELU6"); + } + if (mNumQuantBit == 8) { + // int8 case + mResource->buildOptions.emplace("-DUSE_LOW_BIT_WEIGHT_INT8"); + } else if (mNumQuantBit == 4){ + // int4 case + mResource->buildOptions.emplace("-DUSE_LOW_BIT_WEIGHT_INT4"); + } else {/* More types to be supported. */} +#ifdef LOG_VERBOSE + MNN_PRINT("end ConvExecution init !\n"); +#endif +} + +ConvLowMemoryExecution::ConvLowMemoryExecution(std::shared_ptr resource, const Op* op, Backend *backend) + : ConvCommonExecution(backend) { + mResource = resource; +} + +ConvLowMemoryExecution::~ConvLowMemoryExecution() { + // Do nothing +} + +bool ConvLowMemoryExecution::onClone(Backend* bn, const Op* op, Execution** dst) { + if (!mValid) { + return false; + } + if (nullptr == dst) { + return true; + } + *dst = new ConvLowMemoryExecution(mResource, op, bn); + return true; +} + +ErrorCode ConvLowMemoryExecution::onResize(const std::vector &inputs, const std::vector &outputs) { +#ifdef LOG_VERBOSE + MNN_PRINT("Start ConvExecution onResize !\n"); +#endif + auto input = inputs[0]; + auto output = outputs[0]; + // auto padding = ConvolutionCommon::convolutionPad(input, output, mResource->conv2dCommonParams); + // mPaddings[0] = padding.second;//padY + // mPaddings[1] = padding.first;//padX + mPaddings[0] = 0; + mPaddings[1] = 0; + if (mResource->conv1x1Opt) { + tune1x1CaseLowMemory(input, output); + } else if(mResource->gemmOpt){ + tuneGemmLowMemory(input, output); + } else { + tuneGeneralCaseLowMemory(input, output); + } +#ifdef LOG_VERBOSE + MNN_PRINT("end ConvExecution onResize !\n"); +#endif + return NO_ERROR; +} +ErrorCode ConvLowMemoryExecution::onExecute(const std::vector &inputs, const std::vector &outputs) { +#ifdef LOG_VERBOSE + MNN_PRINT("Start ConvExecution onExecute !\n"); +#endif +#ifdef ENABLE_OPENCL_TIME_PROFILER + cl::Event event; + runKernel2D(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime(), &event); + mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Conv2D", event}); +#else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End ConvExecution onExecute... \n"); +#endif + return NO_ERROR; + } + // gemm/gemv: + // input : (batch, ic/4, 4) + // weight: (ic/4, oc, 4) + // output: (batch, oc, 4) + runKernel2D(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); +#endif + +#ifdef LOG_VERBOSE + MNN_PRINT("end ConvExecution onExecute !\n"); +#endif + return NO_ERROR; +} +} // namespace OpenCL +} // namespace MNN +#endif /* MNN_LOW_MEMORY */ diff --git a/source/backend/opencl/execution/image/ConvLowMemoryExecution.hpp b/source/backend/opencl/execution/image/ConvLowMemoryExecution.hpp new file mode 100644 index 000000000..50355e8a0 --- /dev/null +++ b/source/backend/opencl/execution/image/ConvLowMemoryExecution.hpp @@ -0,0 +1,66 @@ +// +// ConvBufLowMemoryExecution.hpp +// MNN +// +// Created by MNN on 2023/12/1. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#ifdef MNN_LOW_MEMORY +#ifndef ConvLowMemoryExecution_hpp +#define ConvLowMemoryExecution_hpp +#include "core/ConvolutionCommon.hpp" +#include "ConvExecution.hpp" + +namespace MNN { +namespace OpenCL { + +struct ConvResource { + const Convolution2DCommon *conv2dCommonParams; + std::shared_ptr filter; + std::shared_ptr kernelBuffer; + std::shared_ptr dequantScaleBuffer; + std::shared_ptr dequantOffsetBuffer; + std::shared_ptr biasBuffer; + std::set buildOptions; + bool conv1x1Opt = false; + bool gemmOpt = false; +}; + +class ConvLowMemoryExecution : public ConvCommonExecution { +public: + ConvLowMemoryExecution(const std::vector &inputs, const std::vector &outputs, const MNN::Op *op, Backend *backend); + ConvLowMemoryExecution(std::shared_ptr resource, const Op* op, Backend* b); + virtual ~ConvLowMemoryExecution(); + virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; + virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual bool onClone(Backend* bn, const Op* op, Execution** dst) override; +private: + void getInfoFromOpLowMemory(std::shared_ptr & quanCommon); + void set1x1WeightLowMemory(int packCout, int packCin, void * filterDataPtr, std::shared_ptr & quanCommon); + void setGeneralWeightLowMemory(void * filterDataPtr, std::shared_ptr & quanCommon); + void tune1x1CaseLowMemory(Tensor * input, Tensor * output); + void tuneGeneralCaseLowMemory(Tensor * input, Tensor * output); + void tuneGemmLowMemory(Tensor * input, Tensor * output); + std::shared_ptr mResource; + const Convolution2D *mConv2dParams; + std::vector mStrides{1, 1}; + std::vector mPaddings{0, 0}; + std::vector mDilations{1, 1}; + std::vector mGlobalWorkSize{1, 1, 1}; + std::vector mLocalWorkSize{1, 1, 1, 1}; + cl::Kernel mKernel; + uint32_t mMaxWorkGroupSize; + int mKernelWidth; + int mKernelHeight; + int mOutputChannel; + int mInputChannel; + void *mFilterDataPtr = nullptr; + bool mLowMemoryFlag = false; + int mNumQuantBit = 0; +}; + +} // namespace OpenCL +} // namespace MNN +#endif /* ConvLowMemoryExecution_hpp */ +#endif /* MNN_LOW_MEMORY */ diff --git a/source/backend/opencl/execution/image/ConvWinograd.cpp b/source/backend/opencl/execution/image/ConvWinograd.cpp index 9304636ba..f3ad017ce 100644 --- a/source/backend/opencl/execution/image/ConvWinograd.cpp +++ b/source/backend/opencl/execution/image/ConvWinograd.cpp @@ -189,7 +189,7 @@ ErrorCode ConvWinograd::onResize(const std::vector& inputs, const std:: const int padX = pad.first; auto runTime = mOpenCLBackend->getOpenCLRuntime(); - startRecord(runTime, mRecording); + mOpenCLBackend->startRecord(mRecording); auto bn = backend(); mSource.reset(Tensor::createDevice( @@ -277,7 +277,7 @@ ErrorCode ConvWinograd::onResize(const std::vector& inputs, const std:: mGWS_S[b] = {static_cast(wUnit * hUnit), static_cast(icC4)}; std::string kernelName = "winogradTransformSource"; mLWS_S[b] = localWS2DDefault(mGWS_S[b], mMaxWGS_S[b], mOpenCLBackend->getOpenCLRuntime(), kernelName, mSourceTransform[b]).first; - recordKernel2d(mSourceTransform[b], mGWS_S[b], mLWS_S[b], mOpenCLBackend->getOpenCLRuntime()); + mOpenCLBackend->recordKernel2d(mSourceTransform[b], mGWS_S[b], mLWS_S[b]); } /*MatMul*/ @@ -332,7 +332,7 @@ ErrorCode ConvWinograd::onResize(const std::vector& inputs, const std:: ret |= mMatMul[b].setArg(7, alpha*alpha); MNN_CHECK_CL_SUCCESS(ret, "setArg ConvWinogradExecution gemm"); mGWS_M[b] = {globalWorkSize[min_index][0], globalWorkSize[min_index][1]}; - recordKernel2d(mMatMul[b], mGWS_M[b], mLWS_M[b], mOpenCLBackend->getOpenCLRuntime()); + mOpenCLBackend->recordKernel2d(mMatMul[b], mGWS_M[b], mLWS_M[b]); } // Dest Transform @@ -340,10 +340,10 @@ ErrorCode ConvWinograd::onResize(const std::vector& inputs, const std:: mGWS_D[b] = {static_cast(wUnit*hUnit), static_cast(ocC4)}; std::string kernelName = "winogradTransformDest"; mLWS_D[b] = localWS2DDefault(mGWS_D[b], mMaxWGS_D[b], mOpenCLBackend->getOpenCLRuntime(), kernelName, mDestTransform[b]).first; - recordKernel2d(mDestTransform[b], mGWS_D[b], mLWS_D[b], mOpenCLBackend->getOpenCLRuntime()); + mOpenCLBackend->recordKernel2d(mDestTransform[b], mGWS_D[b], mLWS_D[b]); } } - endRecord(runTime, mRecording); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -353,9 +353,9 @@ ErrorCode ConvWinograd::onExecute(const std::vector& inputs, const std: auto output = outputs[0]; #ifndef ENABLE_OPENCL_TIME_PROFILER - if(mOpenCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); return NO_ERROR; } #endif diff --git a/source/backend/opencl/execution/image/DeconvExecution.cpp b/source/backend/opencl/execution/image/DeconvExecution.cpp index 3f5f8b104..b177f1457 100644 --- a/source/backend/opencl/execution/image/DeconvExecution.cpp +++ b/source/backend/opencl/execution/image/DeconvExecution.cpp @@ -97,7 +97,7 @@ DeconvExecution::~DeconvExecution() { } ErrorCode DeconvExecution::onResize(const std::vector &inputs, const std::vector &outputs) { - startRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->startRecord(mRecording); auto output = outputs[0]; auto input = inputs[0]; @@ -162,8 +162,8 @@ ErrorCode DeconvExecution::onResize(const std::vector &inputs, const s std::string name = "deconv2d"; mLWS = localWS3DDefault(mGWS, mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), name, mKernel).first; - recordKernel3d(mKernel, mGWS, mLWS, mOpenCLBackend->getOpenCLRuntime()); - endRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->recordKernel3d(mKernel, mGWS, mLWS); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -180,9 +180,9 @@ ErrorCode DeconvExecution::onExecute(const std::vector &inputs, const mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Deconv", event}); #else - if(mOpenCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("End DeconvExecution onExecute... \n"); #endif @@ -203,11 +203,13 @@ class DeconvolutionCreator : public OpenCLBackend::Creator { virtual ~DeconvolutionCreator() = default; virtual Execution *onCreate(const std::vector &inputs, const std::vector &outputs, const MNN::Op *op, Backend *backend) const override { + if(inputs.size() != 1){ + return nullptr; + } return new DeconvExecution(inputs, op, backend); } }; -OpenCLCreatorRegister __deconv_op(OpType_Deconvolution, IMAGE); - +REGISTER_OPENCL_OP_CREATOR(DeconvolutionCreator, OpType_Deconvolution, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/DepthwiseConvExecution.cpp b/source/backend/opencl/execution/image/DepthwiseConvExecution.cpp index 116cb1feb..4ac5d1fe2 100644 --- a/source/backend/opencl/execution/image/DepthwiseConvExecution.cpp +++ b/source/backend/opencl/execution/image/DepthwiseConvExecution.cpp @@ -96,7 +96,7 @@ DepthwiseConvExecution::~DepthwiseConvExecution() { } ErrorCode DepthwiseConvExecution::onResize(const std::vector &inputs, const std::vector &outputs) { - startRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->startRecord(mRecording); auto input = inputs[0]; auto output = outputs[0]; std::vector inputShape = tensorShapeFormat(input); @@ -149,8 +149,8 @@ ErrorCode DepthwiseConvExecution::onResize(const std::vector &inputs, } mLocalWorkSize = localWS2DDefault(mGlobalWorkSize, mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), kernelName, mKernel).first; - recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); - endRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -167,9 +167,9 @@ ErrorCode DepthwiseConvExecution::onExecute(const std::vector &inputs, mOpenCLBackend->getOpenCLRuntime()->pushEvent({"DepthwiseConv", event}); #else - if(mOpenCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("End DepthwiseConvExecution onExecute... \n"); #endif @@ -201,7 +201,7 @@ class DepthwiseConvolutionCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __DepthwiseConv_op(OpType_ConvolutionDepthwise, IMAGE); +REGISTER_OPENCL_OP_CREATOR(DepthwiseConvolutionCreator, OpType_ConvolutionDepthwise, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/DepthwiseDeconvExecution.cpp b/source/backend/opencl/execution/image/DepthwiseDeconvExecution.cpp index 393a8edc0..c0e0059cb 100644 --- a/source/backend/opencl/execution/image/DepthwiseDeconvExecution.cpp +++ b/source/backend/opencl/execution/image/DepthwiseDeconvExecution.cpp @@ -88,7 +88,7 @@ DepthwiseDeconvExecution::~DepthwiseDeconvExecution() { } ErrorCode DepthwiseDeconvExecution::onResize(const std::vector &inputs, const std::vector &outputs) { - startRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->startRecord(mRecording); auto input = inputs[0]; auto output = outputs[0]; @@ -151,8 +151,8 @@ ErrorCode DepthwiseDeconvExecution::onResize(const std::vector &inputs std::string name = "depthwiseDeconv"; mLWS = localWS3DDefault(mGWS, mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), name, mKernel).first; - recordKernel3d(mKernel, mGWS, mLWS, mOpenCLBackend->getOpenCLRuntime()); - endRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->recordKernel3d(mKernel, mGWS, mLWS); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -170,9 +170,9 @@ ErrorCode DepthwiseDeconvExecution::onExecute(const std::vector &input mOpenCLBackend->getOpenCLRuntime()->pushEvent({"DepthwiseDeconv", event}); #else - if(mOpenCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("End DepthwiseDeconvExecution onExecute... \n"); #endif @@ -205,7 +205,7 @@ class DepthwiseDeconvolutionCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __DepthwiseDeconv_op(OpType_DeconvolutionDepthwise, IMAGE); +REGISTER_OPENCL_OP_CREATOR(DepthwiseDeconvolutionCreator, OpType_DeconvolutionDepthwise, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/EltwiseExecution.cpp b/source/backend/opencl/execution/image/EltwiseExecution.cpp index 382399305..191d469f7 100644 --- a/source/backend/opencl/execution/image/EltwiseExecution.cpp +++ b/source/backend/opencl/execution/image/EltwiseExecution.cpp @@ -49,7 +49,7 @@ ErrorCode EltwiseExecution::onResize(const std::vector &inputs, const mUnits.resize(inputs.size() - 1); auto openCLBackend = static_cast(backend()); - startRecord(openCLBackend->getOpenCLRuntime(), mRecording); + openCLBackend->startRecord(mRecording); auto output = outputs[0]; auto inputShape0 = tensorShapeFormat(inputs[0]); @@ -92,8 +92,8 @@ ErrorCode EltwiseExecution::onResize(const std::vector &inputs, const unit.globalWorkSize = {mGlobalWorkSize[0], mGlobalWorkSize[1]}; unit.localWorkSize = {mLocalWorkSize[0], mLocalWorkSize[1]}; - recordKernel2d(unit.kernel, mGlobalWorkSize, mLocalWorkSize, openCLBackend->getOpenCLRuntime()); - endRecord(openCLBackend->getOpenCLRuntime(), mRecording); + openCLBackend->recordKernel2d(unit.kernel, mGlobalWorkSize, mLocalWorkSize); + openCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -150,9 +150,9 @@ ErrorCode EltwiseExecution::onResize(const std::vector &inputs, const unit.globalWorkSize = {mGlobalWorkSize[0], mGlobalWorkSize[1]}; unit.localWorkSize = {mLocalWorkSize[0], mLocalWorkSize[1]}; - recordKernel2d(unit.kernel, mGlobalWorkSize, mLocalWorkSize, openCLBackend->getOpenCLRuntime()); + openCLBackend->recordKernel2d(unit.kernel, mGlobalWorkSize, mLocalWorkSize); } - endRecord(openCLBackend->getOpenCLRuntime(), mRecording); + openCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -225,8 +225,8 @@ class EltwiseCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __eltwise_op(OpType_Eltwise, IMAGE); -OpenCLCreatorRegister __binary_op(OpType_BinaryOp, IMAGE); +REGISTER_OPENCL_OP_CREATOR(EltwiseCreator, OpType_Eltwise, IMAGE); +REGISTER_OPENCL_OP_CREATOR(EltwiseCreator, OpType_BinaryOp, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/FuseExecution.cpp b/source/backend/opencl/execution/image/FuseExecution.cpp index a084da364..b46523387 100644 --- a/source/backend/opencl/execution/image/FuseExecution.cpp +++ b/source/backend/opencl/execution/image/FuseExecution.cpp @@ -35,7 +35,7 @@ bool FuseExecution::buildFuseKernel(const Op* op) { } ErrorCode FuseExecution::onResize(const std::vector &inputs, const std::vector &outputs) { - startRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->startRecord(mRecording); Tensor *input = inputs[0]; Tensor *output = outputs[0]; @@ -69,8 +69,8 @@ ErrorCode FuseExecution::onResize(const std::vector &inputs, const std MNN_CHECK_CL_SUCCESS(ret, "setArg FuseExecution"); mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), mKernelName, mKernel).first; - recordKernel3d(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); - endRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -85,9 +85,9 @@ ErrorCode FuseExecution::onExecute(const std::vector &inputs, const st mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Fuse", event}); #else - if(mOpenCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("end SoftmaxExecution onExecute !\n"); #endif @@ -110,7 +110,7 @@ class FuseCreator : public OpenCLBackend::Creator { return new FuseExecution(inputs, backend, op); } }; -OpenCLCreatorRegister __Fuse_op(OpType_Extra, IMAGE); +REGISTER_OPENCL_OP_CREATOR(FuseCreator, OpType_Extra, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/GridSampleExecution.cpp b/source/backend/opencl/execution/image/GridSampleExecution.cpp index 6451b7a89..21d7625a2 100644 --- a/source/backend/opencl/execution/image/GridSampleExecution.cpp +++ b/source/backend/opencl/execution/image/GridSampleExecution.cpp @@ -41,11 +41,10 @@ GridSampleExecution::GridSampleExecution(const std::vector &inputs, co } ErrorCode GridSampleExecution::onResize(const std::vector &inputs, const std::vector &outputs) { - startRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->startRecord(mRecording); auto inputTensor = inputs[0]; auto gridTensor = inputs[1]; auto outputTensor = outputs[0]; - auto runtime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); const int batches = inputTensor->buffer().dim[0].extent; const int channels = inputTensor->buffer().dim[1].extent; @@ -80,9 +79,9 @@ ErrorCode GridSampleExecution::onResize(const std::vector &inputs, con ret |= mKernel.setArg(idx++, mAlignCorners); MNN_CHECK_CL_SUCCESS(ret, "setArg GridSampleExecution"); - mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, runtime, mKernelName, mKernel).first; - recordKernel3d(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); - endRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), mKernelName, mKernel).first; + mOpenCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -94,9 +93,9 @@ ErrorCode GridSampleExecution::onExecute(const std::vector &inputs, co mOpenCLBackend->getOpenCLRuntime()->pushEvent({"GridSample", event}); #else - if(mOpenCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); return NO_ERROR; } run3DKernelDefault(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); @@ -104,7 +103,8 @@ ErrorCode GridSampleExecution::onExecute(const std::vector &inputs, co return NO_ERROR; } -OpenCLCreatorRegister> __GridSample_op_(OpType_GridSample, IMAGE); +using GridSampleCreator = TypedCreator; +REGISTER_OPENCL_OP_CREATOR(GridSampleCreator, OpType_GridSample, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/Interp3DExecution.cpp b/source/backend/opencl/execution/image/Interp3DExecution.cpp index cab5e375d..2e52545b3 100644 --- a/source/backend/opencl/execution/image/Interp3DExecution.cpp +++ b/source/backend/opencl/execution/image/Interp3DExecution.cpp @@ -39,8 +39,7 @@ Interp3DExecution::Interp3DExecution(const std::vector &inputs, const ErrorCode Interp3DExecution::onResize(const std::vector &inputs, const std::vector &outputs) { Tensor *input = inputs[0]; Tensor *output = outputs[0]; - auto runtime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); - startRecord(runtime, mRecording); + mOpenCLBackend->startRecord(mRecording); std::vector inputImageShape = tensorShapeFormat(input); // {C/4 * H * W, N * D} for 5-D Tensor std::vector outputImageShape = tensorShapeFormat(output); @@ -86,9 +85,9 @@ ErrorCode Interp3DExecution::onResize(const std::vector &inputs, const MNN_CHECK_CL_SUCCESS(ret, "setArg Intep3DExecution"); std::string name = "interp3D"; - mLWS = localWS3DDefault(mGWS, mMaxWorkGroupSize, runtime, name, mKernel).first; - recordKernel3d(mKernel, mGWS, mLWS, mOpenCLBackend->getOpenCLRuntime()); - endRecord(runtime, mRecording); + mLWS = localWS3DDefault(mGWS, mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), name, mKernel).first; + mOpenCLBackend->recordKernel3d(mKernel, mGWS, mLWS); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -105,9 +104,9 @@ ErrorCode Interp3DExecution::onExecute(const std::vector &inputs, cons mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Interp3D", event}); #else - if(mOpenCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("End Interp3DExecution onExecute... \n"); #endif @@ -123,7 +122,8 @@ ErrorCode Interp3DExecution::onExecute(const std::vector &inputs, cons return NO_ERROR; } -OpenCLCreatorRegister> __Interp3D_op_(OpType_Interp3D, IMAGE); +using Interp3DCreator = TypedCreator; +REGISTER_OPENCL_OP_CREATOR(Interp3DCreator, OpType_Interp3D, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/InterpExecution.cpp b/source/backend/opencl/execution/image/InterpExecution.cpp index e46ad37fb..3d84b195f 100644 --- a/source/backend/opencl/execution/image/InterpExecution.cpp +++ b/source/backend/opencl/execution/image/InterpExecution.cpp @@ -40,7 +40,7 @@ ErrorCode InterpExecution::onResize(const std::vector &inputs, const s Tensor *input = inputs[0]; Tensor *output = outputs[0]; auto runtime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); - startRecord(runtime, mRecording); + mOpenCLBackend->startRecord(mRecording); std::vector inputShape = tensorShapeFormat(input); std::vector outputShape = tensorShapeFormat(output); @@ -78,9 +78,9 @@ ErrorCode InterpExecution::onResize(const std::vector &inputs, const s MNN_CHECK_CL_SUCCESS(ret, "setArg InterpExecution"); std::string name = "interp"; - mLWS = localWS3DDefault(mGWS, mMaxWorkGroupSize, runtime, name, mKernel).first; - recordKernel3d(mKernel, mGWS, mLWS, mOpenCLBackend->getOpenCLRuntime()); - endRecord(runtime, mRecording); + mLWS = localWS3DDefault(mGWS, mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), name, mKernel).first; + mOpenCLBackend->recordKernel3d(mKernel, mGWS, mLWS); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -97,9 +97,9 @@ ErrorCode InterpExecution::onExecute(const std::vector &inputs, const mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Interp", event}); #else - if(mOpenCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("End InterpExecution onExecute... \n"); #endif @@ -127,7 +127,7 @@ class InterpCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __Interp_op_(OpType_Interp, IMAGE); +REGISTER_OPENCL_OP_CREATOR(InterpCreator, OpType_Interp, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/LayerNormExecution.cpp b/source/backend/opencl/execution/image/LayerNormExecution.cpp index dc5069e0f..c09305497 100644 --- a/source/backend/opencl/execution/image/LayerNormExecution.cpp +++ b/source/backend/opencl/execution/image/LayerNormExecution.cpp @@ -21,6 +21,8 @@ LayerNormExecution::LayerNormExecution(const std::vector &inputs, cons epsilon_ = layer_norm_param->epsilon(); group_ = layer_norm_param->group(); auto bufferUnitSize = runtime->isSupportedFP16() ? sizeof(half_float::half) : sizeof(float); + auto kernel = runtime->buildKernel("layernorm", "layernorm_w", {"-DLOCAL_SIZE=512"}); + mMaxWorkGroupSize = static_cast(runtime->getMaxWorkGroupSize(kernel)); if(layer_norm_param->gamma() && layer_norm_param->beta()){ has_gamma_beta_ = true; @@ -87,7 +89,8 @@ ErrorCode LayerNormExecution::onResize(const std::vector &inputs, cons Tensor *input = inputs[0]; Tensor *output = outputs[0]; auto runtime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); - startRecord(runtime, mRecording); + mOpenCLBackend->startRecord(mRecording); + auto MaxLocalSize = std::min(runtime->getMaxWorkItemSizes()[0], mMaxWorkGroupSize); std::vector inputShape = tensorShapeFormat(input); std::vector outputShape = tensorShapeFormat(output); @@ -96,7 +99,6 @@ ErrorCode LayerNormExecution::onResize(const std::vector &inputs, cons const int inputHeight = inputShape[1]; const int inputWidth = inputShape[2]; const int inputChannels = inputShape[3]; - auto MaxWorkItems = runtime->getMaxWorkItemSizes(); int local_size; int rank = inputs.at(0)->dimensions(); int outter_size = 1; @@ -115,7 +117,7 @@ ErrorCode LayerNormExecution::onResize(const std::vector &inputs, cons std::string kernelName; if (inner_size == inputWidth && outter_size == inputBatch * inputHeight * inputChannels) { kernelName = "layernorm_w"; - local_size = getLocalSize(inputWidth, MaxWorkItems[0]); + local_size = getLocalSize(inputWidth, MaxLocalSize); buildOptions.emplace("-DLOCAL_SIZE=" + std::to_string(local_size)); mKernel = runtime->buildKernel("layernorm", kernelName, buildOptions); @@ -124,7 +126,7 @@ ErrorCode LayerNormExecution::onResize(const std::vector &inputs, cons static_cast(inputBatch)}; }else if(inner_size == inputWidth * inputHeight && outter_size == inputBatch * inputChannels){ kernelName = "layernorm_hw"; - local_size = getLocalSize(inputWidth * inputHeight, MaxWorkItems[0]); + local_size = getLocalSize(inputWidth * inputHeight, MaxLocalSize); buildOptions.emplace("-DLOCAL_SIZE=" + std::to_string(local_size)); mKernel = runtime->buildKernel("layernorm", kernelName, buildOptions); @@ -133,7 +135,7 @@ ErrorCode LayerNormExecution::onResize(const std::vector &inputs, cons static_cast(inputBatch)}; }else if(inner_size == inputWidth * inputHeight * inputChannels && outter_size == inputBatch){ kernelName = "layernorm_chw"; - local_size = getLocalSize(inputWidth * inputHeight, MaxWorkItems[0]); + local_size = getLocalSize(inputWidth * inputHeight, MaxLocalSize); buildOptions.emplace("-DLOCAL_SIZE=" + std::to_string(local_size)); mKernel = runtime->buildKernel("layernorm", kernelName, buildOptions); @@ -160,8 +162,8 @@ ErrorCode LayerNormExecution::onResize(const std::vector &inputs, cons ret |= mKernel.setArg(idx++, epsilon_); MNN_CHECK_CL_SUCCESS(ret, "setArg LayerNormExecution"); - recordKernel3d(mKernel, mGWS, mLWS, mOpenCLBackend->getOpenCLRuntime()); - endRecord(runtime, mRecording); + mOpenCLBackend->recordKernel3d(mKernel, mGWS, mLWS); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -178,9 +180,9 @@ ErrorCode LayerNormExecution::onExecute(const std::vector &inputs, con mOpenCLBackend->getOpenCLRuntime()->pushEvent({"LayerNorm", event}); #else - if(mOpenCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("End LayerNormExecution onExecute... \n"); #endif @@ -211,7 +213,7 @@ class LayerNormCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __LayerNorm_op_(OpType_LayerNorm, IMAGE); +REGISTER_OPENCL_OP_CREATOR(LayerNormCreator, OpType_LayerNorm, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/LayerNormExecution.hpp b/source/backend/opencl/execution/image/LayerNormExecution.hpp index 293802296..3837666fe 100644 --- a/source/backend/opencl/execution/image/LayerNormExecution.hpp +++ b/source/backend/opencl/execution/image/LayerNormExecution.hpp @@ -42,6 +42,7 @@ class LayerNormExecution : public Execution, public CommonExtension { std::shared_ptr mGammaBuffer; std::shared_ptr mBetaBuffer; bool has_gamma_beta_ = false; + uint32_t mMaxWorkGroupSize; }; } // namespace OpenCL diff --git a/source/backend/opencl/execution/image/LoopExecution.cpp b/source/backend/opencl/execution/image/LoopExecution.cpp index bf5342279..ad97cc184 100644 --- a/source/backend/opencl/execution/image/LoopExecution.cpp +++ b/source/backend/opencl/execution/image/LoopExecution.cpp @@ -15,13 +15,13 @@ namespace OpenCL { static void _TileTensor(Tensor *input, cl::Buffer *output, cl::Kernel& kernel, cl::NDRange &globalWorkSize, cl::NDRange &localWorkSize, const int Width, const int Height, const int Channel, - const int Batch, OpenCLRuntime *runTime, std::set buildOptions) { + const int Batch, OpenCLBackend *bn, std::set buildOptions) { if (TensorUtils::getDescribe(input)->dimensionFormat == MNN::MNN_DATA_FORMAT_NHWC){ buildOptions.emplace("-DMNN_NHWC"); } - kernel = runTime->buildKernel("loop", "tile", buildOptions); - uint32_t mMaxWorkGroupSize = static_cast(runTime->getMaxWorkGroupSize(kernel)); + kernel = bn->getOpenCLRuntime()->buildKernel("loop", "tile", buildOptions); + uint32_t mMaxWorkGroupSize = static_cast(bn->getOpenCLRuntime()->getMaxWorkGroupSize(kernel)); std::vector mGlobalWorkSize = {(uint32_t)(Width * Height), (uint32_t)(UP_DIV(Channel, 4)), (uint32_t)(Batch)}; uint32_t index = 0; @@ -36,22 +36,22 @@ static void _TileTensor(Tensor *input, cl::Buffer *output, cl::Kernel& kernel, c ret |= kernel.setArg(index++, Channel); MNN_CHECK_CL_SUCCESS(ret, "setArg Loop _PackTensor"); - std::vector mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, runTime, "tile", kernel).first; + std::vector mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, bn->getOpenCLRuntime(), "tile", kernel).first; globalWorkSize = {mGlobalWorkSize[0], mGlobalWorkSize[1], mGlobalWorkSize[2]}; localWorkSize = {mLocalWorkSize[0], mLocalWorkSize[1], mLocalWorkSize[2]}; - recordKernel3d(kernel, mGlobalWorkSize, mLocalWorkSize, runTime); + bn->recordKernel3d(kernel, mGlobalWorkSize, mLocalWorkSize); } static void _PackTensor(cl::Buffer *input, Tensor *output, cl::Kernel& kernel, cl::NDRange &globalWorkSize, cl::NDRange &localWorkSize, const int Width, const int Height, const int Channel, - const int Batch, OpenCLRuntime *runTime, std::set buildOptions) { + const int Batch, OpenCLBackend *bn, std::set buildOptions) { if (TensorUtils::getDescribe(output)->dimensionFormat == MNN::MNN_DATA_FORMAT_NHWC){ buildOptions.emplace("-DMNN_NHWC"); } - kernel = runTime->buildKernel("loop", "pack", buildOptions); - uint32_t mMaxWorkGroupSize = static_cast(runTime->getMaxWorkGroupSize(kernel)); + kernel = bn->getOpenCLRuntime()->buildKernel("loop", "pack", buildOptions); + uint32_t mMaxWorkGroupSize = static_cast(bn->getOpenCLRuntime()->getMaxWorkGroupSize(kernel)); std::vector mGlobalWorkSize = {(uint32_t)(Width * Height), (uint32_t)(UP_DIV(Channel, 4)), (uint32_t)(Batch)}; uint32_t index = 0; @@ -66,11 +66,11 @@ static void _PackTensor(cl::Buffer *input, Tensor *output, cl::Kernel& kernel, c ret |= kernel.setArg(index++, Channel); MNN_CHECK_CL_SUCCESS(ret, "setArg Loop _PackTensor"); - std::vector mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, runTime, "pack", kernel).first; + std::vector mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, bn->getOpenCLRuntime(), "pack", kernel).first; globalWorkSize = {mGlobalWorkSize[0], mGlobalWorkSize[1], mGlobalWorkSize[2]}; localWorkSize = {mLocalWorkSize[0], mLocalWorkSize[1], mLocalWorkSize[2]}; - recordKernel3d(kernel, mGlobalWorkSize, mLocalWorkSize, runTime); + bn->recordKernel3d(kernel, mGlobalWorkSize, mLocalWorkSize); } static void _setTensorStack(std::vector &result, const std::vector &inputs, @@ -96,7 +96,7 @@ static void _setTensorStack(std::vector &result, const std::vectorcommands()->GetAs(0); OpenCLBackend *mOpenCLBackend = (OpenCLBackend *)backend(); auto runTime = mOpenCLBackend->getOpenCLRuntime(); - startRecord(runTime, mRecording); + mOpenCLBackend->startRecord(mRecording); auto bufferPool = mOpenCLBackend->getBufferPool(); auto bufferUnitSize = runTime->isSupportedFP16() ? sizeof(half_float::half) : sizeof(float); _setTensorStack(mTensors, inputs, outputs, mLoop); @@ -131,7 +131,7 @@ static void _setTensorStack(std::vector &result, const std::vectoralloc(input->elementSize() * bufferUnitSize); Unit unit; - _TileTensor(mTensors[cmd->indexes()->data()[1]], mTmpBuffers[1], unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height,Channel, Batch, runTime, mBuildOptions); + _TileTensor(mTensors[cmd->indexes()->data()[1]], mTmpBuffers[1], unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height,Channel, Batch, mOpenCLBackend, mBuildOptions); mUnits.emplace_back(unit); } @@ -146,7 +146,7 @@ static void _setTensorStack(std::vector &result, const std::vectoralloc(input->elementSize() * bufferUnitSize)); Unit unit; - _TileTensor(input, mOffsetBuffers.back(), unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, runTime, mBuildOptions); + _TileTensor(input, mOffsetBuffers.back(), unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, mOpenCLBackend, mBuildOptions); mUnits.emplace_back(unit); } } @@ -186,7 +186,7 @@ static void _setTensorStack(std::vector &result, const std::vectorrecordKernel3d(unit.kernel, mGlobalWorkSize, mLocalWorkSize); mUnits.emplace_back(unit); } @@ -199,7 +199,7 @@ static void _setTensorStack(std::vector &result, const std::vectorindexes()->data()[0]], unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, runTime, mBuildOptions); + _PackTensor(mTmpBuffers[0], mTensors[cmd->indexes()->data()[0]], unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, mOpenCLBackend, mBuildOptions); mUnits.emplace_back(unit); } @@ -209,7 +209,7 @@ static void _setTensorStack(std::vector &result, const std::vectorrecycle(mOffsetBuffers[i]); } - endRecord(runTime, mRecording); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -228,7 +228,7 @@ ErrorCode LoopBatchMatMulExecution::onResize(const std::vector &inputs auto cmd = mLoop->commands()->GetAs(0); OpenCLBackend *mOpenCLBackend = (OpenCLBackend *)backend(); auto runTime = mOpenCLBackend->getOpenCLRuntime(); - startRecord(runTime, mRecording); + mOpenCLBackend->startRecord(mRecording); auto bufferPool = mOpenCLBackend->getBufferPool(); auto bufferUnitSize = runTime->isSupportedFP16() ? sizeof(half_float::half) : sizeof(float); _setTensorStack(mTensors, inputs, outputs, mLoop); @@ -262,7 +262,7 @@ ErrorCode LoopBatchMatMulExecution::onResize(const std::vector &inputs mTmpBuffers[i] = bufferPool->alloc(Batch * Channel * ROUND_UP(Height, 4) * ROUND_UP(Width, 4) * bufferUnitSize); Unit unit; - _TileTensor(input, mTmpBuffers[i], unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, runTime, mBuildOptions); + _TileTensor(input, mTmpBuffers[i], unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, mOpenCLBackend, mBuildOptions); mUnits.emplace_back(unit); } @@ -277,7 +277,7 @@ ErrorCode LoopBatchMatMulExecution::onResize(const std::vector &inputs mOffsetBuffers.emplace_back(bufferPool->alloc(input->elementSize() * bufferUnitSize)); Unit unit; - _TileTensor(input, mOffsetBuffers.back(), unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, runTime, mBuildOptions); + _TileTensor(input, mOffsetBuffers.back(), unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, mOpenCLBackend, mBuildOptions); mUnits.emplace_back(unit); } } @@ -334,7 +334,7 @@ ErrorCode LoopBatchMatMulExecution::onResize(const std::vector &inputs unit.globalWorkSize = {mGlobalWorkSize[0], mGlobalWorkSize[1], mGlobalWorkSize[2]}; unit.localWorkSize = {mLocalWorkSize[0], mLocalWorkSize[1], mLocalWorkSize[2]}; mUnits.emplace_back(unit); - recordKernel3d(unit.kernel, mGlobalWorkSize, mLocalWorkSize, runTime); + mOpenCLBackend->recordKernel3d(unit.kernel, mGlobalWorkSize, mLocalWorkSize); } //pack output @@ -346,7 +346,7 @@ ErrorCode LoopBatchMatMulExecution::onResize(const std::vector &inputs const int Height = Shape.at(1); const int Batch = Shape.at(0); Unit unit; - _PackTensor(mTmpBuffers[0], output, unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, runTime, mBuildOptions); + _PackTensor(mTmpBuffers[0], output, unit.kernel, unit.globalWorkSize, unit.localWorkSize, Width, Height, Channel, Batch, mOpenCLBackend, mBuildOptions); mUnits.emplace_back(unit); } @@ -356,7 +356,7 @@ ErrorCode LoopBatchMatMulExecution::onResize(const std::vector &inputs for (int i = 0; i < mOffsetBuffers.size(); ++i) { bufferPool->recycle(mOffsetBuffers[i]); } - endRecord(runTime, mRecording); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -372,7 +372,7 @@ ErrorCode LoopBinaryExecution::onResize(const std::vector &inputs, con auto cmd = mLoop->commands()->GetAs(0); OpenCLBackend *mOpenCLBackend = (OpenCLBackend *)backend(); auto runTime = mOpenCLBackend->getOpenCLRuntime(); - startRecord(runTime, mRecording); + mOpenCLBackend->startRecord(mRecording); _setTensorStack(mTensors, inputs, outputs, mLoop); mUnits.clear(); Unit unit; @@ -421,10 +421,10 @@ ErrorCode LoopBinaryExecution::onResize(const std::vector &inputs, con unit.globalWorkSize = {mGlobalWorkSize[0], mGlobalWorkSize[1], mGlobalWorkSize[2]}; unit.localWorkSize = {mLocalWorkSize[0], mLocalWorkSize[1], mLocalWorkSize[2]}; - recordKernel3d(unit.kernel, mGlobalWorkSize, mLocalWorkSize, runTime); + mOpenCLBackend->recordKernel3d(unit.kernel, mGlobalWorkSize, mLocalWorkSize); mUnits.emplace_back(unit); - endRecord(runTime, mRecording); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -499,7 +499,7 @@ class LoopCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __Loop_op(OpType_While, IMAGE); +REGISTER_OPENCL_OP_CREATOR(LoopCreator, OpType_While, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/MatmulExecution.cpp b/source/backend/opencl/execution/image/MatmulExecution.cpp index ceea519f4..e2ee9cf8e 100644 --- a/source/backend/opencl/execution/image/MatmulExecution.cpp +++ b/source/backend/opencl/execution/image/MatmulExecution.cpp @@ -19,7 +19,7 @@ MatMulExecution::MatMulExecution(const std::vector &inputs, const MNN: } ErrorCode MatMulExecution::onResize(const std::vector &inputs, const std::vector &outputs) { auto runtime = mOpenCLBackend->getOpenCLRuntime(); - startRecord(runtime, mRecording); + mOpenCLBackend->startRecord(mRecording); Tensor *input0 = inputs[0]; Tensor *input1 = inputs[1]; @@ -100,8 +100,8 @@ ErrorCode MatMulExecution::onResize(const std::vector &inputs, const s mLocalWorkSize = {mMaxWorkGroupSize / 64, 64, 0}; } - recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); - endRecord(runtime, mRecording); + mOpenCLBackend->recordKernel2d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -118,9 +118,9 @@ ErrorCode MatMulExecution::onExecute(const std::vector &inputs, const mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Matmul", event}); #else - if(mOpenCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("End MatMulExecution onExecute... \n"); #endif @@ -144,7 +144,7 @@ class MatMulCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __matmul_op(OpType_MatMul, IMAGE); +REGISTER_OPENCL_OP_CREATOR(MatMulCreator, OpType_MatMul, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/MultiInputDWConvExecution.cpp b/source/backend/opencl/execution/image/MultiInputDWConvExecution.cpp index a791f000a..63a9b5b84 100644 --- a/source/backend/opencl/execution/image/MultiInputDWConvExecution.cpp +++ b/source/backend/opencl/execution/image/MultiInputDWConvExecution.cpp @@ -38,7 +38,7 @@ ErrorCode MultiInputDWConvExecution::onResize(const std::vector &input auto originLayout = TensorUtils::getDescribe(inputs[1])->dimensionFormat; auto openclBackend = static_cast(backend()); auto runtime = openclBackend->getOpenCLRuntime(); - startRecord(runtime, mRecording); + openclBackend->startRecord(mRecording); auto inputShape = tensorShapeFormat(inputs[0]); auto outputShape = tensorShapeFormat(outputs[0]); @@ -102,7 +102,7 @@ ErrorCode MultiInputDWConvExecution::onResize(const std::vector &input mUnits[0].kernel = kernel; mUnits[0].localWorkSize = {lws[0], lws[1]}; mUnits[0].globalWorkSize = {gws[0], gws[1]}; - recordKernel2d(mUnits[0].kernel, gws, lws, runtime); + openclBackend->recordKernel2d(mUnits[0].kernel, gws, lws); } @@ -150,7 +150,7 @@ ErrorCode MultiInputDWConvExecution::onResize(const std::vector &input mUnits[1].kernel = kernel; mUnits[1].localWorkSize = {lws[0], lws[1]}; mUnits[1].globalWorkSize = {gws[0], gws[1]}; - recordKernel2d(mUnits[1].kernel, {gws[0], gws[1]}, {lws[0], lws[1]}, runtime); + openclBackend->recordKernel2d(mUnits[1].kernel, {gws[0], gws[1]}, {lws[0], lws[1]}); } { @@ -221,9 +221,9 @@ ErrorCode MultiInputDWConvExecution::onResize(const std::vector &input mUnits[2].localWorkSize = {1, 1}; mUnits[2].globalWorkSize = {gws[0], gws[1]}; - recordKernel2d(mUnits[2].kernel, gws, {1, 1}, runtime); + openclBackend->recordKernel2d(mUnits[2].kernel, gws, {1, 1}); } - endRecord(runtime, mRecording); + openclBackend->endRecord(mRecording); return NO_ERROR; } diff --git a/source/backend/opencl/execution/image/MultiInputDWDeconvExecution.cpp b/source/backend/opencl/execution/image/MultiInputDWDeconvExecution.cpp index 2d6b297ab..d6468ab51 100644 --- a/source/backend/opencl/execution/image/MultiInputDWDeconvExecution.cpp +++ b/source/backend/opencl/execution/image/MultiInputDWDeconvExecution.cpp @@ -43,7 +43,7 @@ ErrorCode MultiInputDWDeconvExecution::onResize(const std::vector &inp auto originLayout = TensorUtils::getDescribe(inputs[1])->dimensionFormat; auto openclBackend = static_cast(backend()); auto runtime = openclBackend->getOpenCLRuntime(); - startRecord(runtime, mRecording); + openclBackend->startRecord(mRecording); auto inputShape = tensorShapeFormat(inputs[0]); auto outputShape = tensorShapeFormat(outputs[0]); @@ -106,7 +106,7 @@ ErrorCode MultiInputDWDeconvExecution::onResize(const std::vector &inp mUnits[0].kernel = kernel; mUnits[0].localWorkSize = {lws[0], lws[1]}; mUnits[0].globalWorkSize = {gws[0], gws[1]}; - recordKernel2d(mUnits[0].kernel, gws, lws, runtime); + openclBackend->recordKernel2d(mUnits[0].kernel, gws, lws); } // convert kernel from IOHW to OIHW, similar to DeconvExecution.cpp @@ -128,10 +128,10 @@ ErrorCode MultiInputDWDeconvExecution::onResize(const std::vector &inp static_cast(shape[3]), static_cast(shape[0]) }; - recordKernel2d(mUnits[1].kernel, { + openclBackend->recordKernel2d(mUnits[1].kernel, { static_cast(shape[3]), static_cast(shape[0]) - }, {0, 0}, runtime); + }, {0, 0}); } // transform kernel from original form (maybe NCHW or NHWC) to filter format @@ -177,7 +177,7 @@ ErrorCode MultiInputDWDeconvExecution::onResize(const std::vector &inp mUnits[2].kernel = kernel; mUnits[2].localWorkSize = {lws[0], lws[1]}; mUnits[2].globalWorkSize = {gws[0], gws[1]}; - recordKernel2d(mUnits[2].kernel, {gws[0], gws[1]}, {lws[0], lws[1]}, runtime); + openclBackend->recordKernel2d(mUnits[2].kernel, {gws[0], gws[1]}, {lws[0], lws[1]}); } { @@ -265,9 +265,9 @@ ErrorCode MultiInputDWDeconvExecution::onResize(const std::vector &inp mUnits[3].kernel = kernel; mUnits[3].localWorkSize = {lws[0], lws[1], lws[2]}; mUnits[3].globalWorkSize = {gws[0], gws[1], gws[2]}; - recordKernel3d(mUnits[3].kernel, gws, lws, runtime); + openclBackend->recordKernel3d(mUnits[3].kernel, gws, lws); } - endRecord(runtime, mRecording); + openclBackend->endRecord(mRecording); return NO_ERROR; } diff --git a/source/backend/opencl/execution/image/PoolExecution.cpp b/source/backend/opencl/execution/image/PoolExecution.cpp index f7fa44b3f..c49c9b65c 100644 --- a/source/backend/opencl/execution/image/PoolExecution.cpp +++ b/source/backend/opencl/execution/image/PoolExecution.cpp @@ -60,7 +60,7 @@ ErrorCode PoolExecution::onResize(const std::vector &inputs, const std #ifdef LOG_VERBOSE MNN_PRINT("start PoolExecution onResize !\n"); #endif - startRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->startRecord(mRecording); auto input = inputs[0]; auto output = outputs[0]; bool returnRedice = outputs.size() == 2; @@ -154,8 +154,8 @@ ErrorCode PoolExecution::onResize(const std::vector &inputs, const std ret |= mKernel.setArg(idx++, openCLImage(redice)); MNN_CHECK_CL_SUCCESS(ret, "setArg PoolExecution"); - recordKernel3d(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); - endRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("end PoolExecution onResize !\n"); #endif @@ -174,9 +174,9 @@ ErrorCode PoolExecution::onExecute(const std::vector &inputs, const st mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Pooling", event}); #else - if(mOpenCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("End PoolExecution onExecute... \n"); #endif @@ -192,6 +192,8 @@ ErrorCode PoolExecution::onExecute(const std::vector &inputs, const st return NO_ERROR; } -OpenCLCreatorRegister> __Pool_op(OpType_Pooling, IMAGE); +using PoolCreator = TypedCreator; +REGISTER_OPENCL_OP_CREATOR(PoolCreator, OpType_Pooling, IMAGE); + } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/RangeExecution.cpp b/source/backend/opencl/execution/image/RangeExecution.cpp new file mode 100644 index 000000000..d0aa5ce99 --- /dev/null +++ b/source/backend/opencl/execution/image/RangeExecution.cpp @@ -0,0 +1,112 @@ +// +// RangeBufExecution.cpp +// MNN +// +// Created by MNN on 2023/12/1. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#include "backend/opencl/execution/image/RangeExecution.hpp" +#include "core/Macro.h" +#include "core/TensorUtils.hpp" +#include "backend/opencl/core/OpenCLBackend.hpp" + +namespace MNN { +namespace OpenCL { + +RangeExecution::RangeExecution(const std::string &compute, Backend* backend) : Execution(backend) { + mBuildOptions.emplace(compute); + // Do nothing +} +ErrorCode RangeExecution::onResize(const std::vector& inputs, const std::vector& outputs) { + auto openCLBackend = static_cast(backend()); + auto runtime = openCLBackend->getOpenCLRuntime(); + openCLBackend->startRecord(mRecording); + mKernel = runtime->buildKernel("range", "range", mBuildOptions); + mMaxWorkGroupSize = static_cast(runtime->getMaxWorkGroupSize(mKernel)); + + std::vector outputShape = tensorShapeFormat(outputs[0]); + + int batch = outputShape.at(0); + int outputHeight = outputShape.at(1); + int outputWidth = outputShape.at(2); + int channels = outputShape.at(3); + int channelBlocks = (channels + 3) / 4; + + mGlobalWorkSize = { + static_cast(outputWidth), + static_cast(outputHeight), + static_cast(batch * channelBlocks) + }; + + uint32_t idx = 0; + cl_int ret = CL_SUCCESS; + ret |= mKernel.setArg(idx++, mGlobalWorkSize[0]); + ret |= mKernel.setArg(idx++, mGlobalWorkSize[1]); + ret |= mKernel.setArg(idx++, mGlobalWorkSize[2]); + ret |= mKernel.setArg(idx++, openCLImage(inputs[0])); + ret |= mKernel.setArg(idx++, openCLImage(inputs[2])); + ret |= mKernel.setArg(idx++, openCLImage(outputs[0])); + ret |= mKernel.setArg(idx++, outputWidth); + ret |= mKernel.setArg(idx++, outputHeight); + ret |= mKernel.setArg(idx++, channels); + ret |= mKernel.setArg(idx++, channelBlocks); + MNN_CHECK_CL_SUCCESS(ret, "setArg RangeExecution"); + + std::string kernelName = "range"; + mLocalSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, openCLBackend->getOpenCLRuntime(), kernelName, mKernel).first; + openCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalSize); + openCLBackend->endRecord(mRecording); + return NO_ERROR; +} + +ErrorCode RangeExecution::onExecute(const std::vector& inputs, const std::vector& outputs) { +#ifdef LOG_VERBOSE + MNN_PRINT("start RangeBufExecution onExecute..."); +#endif + auto mOpenCLBackend = static_cast(backend()); + +#ifdef ENABLE_OPENCL_TIME_PROFILER + cl::Event event; + run3DKernelDefault(mKernel, mGlobalWorkSize, mLocalSize, + mOpenCLBackend->getOpenCLRuntime(), &event); + + mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Range", event}); +#else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End RangeExecution onExecute... \n"); +#endif + return NO_ERROR; + } + run3DKernelDefault(mKernel, mGlobalWorkSize, mLocalSize, + mOpenCLBackend->getOpenCLRuntime()); +#endif + +#ifdef LOG_VERBOSE + MNN_PRINT("end RangeBufExecution onExecute..."); +#endif + return NO_ERROR; +} + +class RangeCreator : public OpenCLBackend::Creator { +public: + virtual Execution* onCreate(const std::vector& inputs, const std::vector& outputs, + const MNN::Op* op, Backend* backend) const override { + auto code = inputs[0]->getType().code; + switch (code) { + case halide_type_int: + return new RangeExecution("-DUSE_INT", backend); + case halide_type_float: + return new RangeExecution("-DUSE_FLOAT", backend); + default: + return nullptr; + } + } +}; + +REGISTER_OPENCL_OP_CREATOR(RangeCreator, OpType_Range, IMAGE); +} // namespace OpenCL +} // namespace MNN diff --git a/source/backend/opencl/execution/image/RangeExecution.hpp b/source/backend/opencl/execution/image/RangeExecution.hpp new file mode 100644 index 000000000..8ba87182f --- /dev/null +++ b/source/backend/opencl/execution/image/RangeExecution.hpp @@ -0,0 +1,41 @@ +// +// RangeBufExecution.hpp +// MNN +// +// Created by MNN on 2023/12/1. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#ifndef RangeExecution_hpp +#define RangeExecution_hpp + +#include "core/Execution.hpp" + +#include +#include "MNN_generated.h" +#include "backend/opencl/core/OpenCLBackend.hpp" +#include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" + +namespace MNN { +namespace OpenCL { + +class RangeExecution : public Execution, public CommonExtension { +public: + RangeExecution(const std::string &compute, Backend *backend); + virtual ~RangeExecution() = default; + + virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; + virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + +private: + cl::Kernel mKernel; + uint32_t mMaxWorkGroupSize; + std::vector mGlobalWorkSize = {1, 1, 1}; + std::vector mLocalSize = {1, 1, 1}; + std::set mBuildOptions; +}; + +} // namespace OpenCL +} // namespace MNN +#endif /* RangeExecution_hpp */ diff --git a/source/backend/opencl/execution/image/RasterExecution.cpp b/source/backend/opencl/execution/image/RasterExecution.cpp index 7af31e94d..ef3cb9836 100644 --- a/source/backend/opencl/execution/image/RasterExecution.cpp +++ b/source/backend/opencl/execution/image/RasterExecution.cpp @@ -26,7 +26,7 @@ ErrorCode RasterExecution::onResize(const std::vector &____inputs, con #ifdef LOG_VERBOSE MNN_PRINT("start RasterExecution onResize !\n"); #endif - startRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->startRecord(mRecording); mTempInput.clear(); mTempOutput = nullptr; MNN_ASSERT(outputs.size() == 1); @@ -83,10 +83,10 @@ ErrorCode RasterExecution::onResize(const std::vector &____inputs, con { MNN_PRINT("setArg err %d\n", (int)ret); } - recordKernel2d(unit.kernel, + mOpenCLBackend->recordKernel2d(unit.kernel, {(uint32_t)UP_DIV((region[1] * region[3]), 16)*16, (uint32_t)UP_DIV((region[0] * region[2]), 16)*16}, - {8, 8}, runtime); + {8, 8}); } // image raster @@ -139,7 +139,7 @@ ErrorCode RasterExecution::onResize(const std::vector &____inputs, con unit.globalWorkSize = {ROUND_UP(gws[0], std::max((uint32_t)1, lws[0])), ROUND_UP(gws[1], std::max((uint32_t)1, lws[1])), ROUND_UP(gws[2], std::max((uint32_t)1, lws[2]))}; - recordKernel3d(unit.kernel, gws, lws, runtime); + mOpenCLBackend->recordKernel3d(unit.kernel, gws, lws); } if(mNeedZero) { @@ -149,7 +149,7 @@ ErrorCode RasterExecution::onResize(const std::vector &____inputs, con { MNN_ASSERT((regionNum==kernel_idx)); } - endRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -213,7 +213,7 @@ ErrorCode RasterExecution::onResize(const std::vector &____inputs, con unit.globalWorkSize = {ROUND_UP(gws[0], std::max((uint32_t)1, lws[0])), ROUND_UP(gws[1], std::max((uint32_t)1, lws[1]))}; - recordKernel2d(unit.kernel, gws, lws, runtime); + mOpenCLBackend->recordKernel2d(unit.kernel, gws, lws); } //image to buffer @@ -259,7 +259,7 @@ ErrorCode RasterExecution::onResize(const std::vector &____inputs, con unit.localWorkSize = {lws[0], lws[1]}; unit.globalWorkSize = {ROUND_UP(gws[0], std::max((uint32_t)1, lws[0])), ROUND_UP(gws[1], std::max((uint32_t)1, lws[1]))}; - recordKernel2d(unit.kernel, gws, lws, runtime); + mOpenCLBackend->recordKernel2d(unit.kernel, gws, lws); } // buffer raster @@ -313,7 +313,7 @@ ErrorCode RasterExecution::onResize(const std::vector &____inputs, con unit.globalWorkSize = {ROUND_UP(gws[0], std::max((uint32_t)1, lws[0])), ROUND_UP(gws[1], std::max((uint32_t)1, lws[1])), ROUND_UP(gws[2], std::max((uint32_t)1, lws[2]))}; - recordKernel3d(unit.kernel, gws, lws, runtime); + mOpenCLBackend->recordKernel3d(unit.kernel, gws, lws); }else{ for (auto& slice : des->regions) { @@ -357,7 +357,7 @@ ErrorCode RasterExecution::onResize(const std::vector &____inputs, con unit.globalWorkSize = {ROUND_UP(gws[0], std::max((uint32_t)1, lws[0])), ROUND_UP(gws[1], std::max((uint32_t)1, lws[1])), ROUND_UP(gws[2], std::max((uint32_t)1, lws[2]))}; - recordKernel3d(unit.kernel, gws, lws, runtime); + mOpenCLBackend->recordKernel3d(unit.kernel, gws, lws); } } @@ -401,7 +401,7 @@ ErrorCode RasterExecution::onResize(const std::vector &____inputs, con unit.localWorkSize = {lws[0], lws[1]}; unit.globalWorkSize = {ROUND_UP(gws[0], std::max((uint32_t)1, lws[0])), ROUND_UP(gws[1], std::max((uint32_t)1, lws[1]))}; - recordKernel2d(unit.kernel, gws, lws, runtime); + mOpenCLBackend->recordKernel2d(unit.kernel, gws, lws); } //kernel num check @@ -414,7 +414,7 @@ ErrorCode RasterExecution::onResize(const std::vector &____inputs, con MNN_ASSERT((kernel_idx==regionNum + originNum + 1)); } - endRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->endRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("end RasterExecution onResize !\n"); #endif @@ -459,6 +459,7 @@ bool RasterExecution::CanCombine(const std::vector &outputs){ return res; } -OpenCLCreatorRegister> __Raster_op(OpType_Raster, IMAGE); +using RasterCreator = TypedCreator; +REGISTER_OPENCL_OP_CREATOR(RasterCreator, OpType_Raster, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/ReductionExecution.cpp b/source/backend/opencl/execution/image/ReductionExecution.cpp index d60b28ac6..119696b70 100644 --- a/source/backend/opencl/execution/image/ReductionExecution.cpp +++ b/source/backend/opencl/execution/image/ReductionExecution.cpp @@ -39,6 +39,8 @@ ReductionExecution::ReductionExecution(const MNN::Op* op, Backend* backend) : Co MNN_ASSERT(false); break; } + auto kernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("reduction", "reduct_width", {"-DOPERATE(a,b)=(a+b)","-DVALUE=0","-DLOCAL_SIZE=512"}); + mMaxWorkGroupSize = static_cast(mOpenCLBackend->getOpenCLRuntime()->getMaxWorkGroupSize(kernel)); #ifdef LOG_VERBOSE MNN_PRINT("end ReductionExecution init !\n"); #endif @@ -56,7 +58,8 @@ ErrorCode ReductionExecution::onResize(const std::vector &inputs, cons auto runtime = mOpenCLBackend->getOpenCLRuntime(); - startRecord(runtime, mRecording); + mOpenCLBackend->startRecord(mRecording); + auto MaxLocalSize = std::min(runtime->getMaxWorkItemSizes()[0], mMaxWorkGroupSize); auto input = inputs[0]; auto output = outputs[0]; if(mAxis < 0){ @@ -72,7 +75,6 @@ ErrorCode ReductionExecution::onResize(const std::vector &inputs, cons } int dim = input->length(mAxis); int local_size = 0; - auto MaxWorkItems = runtime->getMaxWorkItemSizes(); if(dim >= 16){ mUseLocal = true; @@ -128,20 +130,20 @@ ErrorCode ReductionExecution::onResize(const std::vector &inputs, cons if(mUseLocal){ if(batch * inputHeight * inputChannels == outside && 1 == inside && dim == inputWidth){ - local_size = getLocalSize(inputWidth, MaxWorkItems[0]); + local_size = getLocalSize(inputWidth, MaxLocalSize); buildOption.emplace("-DLOCAL_SIZE=" + std::to_string(local_size)); mReduct1DKernel = runtime->buildKernel("reduction", "reduct_width", buildOption); }else if(batch * inputChannels == outside && inputWidth == inside && dim == inputHeight){ - local_size = getLocalSize(inputHeight, MaxWorkItems[0]); + local_size = getLocalSize(inputHeight, MaxLocalSize); buildOption.emplace("-DLOCAL_SIZE=" + std::to_string(local_size)); mReduct1DKernel = runtime->buildKernel("reduction", "reduct_height", buildOption); }else if(batch == outside && inputWidth * inputHeight == inside && dim == inputChannels){ - local_size = getLocalSize(inputChannelBlocks - 1, MaxWorkItems[0]); + local_size = getLocalSize(inputChannelBlocks - 1, MaxLocalSize); buildOption.emplace("-DLOCAL_SIZE=" + std::to_string(local_size)); mReduct1DKernel = runtime->buildKernel("reduction", "reduct_channel", buildOption); mGlobalWorkSize[2] = static_cast(outputBatch * outputChannels); }else if(1 == outside && inputWidth * inputHeight * inputChannels == inside && dim == batch){ - local_size = getLocalSize(batch, MaxWorkItems[0]); + local_size = getLocalSize(batch, MaxLocalSize); buildOption.emplace("-DLOCAL_SIZE=" + std::to_string(local_size)); mReduct1DKernel = runtime->buildKernel("reduction", "reduct_batch", buildOption); } @@ -182,13 +184,13 @@ ErrorCode ReductionExecution::onResize(const std::vector &inputs, cons if(mUseLocal){ mLocalWorkSize = {static_cast(local_size), 1, 1}; }else{ - auto MaxWorkGroupSize = static_cast(runtime->getMaxWorkGroupSize(mReduct1DKernel)); + mMaxWorkGroupSize = static_cast(runtime->getMaxWorkGroupSize(mReduct1DKernel)); std::string kernelName = "reduct"; - mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, MaxWorkGroupSize, runtime, kernelName, mReduct1DKernel).first; + mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, runtime, kernelName, mReduct1DKernel).first; } - recordKernel3d(mReduct1DKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); - endRecord(runtime, mRecording); + mOpenCLBackend->recordKernel3d(mReduct1DKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -202,9 +204,9 @@ ErrorCode ReductionExecution::onExecute(const std::vector &inputs, con run3DKernelDefault(mReduct1DKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime(), &event); mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Reduct1D", event}); #else - if(mOpenCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("End ReductionExecution onExecute... \n"); #endif @@ -258,6 +260,6 @@ class ReductionCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __reduction_op(OpType_Reduction, IMAGE); +REGISTER_OPENCL_OP_CREATOR(ReductionCreator, OpType_Reduction, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/ReductionExecution.hpp b/source/backend/opencl/execution/image/ReductionExecution.hpp index 9146cfd6f..de36ce323 100644 --- a/source/backend/opencl/execution/image/ReductionExecution.hpp +++ b/source/backend/opencl/execution/image/ReductionExecution.hpp @@ -37,6 +37,7 @@ class ReductionExecution : public CommonExecution { std::vector mGlobalWorkSize = {1, 1, 1}; std::vector mLocalWorkSize{1, 1, 1}; bool mUseLocal = false; + uint32_t mMaxWorkGroupSize; }; } // namespace OpenCL diff --git a/source/backend/opencl/execution/image/ReluExecution.cpp b/source/backend/opencl/execution/image/ReluExecution.cpp index 92e24e245..203309053 100644 --- a/source/backend/opencl/execution/image/ReluExecution.cpp +++ b/source/backend/opencl/execution/image/ReluExecution.cpp @@ -66,10 +66,10 @@ ErrorCode ReluExecution::onResize(const std::vector &inputs, const std int reluStride[4] = {0, 0, 0, 1}; cl::NDRange localSize = {4, 4}; cl::NDRange globalSize = {(uint32_t)UP_DIV(imageWidth, 4) * 4, (uint32_t)UP_DIV(imageHeight, 4) * 4}; - - auto runTime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); - startRecord(runTime, mRecording); - mUnits[0].kernel = runTime->buildKernel("binary", "binary_prelu", {"-DOPERATOR=select(in0*in1,in0,in0>=(FLOAT4)0)"}); + + auto mOpenCLBackend = static_cast(backend()); + mOpenCLBackend->startRecord(mRecording); + mUnits[0].kernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("binary", "binary_prelu", {"-DOPERATOR=select(in0*in1,in0,in0>=(FLOAT4)0)"}); cl_int ret = CL_SUCCESS; ret |= mUnits[0].kernel.setArg(0, openCLImage(inputs[0])); ret |= mUnits[0].kernel.setArg(1, openCLImage(mPreluParam.get())); @@ -81,8 +81,8 @@ ErrorCode ReluExecution::onResize(const std::vector &inputs, const std mUnits[0].globalWorkSize = globalSize; mUnits[0].localWorkSize = localSize; - recordKernel2d(mUnits[0].kernel, {(uint32_t)UP_DIV(imageWidth, 4) * 4, (uint32_t)UP_DIV(imageHeight, 4) * 4}, {4, 4}, runTime); - endRecord(runTime, mRecording); + mOpenCLBackend->recordKernel2d(mUnits[0].kernel, {(uint32_t)UP_DIV(imageWidth, 4) * 4, (uint32_t)UP_DIV(imageHeight, 4) * 4}, {4, 4}); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } class ReluCreator : public OpenCLBackend::Creator { @@ -147,10 +147,9 @@ class ReluCreator : public OpenCLBackend::Creator { return nullptr; } }; - -OpenCLCreatorRegister __Relu_op(OpType_ReLU, IMAGE); -OpenCLCreatorRegister __PRelu_op(OpType_PReLU, IMAGE); -OpenCLCreatorRegister __Relu6_op(OpType_ReLU6, IMAGE); +REGISTER_OPENCL_OP_CREATOR(ReluCreator, OpType_ReLU, IMAGE); +REGISTER_OPENCL_OP_CREATOR(ReluCreator, OpType_PReLU, IMAGE); +REGISTER_OPENCL_OP_CREATOR(ReluCreator, OpType_ReLU6, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/RoiPoolingExecution.cpp b/source/backend/opencl/execution/image/RoiPoolingExecution.cpp index 312d2fb05..f2dbaa973 100644 --- a/source/backend/opencl/execution/image/RoiPoolingExecution.cpp +++ b/source/backend/opencl/execution/image/RoiPoolingExecution.cpp @@ -47,8 +47,7 @@ ErrorCode RoiPooling::onResize(const std::vector &inputs, const std::v Tensor *output = outputs[0]; Tensor *roi = inputs[1]; - auto runtime = mOpenCLBackend->getOpenCLRuntime(); - startRecord(runtime, mRecording); + mOpenCLBackend->startRecord(mRecording); std::vector inputShape = tensorShapeFormat(input); std::vector outputShape = tensorShapeFormat(output); @@ -89,8 +88,8 @@ ErrorCode RoiPooling::onResize(const std::vector &inputs, const std::v MNN_CHECK_CL_SUCCESS(ret, "setArg RoiPoolExecution"); mLWS = roiPoolingLocalWS(mGWS, mMaxWorkGroupSize); - recordKernel3d(mKernel, mGWS, mLWS, runtime); - endRecord(runtime, mRecording); + mOpenCLBackend->recordKernel3d(mKernel, mGWS, mLWS); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -131,9 +130,9 @@ ErrorCode RoiPooling::onExecute(const std::vector &inputs, const std:: mOpenCLBackend->getOpenCLRuntime()->pushEvent({"RoiPooling", event}); #else - if(mOpenCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("End RoiPooling onExecute... \n"); #endif @@ -148,7 +147,8 @@ ErrorCode RoiPooling::onExecute(const std::vector &inputs, const std:: return NO_ERROR; } -OpenCLCreatorRegister> __roi_pooling_op(OpType_ROIPooling, IMAGE); +using RoiPoolingCreator = TypedCreator; +REGISTER_OPENCL_OP_CREATOR(RoiPoolingCreator, OpType_ROIPooling, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/ScaleExecution.cpp b/source/backend/opencl/execution/image/ScaleExecution.cpp index 672b32122..b8696daf4 100644 --- a/source/backend/opencl/execution/image/ScaleExecution.cpp +++ b/source/backend/opencl/execution/image/ScaleExecution.cpp @@ -120,7 +120,7 @@ ErrorCode ScaleExecution::onResize(const std::vector &inputs, const st MNN_PRINT("Start ScaleExecution onResize !\n"); #endif - startRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->startRecord(mRecording); std::vector inputShape = tensorShapeFormat(inputs[0]); const int batch = inputShape.at(0); @@ -154,8 +154,8 @@ ErrorCode ScaleExecution::onResize(const std::vector &inputs, const st mGWS[i] = ROUND_UP(gws[i], std::max((uint32_t)1, mLWS[i])); } - recordKernel3d(mKernel, mGWS, mLWS, mOpenCLBackend->getOpenCLRuntime()); - endRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->recordKernel3d(mKernel, mGWS, mLWS); + mOpenCLBackend->endRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("end ScaleExecution onResize !\n"); #endif @@ -173,9 +173,9 @@ ErrorCode ScaleExecution::onExecute(const std::vector &inputs, const s mOpenCLBackend->getOpenCLRuntime()->pushEvent({"scale", event}); #else - if(mOpenCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("End ScaleExecution onExecute... \n"); #endif @@ -190,7 +190,8 @@ ErrorCode ScaleExecution::onExecute(const std::vector &inputs, const s return NO_ERROR; } -OpenCLCreatorRegister> __scale_op(OpType_Scale, IMAGE); +using ScaleCreator = TypedCreator; +REGISTER_OPENCL_OP_CREATOR(ScaleCreator, OpType_Scale, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/SelectExecution.cpp b/source/backend/opencl/execution/image/SelectExecution.cpp new file mode 100644 index 000000000..7220d0bc3 --- /dev/null +++ b/source/backend/opencl/execution/image/SelectExecution.cpp @@ -0,0 +1,104 @@ +// +// SelectExecution.cpp +// MNN +// +// Created by MNN on 2023/12/1. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#include "backend/opencl/execution/image/SelectExecution.hpp" +#include "core/Macro.h" +#include "core/TensorUtils.hpp" +#include "backend/opencl/core/OpenCLBackend.hpp" + +namespace MNN { +namespace OpenCL { + +SelectExecution::SelectExecution(Backend* backend) : Execution(backend) { + // Do nothing +} +ErrorCode SelectExecution::onResize(const std::vector& inputs, const std::vector& outputs) { + auto inSize1 = inputs[1]->elementSize(); + auto inSize2 = inputs[2]->elementSize(); + auto openCLBackend = static_cast(backend()); + auto runtime = openCLBackend->getOpenCLRuntime(); + openCLBackend->startRecord(mRecording); + if(inSize1 == 1) + mBuildOptions.emplace("-DINSIZE1_EUQAL_1"); + if(inSize2 == 1) + mBuildOptions.emplace("-DINSIZE2_EUQAL_1"); + mKernel = runtime->buildKernel("select", "select_img", mBuildOptions); + mMaxWorkGroupSize = static_cast(runtime->getMaxWorkGroupSize(mKernel)); + + std::vector outputShape = tensorShapeFormat(outputs[0]); + + int batch = outputShape.at(0); + int outputHeight = outputShape.at(1); + int outputWidth = outputShape.at(2); + int channels = outputShape.at(3); + int channelBlocks = (channels + 3) / 4; + + mGlobalWorkSize = { + static_cast(channelBlocks * outputWidth), + static_cast(batch * outputHeight) + }; + + uint32_t idx = 0; + cl_int ret = CL_SUCCESS; + ret |= mKernel.setArg(idx++, mGlobalWorkSize[0]); + ret |= mKernel.setArg(idx++, mGlobalWorkSize[1]); + ret |= mKernel.setArg(idx++, openCLImage(inputs[0])); + ret |= mKernel.setArg(idx++, openCLImage(inputs[1])); + ret |= mKernel.setArg(idx++, openCLImage(inputs[2])); + ret |= mKernel.setArg(idx++, openCLImage(outputs[0])); + MNN_CHECK_CL_SUCCESS(ret, "setArg SelectExecution"); + + std::string kernelName = "select_img"; + mLocalSize = localWS2DDefault(mGlobalWorkSize, mMaxWorkGroupSize, openCLBackend->getOpenCLRuntime(), kernelName, mKernel).first; + openCLBackend->recordKernel2d(mKernel, mGlobalWorkSize, mLocalSize); + openCLBackend->endRecord(mRecording); + return NO_ERROR; +} + +ErrorCode SelectExecution::onExecute(const std::vector& inputs, const std::vector& outputs) { +#ifdef LOG_VERBOSE + MNN_PRINT("start SelectExecution onExecute..."); +#endif + auto mOpenCLBackend = static_cast(backend()); + +#ifdef ENABLE_OPENCL_TIME_PROFILER + cl::Event event; + runKernel2D(mKernel, mGlobalWorkSize, mLocalSize, + mOpenCLBackend->getOpenCLRuntime(), &event); + + mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Select", event}); +#else + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); +#ifdef LOG_VERBOSE + MNN_PRINT("End SelectExecution onExecute... \n"); +#endif + return NO_ERROR; + } + runKernel2D(mKernel, mGlobalWorkSize, mLocalSize, + mOpenCLBackend->getOpenCLRuntime()); +#endif + +#ifdef LOG_VERBOSE + MNN_PRINT("end SelectExecution onExecute..."); +#endif + return NO_ERROR; +} + +class SelectCreator : public OpenCLBackend::Creator { +public: + virtual Execution* onCreate(const std::vector& inputs, const std::vector& outputs, + const MNN::Op* op, Backend* backend) const override { + return new SelectExecution(backend); + } +}; + +REGISTER_OPENCL_OP_CREATOR(SelectCreator, OpType_Select, IMAGE); +} // namespace OpenCL +} // namespace MNN diff --git a/source/backend/opencl/execution/image/SelectExecution.hpp b/source/backend/opencl/execution/image/SelectExecution.hpp new file mode 100644 index 000000000..699680840 --- /dev/null +++ b/source/backend/opencl/execution/image/SelectExecution.hpp @@ -0,0 +1,41 @@ +// +// SelectBufExecution.hpp +// MNN +// +// Created by MNN on 2023/12/1. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#ifndef SelectExecution_hpp +#define SelectExecution_hpp + +#include "core/Execution.hpp" + +#include +#include "MNN_generated.h" +#include "backend/opencl/core/OpenCLBackend.hpp" +#include "backend/opencl/core/OpenCLRunningUtils.hpp" +#include "backend/opencl/execution/image/CommonExtension.hpp" + +namespace MNN { +namespace OpenCL { + +class SelectExecution : public Execution, public CommonExtension { +public: + SelectExecution(Backend *backend); + virtual ~SelectExecution() = default; + + virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; + virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + +private: + cl::Kernel mKernel; + uint32_t mMaxWorkGroupSize; + std::vector mGlobalWorkSize = {1, 1, 1}; + std::vector mLocalSize = {1, 1, 1}; + std::set mBuildOptions; +}; + +} // namespace OpenCL +} // namespace MNN +#endif /* SelectExecution_hpp */ diff --git a/source/backend/opencl/execution/image/SoftmaxExecution.cpp b/source/backend/opencl/execution/image/SoftmaxExecution.cpp index 74c78a62f..73da3a496 100644 --- a/source/backend/opencl/execution/image/SoftmaxExecution.cpp +++ b/source/backend/opencl/execution/image/SoftmaxExecution.cpp @@ -17,6 +17,8 @@ SoftmaxExecution::SoftmaxExecution(const std::vector &inputs, int axis : Execution(backend) { mAxis = axis; mOpenCLBackend = static_cast(backend); + auto kernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("softmax", "softmax_channel", {"-DSOFTMAX_LOCAL_SIZE=512"}); + mMaxWorkGroupSize = static_cast(mOpenCLBackend->getOpenCLRuntime()->getMaxWorkGroupSize(kernel)); } bool SoftmaxExecution::buildSoftmaxKernel(int localSize) { @@ -47,7 +49,8 @@ int SoftmaxExecution::getLocalSize(int size, int maxGroupSize){ } ErrorCode SoftmaxExecution::onResize(const std::vector &inputs, const std::vector &outputs) { - startRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->startRecord(mRecording); + auto MaxLocalSize = std::min(mOpenCLBackend->getOpenCLRuntime()->getMaxWorkItemSizes()[0], mMaxWorkGroupSize); Tensor *input = inputs[0]; Tensor *output = outputs[0]; @@ -77,14 +80,13 @@ ErrorCode SoftmaxExecution::onResize(const std::vector &inputs, const const int channelBlocks = UP_DIV(outputChannels, 4); const int remainChannels = channelBlocks * 4 - outputChannels; - auto MaxWorkItems = mOpenCLBackend->getOpenCLRuntime()->getMaxWorkItemSizes(); - int localSize = getLocalSize(channel, MaxWorkItems[0]); + int localSize = getLocalSize(channel, MaxLocalSize); if(localSize < 4){ localSize = 1; } if(inputBatch == outside && channel == inputChannels && inside == inputWidth * inputHeight){ mAxis = 1; - localSize = getLocalSize(channelBlocks, MaxWorkItems[0]); + localSize = getLocalSize(channelBlocks, MaxLocalSize); }else if(inputBatch * inputChannels == outside && channel == inputHeight && inside == inputWidth){ mAxis = 2; }else if(inputBatch * inputChannels * inputHeight == outside && channel == inputWidth && inside == 1){ @@ -118,8 +120,8 @@ ErrorCode SoftmaxExecution::onResize(const std::vector &inputs, const if(localSize == 1){ mLocalWorkSize = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, mOpenCLBackend->getOpenCLRuntime(), "softmax", mKernel).first; } - recordKernel3d(mKernel, mGlobalWorkSize, mLocalWorkSize, mOpenCLBackend->getOpenCLRuntime()); - endRecord(mOpenCLBackend->getOpenCLRuntime(), mRecording); + mOpenCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalWorkSize); + mOpenCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -135,9 +137,9 @@ ErrorCode SoftmaxExecution::onExecute(const std::vector &inputs, const mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Softmax", event}); #else - if(mOpenCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); + if(mOpenCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("End SoftmaxExecution onExecute... \n"); #endif @@ -184,7 +186,7 @@ class SoftmaxCreator : public OpenCLBackend::Creator { } } }; -OpenCLCreatorRegister __Softmax_op(OpType_Softmax, IMAGE); +REGISTER_OPENCL_OP_CREATOR(SoftmaxCreator, OpType_Softmax, IMAGE); } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/TrainableParamExecution.cpp b/source/backend/opencl/execution/image/TrainableParamExecution.cpp index 68eebae5e..b983a4842 100644 --- a/source/backend/opencl/execution/image/TrainableParamExecution.cpp +++ b/source/backend/opencl/execution/image/TrainableParamExecution.cpp @@ -64,7 +64,7 @@ ErrorCode TrainableParamExecution::onResize(const std::vector &inputs, return NO_ERROR; } -OpenCLCreatorRegister> __TrainParam_op(OpType_TrainableParam, IMAGE); - +using TrainableParamCreator = TypedCreator; +REGISTER_OPENCL_OP_CREATOR(TrainableParamCreator, OpType_TrainableParam, IMAGE); } } diff --git a/source/backend/opencl/execution/image/UnaryExecution.cpp b/source/backend/opencl/execution/image/UnaryExecution.cpp index bfa69c1e0..a706fb023 100644 --- a/source/backend/opencl/execution/image/UnaryExecution.cpp +++ b/source/backend/opencl/execution/image/UnaryExecution.cpp @@ -32,7 +32,7 @@ ErrorCode UnaryExecution::onResize(const std::vector& inputs, const std auto runtime = openCLBackend->getOpenCLRuntime(); mKernel = runtime->buildKernel("unary", "unary", mBuildOptions); mMaxWorkGroupSize = static_cast(runtime->getMaxWorkGroupSize(mKernel)); - startRecord(runtime, mRecording); + openCLBackend->startRecord(mRecording); std::vector inputShape = tensorShapeFormat(input); std::vector outputShape = tensorShapeFormat(output); @@ -63,8 +63,8 @@ ErrorCode UnaryExecution::onResize(const std::vector& inputs, const std const std::vector lws = localWS3DDefault(mGlobalWorkSize, mMaxWorkGroupSize, openCLBackend->getOpenCLRuntime(), name, mKernel).first; mLocalSize = lws; - recordKernel3d(mKernel, mGlobalWorkSize, mLocalSize, openCLBackend->getOpenCLRuntime()); - endRecord(runtime, mRecording); + openCLBackend->recordKernel3d(mKernel, mGlobalWorkSize, mLocalSize); + openCLBackend->endRecord(mRecording); return NO_ERROR; } @@ -82,9 +82,9 @@ ErrorCode UnaryExecution::onExecute(const std::vector& inputs, const st mOpenCLBackend->getOpenCLRuntime()->pushEvent({"Unary", event}); #else auto openCLBackend = static_cast(backend()); - if(openCLBackend->getOpenCLRuntime()->isUseRecordQueue()){ - if(mOpenCLBackend->getOpenCLRuntime()->isDevideOpRecord()) - mOpenCLBackend->getOpenCLRuntime()->getRecordings()->emplace_back(mRecording); + if(openCLBackend->isUseRecordQueue()){ + if(mOpenCLBackend->isDevideOpRecord()) + mOpenCLBackend->addRecord(mRecording); #ifdef LOG_VERBOSE MNN_PRINT("End UnaryExecution onExecute... \n"); #endif @@ -181,8 +181,9 @@ class UnaryCreator : public OpenCLBackend::Creator { } }; -OpenCLCreatorRegister __UnaryExecution(OpType_UnaryOp, IMAGE); -OpenCLCreatorRegister __SigmoidExecution(OpType_Sigmoid, IMAGE); -OpenCLCreatorRegister __TanhExecution(OpType_TanH, IMAGE); +REGISTER_OPENCL_OP_CREATOR(UnaryCreator, OpType_UnaryOp, IMAGE); +REGISTER_OPENCL_OP_CREATOR(UnaryCreator, OpType_Sigmoid, IMAGE); +REGISTER_OPENCL_OP_CREATOR(UnaryCreator, OpType_TanH, IMAGE); + } // namespace OpenCL } // namespace MNN diff --git a/source/backend/vulkan/buffer/backend/VulkanBackend.cpp b/source/backend/vulkan/buffer/backend/VulkanBackend.cpp index 34caef9b0..f4a0d2c6f 100644 --- a/source/backend/vulkan/buffer/backend/VulkanBackend.cpp +++ b/source/backend/vulkan/buffer/backend/VulkanBackend.cpp @@ -109,6 +109,11 @@ VulkanBackend::VulkanBackend(const VulkanRuntime* runtime, const Backend::Info& if (!mDirect) { mCmdBuffer.reset(runtime->mCmdPool->allocBuffer()); } + std::string deviceName = dev.proty().deviceName; + if(deviceName.find("Apple") != std::string::npos){ + mUseAutoTune = false; + } + mCmdBufferForCopy.reset(runtime->mCmdPool->allocBuffer()); } VulkanBackend::~VulkanBackend() { @@ -287,6 +292,29 @@ static Tensor::DimensionType _convert(MNN_DATA_FORMAT format) { } return Tensor::CAFFE; } +void VulkanBackend::copyToGPUBuffer(const void* src, VkBuffer buffer, VkDeviceSize size, VkDeviceSize offset) const { + _requireHostBuffer(size); + ::memcpy(mHostBuffer->map(), src, size); + mHostBuffer->unmap(); + auto cmdbuffer = mCmdBufferForCopy; + cmdbuffer->begin(0); + VkBufferCopy bufferCopy; + bufferCopy.size = size; + bufferCopy.dstOffset = offset; + bufferCopy.srcOffset = 0; + vkCmdCopyBuffer(cmdbuffer->get(), mHostBuffer->buffer(), buffer, + 1, &bufferCopy); + cmdbuffer->end(); + pushCommand(cmdbuffer->get()); + _finish(); +} +void VulkanBackend::_requireHostBuffer(size_t size) const { + _finish(); + if (nullptr == mHostBuffer || mHostBuffer->size() < size) { + mHostBuffer.reset(new VulkanBuffer(*mRuntime->mMemoryPool, false, size, nullptr, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_SHARING_MODE_EXCLUSIVE, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)); + } +} + void VulkanBackend::onCopyBuffer(const Tensor* srcTensor, const Tensor* dstTensor) const { #ifdef MNN_VULKAN_DEBUG AUTOTIME; @@ -313,7 +341,20 @@ void VulkanBackend::onCopyBuffer(const Tensor* srcTensor, const Tensor* dstTenso MNNCPUCopyBuffer(srcTensor, tempTensor.get()); srcTensor = tempTensor.get(); } - _copyTensorToBuffer(srcTensor, buffer, offset); + auto eleSize = srcTensor->elementSize(); + _requireHostBuffer(eleSize * sizeof(float)); + _copyTensorToBuffer(srcTensor, mHostBuffer.get(), 0); + auto cmdbuffer = mCmdBufferForCopy; + cmdbuffer->begin(0); + VkBufferCopy bufferCopy; + bufferCopy.size = eleSize * sizeof(float); + bufferCopy.dstOffset = offset; + bufferCopy.srcOffset = 0; + vkCmdCopyBuffer(cmdbuffer->get(), mHostBuffer->buffer(), buffer->buffer(), + 1, &bufferCopy); + cmdbuffer->end(); + pushCommand(cmdbuffer->get()); + _finish(); } else if (dstTensor->host() != nullptr) { // gpu->host _finish(); @@ -326,10 +367,22 @@ void VulkanBackend::onCopyBuffer(const Tensor* srcTensor, const Tensor* dstTenso }); dstTensor = tempTensor.get(); } + auto eleSize = dstTensor->elementSize(); + _requireHostBuffer(eleSize * sizeof(float)); auto buffer = reinterpret_cast(srcTensor->deviceId()); auto offset = TensorUtils::getDescribe(srcTensor)->extra.offset; - - _copyBufferToTensor(dstTensor, buffer, offset); + auto cmdbuffer = mCmdBufferForCopy; + cmdbuffer->begin(0); + VkBufferCopy bufferCopy; + bufferCopy.size = eleSize * sizeof(float); + bufferCopy.dstOffset = 0; + bufferCopy.srcOffset = offset; + vkCmdCopyBuffer(cmdbuffer->get(), buffer->buffer(), mHostBuffer->buffer(), + 1, &bufferCopy); + cmdbuffer->end(); + pushCommand(cmdbuffer->get()); + _finish(); + _copyBufferToTensor(dstTensor, mHostBuffer.get(), 0); } else if (srcTensor->deviceId() != 0 && dstTensor->deviceId() != 0) { // gpu->gpu auto format = TensorUtils::getDescribe(dstTensor)->dimensionFormat; @@ -348,6 +401,10 @@ void VulkanBackend::onCopyBuffer(const Tensor* srcTensor, const Tensor* dstTenso _finish(); } } +int VulkanBackend::onSync(Tensor::MapType mtype, bool toCpu, const Tensor* dstTensor) { + _finish(); + return 0; +} bool VulkanBackend::addCreator(OpType t, Creator* c) { auto allKind = getCreatorMap(); @@ -355,4 +412,71 @@ bool VulkanBackend::addCreator(OpType t, Creator* c) { return true; } +bool VulkanBackend::onGetTensorInfo(const Tensor* tensor, void* dstInfo) { + if (nullptr == dstInfo) { + return true; + } + auto vkBuffer = getBuffer(tensor); + auto dst = (MNNVulkanTensorContent*)dstInfo; + dst->buffer = std::get<0>(vkBuffer); + dst->offset = std::get<2>(vkBuffer); + dst->size = std::get<1>(vkBuffer); + return true; +} + +float VulkanBackend::getPipelineTime(const VulkanPipeline* pipeline, SharedPtr des, std::vector groupSize){ + std::shared_ptr cmd; + cmd.reset(const_cast(getPool().allocBuffer())); + cmd->begin(0); + mRuntime->mQueryPool->VulkanCmdResetQueryPool(cmd.get()->get()); + mRuntime->mQueryPool->VulkanCmdWriteTimestamp(cmd.get()->get(), 0); + pipeline->bind(cmd.get()->get(), des->get()); + vkCmdDispatch(cmd.get()->get(), groupSize[0], groupSize[1], groupSize[2]); + mRuntime->mQueryPool->VulkanCmdWriteTimestamp(cmd.get()->get(), 1); + cmd->end(); + getPool().submitAndWait(cmd.get()->get()); + float time = mRuntime->mQueryPool->VulkanGetQueryPoolResults(); + return time; +} + +std::vector VulkanBackend::autoTunePipeline(const VulkanPipeline* pipeline, SharedPtr des, std::vector gws){ + std::vector lws(3, 1); + std::vector groupSize(3, 1); + std::vector maxGroups(3, 1); + int maxGroupSize = mRuntime->mDevice->getMaxComputeWorkGroupInvocations(); + mRuntime->mDevice->getMaxComputeWorkGroupSize(maxGroups); + + std::vector lws_prefer(3, 1); + uint32_t min_cost = UINT_MAX; + + while(lws[2] <= gws[2] && lws[2] <= maxGroups[2]) { + lws[1] = 1; + while(lws[1] <= gws[1] && lws[1] <= maxGroups[1]) { + lws[0] = 1; + while(lws[0] <= gws[0] && lws[0] <= maxGroups[0]) { + if(lws[0]*lws[1]*lws[2] <= maxGroupSize) { + groupSize[0] = UP_DIV(gws[0], lws[0]); + groupSize[1] = UP_DIV(gws[1], lws[1]); + groupSize[2] = UP_DIV(gws[2], lws[2]); + + pipeline->changePipeline(lws); + int cost_time = (int)getPipelineTime(pipeline, des, groupSize); + if(cost_time < min_cost) { + min_cost = cost_time; + lws_prefer[0] = lws[0]; + lws_prefer[1] = lws[1]; + lws_prefer[2] = lws[2]; + } + } + lws[0]*=2; + } + lws[1]*=2; + } + lws[2]*=2; + } + + pipeline->changePipeline(lws_prefer); + return lws_prefer; +} + } // namespace MNN diff --git a/source/backend/vulkan/buffer/backend/VulkanBackend.hpp b/source/backend/vulkan/buffer/backend/VulkanBackend.hpp index 4861ce30c..469c1a481 100644 --- a/source/backend/vulkan/buffer/backend/VulkanBackend.hpp +++ b/source/backend/vulkan/buffer/backend/VulkanBackend.hpp @@ -33,6 +33,8 @@ class VulkanBackend : public Backend { virtual const Runtime* getRuntime() override { return mRuntime; } + virtual int onSync(Tensor::MapType mtype, bool toCpu, const Tensor* dstTensor) override; + const VulkanPipelineFactory* getPipelineFactory() const; const VulkanPipeline* getPipeline(const std::string& key, const std::vector& types, const std::vector& localSize = std::vector()) const; @@ -46,6 +48,15 @@ class VulkanBackend : public Backend { BufferAllocator* getDynamicMemoryPool() const { return mDynamicBufferPool.get(); } + virtual bool onGetTensorInfo(const Tensor* tensor, void* dstInfo) override; + + std::vector autoTunePipeline(const VulkanPipeline* pipeline, SharedPtr des, std::vector gws); + + float getPipelineTime(const VulkanPipeline* pipeline, SharedPtr des, std::vector groupSize); + + bool isSupportAutotune(){ + return mUseAutoTune; + } class Creator { public: @@ -78,12 +89,16 @@ class VulkanBackend : public Backend { VULKAN_TENSOR getBuffer(const Tensor* tensor) const; std::shared_ptr allocUniform(const void* src = nullptr, int size = 0); void recycleUniform(std::shared_ptr buffer); + void copyToGPUBuffer(const void* src, VkBuffer buffer, VkDeviceSize size, VkDeviceSize offset) const; const VulkanDevice& device() const; private: void _finish() const; + void _requireHostBuffer(size_t size) const; + mutable std::shared_ptr mHostBuffer; std::shared_ptr mCmdBuffer; + std::shared_ptr mCmdBufferForCopy; std::shared_ptr mDynamicBufferPool; mutable std::vector mCmdBuffers; @@ -92,6 +107,7 @@ class VulkanBackend : public Backend { bool mDirect; const VulkanRuntime* mRuntime; + bool mUseAutoTune = true; }; diff --git a/source/backend/vulkan/buffer/execution/VulkanConvolutionImpl.cpp b/source/backend/vulkan/buffer/execution/VulkanConvolutionImpl.cpp index f71f6494f..7cc0e514d 100644 --- a/source/backend/vulkan/buffer/execution/VulkanConvolutionImpl.cpp +++ b/source/backend/vulkan/buffer/execution/VulkanConvolutionImpl.cpp @@ -98,9 +98,8 @@ class VulkanConvolutionSlideWindows : public VulkanConvolutionCommon { return; } { - auto sourcePtr = reinterpret_cast( sourceWeight->deviceId())->map(TensorUtils::getDescribe(sourceWeight.get())->extra.offset); - ::memcpy(sourcePtr, weightPtr, sourceWeight->size()); - reinterpret_cast( sourceWeight->deviceId())->unmap(); + auto vkTensor = extra->getBuffer(sourceWeight.get()); + extra->copyToGPUBuffer(weightPtr, std::get<0>(vkTensor), sourceWeight->size(), std::get<2>(vkTensor)); } std::shared_ptr prearrangeCmd( vkBn->getPool().allocBuffer()); for (auto& reg : des->regions) { diff --git a/source/backend/vulkan/buffer/execution/VulkanDeconvolution.cpp b/source/backend/vulkan/buffer/execution/VulkanDeconvolution.cpp index 24546054e..a79ea9d7c 100644 --- a/source/backend/vulkan/buffer/execution/VulkanDeconvolution.cpp +++ b/source/backend/vulkan/buffer/execution/VulkanDeconvolution.cpp @@ -123,9 +123,7 @@ VulkanDeconvolution* VulkanDeconvolution::create(Backend* bn, const Convolution2 return nullptr; } auto tempWeightBuffer = reinterpret_cast(tempWeightTensor->deviceId()); - auto tempReorderWeight = (float*)tempWeightBuffer->map(TensorUtils::getDescribe(tempWeightTensor.get())->extra.offset); - ::memcpy(tempReorderWeight, tempWeight, tempWeightSize * sizeof(float)); - tempWeightBuffer->unmap(); + vkBn->copyToGPUBuffer(tempWeight, tempWeightBuffer->buffer(), tempWeightSize * sizeof(float), TensorUtils::getDescribe(tempWeightTensor.get())->extra.offset); std::shared_ptr prearrangeCmd( vkBn->getPool().allocBuffer()); for (auto& reg : des->regions) { reg.origin = tempWeightTensor.get(); diff --git a/source/backend/vulkan/buffer/execution/VulkanFuse.cpp b/source/backend/vulkan/buffer/execution/VulkanFuse.cpp index 7f11a9b8e..9e8df252b 100644 --- a/source/backend/vulkan/buffer/execution/VulkanFuse.cpp +++ b/source/backend/vulkan/buffer/execution/VulkanFuse.cpp @@ -22,6 +22,7 @@ class VulkanFuse : public VulkanBasicExecution { mOutputBinding.resize(outputSize); mInputBinding.resize(inputSize); mGroupSize.resize(3); + mGlobalSize.resize(3); // Find shader const uint8_t* data = nullptr; size_t dataSize = 0; @@ -33,6 +34,18 @@ class VulkanFuse : public VulkanBasicExecution { break; } } + for (int i=0; iattr()->size(); ++i) { + auto attr = extra->attr()->GetAs(i); + if (attr->key()->str() == "global_size") { + // Use Auto set group size + auto ptr = attr->tensor()->int32s()->data(); + mGlobalSize[0] = ptr[0]; + mGlobalSize[1] = ptr[1]; + mGlobalSize[2] = ptr[2]; + mNeedAutoTuning = true; + break; + } + } for (int i=0; iattr()->size(); ++i) { auto attr = extra->attr()->GetAs(i); if (attr->key()->str() == "group_size") { @@ -40,6 +53,7 @@ class VulkanFuse : public VulkanBasicExecution { mGroupSize[0] = ptr[0]; mGroupSize[1] = ptr[1]; mGroupSize[2] = ptr[2]; + break; } } @@ -58,10 +72,12 @@ class VulkanFuse : public VulkanBasicExecution { auto attr = extra->attr()->GetAs(i); if (attr->key()->str() == "input") { auto list = attr->list()->i()->data(); - if (0 == list[0]) { - mInputBinding[list[1]] = attr->i(); - } else { - mOutputBinding[list[1]] = attr->i(); + if (list[1] >= 0) { + if (0 == list[0]) { + mInputBinding[list[1]] = attr->i(); + } else { + mOutputBinding[list[1]] = attr->i(); + } } if (attr->b()) { types[attr->i()] = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; @@ -94,13 +110,14 @@ class VulkanFuse : public VulkanBasicExecution { MNN_ASSERT(false); break; } - std::shared_ptr vkBuffer(new VulkanBuffer(vkBn->getMemoryPool(), false, bufferSize, result, usageBit)); + std::shared_ptr vkBuffer(new VulkanBuffer(vkBn->getMemoryPool(), false, bufferSize, nullptr, usageBit, VK_SHARING_MODE_EXCLUSIVE, 0)); + vkBn->copyToGPUBuffer(result, vkBuffer->buffer(), bufferSize, 0); mConstIndides.emplace_back(std::make_pair(attr->i(), vkBuffer)); continue; } } mPipeline = factory->createComputePipeline(data, dataSize, types, std::vector{}); - mDescriptorSet.reset(mPipeline->createSet()); + mDescriptorSet = mPipeline->createSet(); } virtual ~VulkanFuse() { // Remove set firstly before destroy pipeline @@ -118,18 +135,26 @@ class VulkanFuse : public VulkanBasicExecution { for (auto& iter : mConstIndides) { mDescriptorSet->writeBuffer(iter.second->buffer(), iter.first, iter.second->size()); } + if (mNeedAutoTuning) { + auto localSize = vkBn->autoTunePipeline(mPipeline.get(), mDescriptorSet, mGlobalSize); + mPipeline->changePipeline(localSize); + mGroupSize[0] = UP_DIV(mGlobalSize[0], localSize[0]); + mGroupSize[1] = UP_DIV(mGlobalSize[1], localSize[1]); + mGroupSize[2] = UP_DIV(mGlobalSize[2], localSize[2]); + } mPipeline->bind(cmdBuffer->get(), mDescriptorSet->get()); vkCmdDispatch(cmdBuffer->get(), mGroupSize[0], mGroupSize[1], mGroupSize[2]); return NO_ERROR; } private: std::vector mGroupSize; + std::vector mGlobalSize; std::vector mInputBinding; std::vector mOutputBinding; - std::vector> mInputUniforms; std::vector>> mConstIndides; SharedPtr mPipeline; - std::shared_ptr mDescriptorSet; + SharedPtr mDescriptorSet; + bool mNeedAutoTuning = false; }; class VulkanFuseCreator : public VulkanBackend::Creator { diff --git a/source/backend/vulkan/buffer/execution/VulkanLayernorm.cpp b/source/backend/vulkan/buffer/execution/VulkanLayernorm.cpp index e9f273a6e..300688673 100644 --- a/source/backend/vulkan/buffer/execution/VulkanLayernorm.cpp +++ b/source/backend/vulkan/buffer/execution/VulkanLayernorm.cpp @@ -36,8 +36,8 @@ VulkanLayernorm::VulkanLayernorm(const Op* op, Backend* backend) : VulkanBasicEx return; } const float* gamma_data = layer_norm_param->gamma()->data(); - memcpy(reinterpret_cast(mGamma->deviceId())->map(TensorUtils::getDescribe(mGamma.get())->extra.offset), gamma_data, size * sizeof(float)); - reinterpret_cast(mGamma->deviceId())->unmap(); + auto gammaBuffer = vkbackend->getBuffer(mGamma.get()); + vkbackend->copyToGPUBuffer(gamma_data, std::get<0>(gammaBuffer), std::get<1>(gammaBuffer), std::get<2>(gammaBuffer)); if (layer_norm_param->beta()->size() != size) { MNN_ERROR("Size of gamma and beta are not match in LayerNorm.\n"); @@ -50,8 +50,8 @@ VulkanLayernorm::VulkanLayernorm(const Op* op, Backend* backend) : VulkanBasicEx return; } const float* beta_data = layer_norm_param->beta()->data(); - memcpy(reinterpret_cast(mBias->deviceId())->map(TensorUtils::getDescribe(mBias.get())->extra.offset), beta_data, size * sizeof(float)); - reinterpret_cast(mBias->deviceId())->unmap(); + auto betaBuffer = vkbackend->getBuffer(mBias.get()); + vkbackend->copyToGPUBuffer(beta_data, std::get<0>(betaBuffer), std::get<1>(betaBuffer), std::get<2>(betaBuffer)); } if (!mHasScale) { diff --git a/source/backend/vulkan/buffer/execution/VulkanMatMul.cpp b/source/backend/vulkan/buffer/execution/VulkanMatMul.cpp index d4f5230df..9822d6226 100644 --- a/source/backend/vulkan/buffer/execution/VulkanMatMul.cpp +++ b/source/backend/vulkan/buffer/execution/VulkanMatMul.cpp @@ -14,7 +14,7 @@ VulkanMatMul::VulkanMatMul(bool transposeA, bool transposeB, Backend* bn, bool h mTransposeA = transposeA; mTransposeB = transposeB; auto vkbackend = static_cast(bn); - mParam.reset(new VulkanBuffer(vkbackend->getMemoryPool(), false, sizeof(VulkanBatchMatMulInfo), nullptr, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)); + mParam = vkbackend->allocUniform(); mHasBias = hasBias; if (!mHasBias) { mPipeline = vkbackend->getPipeline("glsl_matmulunit_comp", { @@ -41,6 +41,11 @@ VulkanMatMul::VulkanMatMul(bool transposeA, bool transposeB, Backend* bn, bool h } mDescribe.reset(mPipeline->createSet()); } +VulkanMatMul::~ VulkanMatMul() { + auto vkbackend = static_cast(backend()); + vkbackend->recycleUniform(mParam); +} + ErrorCode VulkanMatMul::onEncode(const std::vector &inputs, const std::vector &outputs, const VulkanCommandPool::Buffer *cmdBuffer) { const Tensor* A = inputs[0]; @@ -60,6 +65,7 @@ ErrorCode VulkanMatMul::onEncode(const std::vector &inputs, const std: } int totalSize = e * h; auto param = reinterpret_cast(mParam->map()); + ::memset(param, 0, sizeof(VulkanBatchMatMulInfo)); param->size[3] = 1; param->size[0] = e; param->size[1] = l; @@ -70,7 +76,6 @@ ErrorCode VulkanMatMul::onEncode(const std::vector &inputs, const std: param->stride_c[0] = 0; param->stride_c[1] = 0; param->stride_c[2] = 1; - param->stride_c[0] = 0; param->iter[0] = -1; param->iter[1] = -1; param->iter[2] = -1; diff --git a/source/backend/vulkan/buffer/execution/VulkanMatMul.hpp b/source/backend/vulkan/buffer/execution/VulkanMatMul.hpp index f52d0fbfa..745f52960 100644 --- a/source/backend/vulkan/buffer/execution/VulkanMatMul.hpp +++ b/source/backend/vulkan/buffer/execution/VulkanMatMul.hpp @@ -16,9 +16,7 @@ namespace MNN { class VulkanMatMul : public VulkanBasicExecution { public: VulkanMatMul(bool transposeA, bool transposeB, Backend* vkBn, bool hasBias); - ~ VulkanMatMul() { - // Do nothing - } + ~ VulkanMatMul(); virtual ErrorCode onEncode(const std::vector &inputs, const std::vector &outputs, const VulkanCommandPool::Buffer *cmdBuffer) override; diff --git a/source/backend/vulkan/component/VulkanCommandPool.cpp b/source/backend/vulkan/component/VulkanCommandPool.cpp index 93289b089..b7c9a6551 100644 --- a/source/backend/vulkan/component/VulkanCommandPool.cpp +++ b/source/backend/vulkan/component/VulkanCommandPool.cpp @@ -81,6 +81,10 @@ void VulkanCommandPool::Buffer::barrierSource(VkBuffer source, size_t start, siz barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT; barrier.dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_SHADER_WRITE_BIT; break; + case WRITE_READ: + barrier.srcAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_TRANSFER_READ_BIT; + barrier.dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_SHADER_WRITE_BIT; + break; default: break; } diff --git a/source/backend/vulkan/component/VulkanCommandPool.hpp b/source/backend/vulkan/component/VulkanCommandPool.hpp index 60042dd5e..4f96d637e 100644 --- a/source/backend/vulkan/component/VulkanCommandPool.hpp +++ b/source/backend/vulkan/component/VulkanCommandPool.hpp @@ -33,6 +33,7 @@ class VulkanCommandPool : public NonCopyable { enum BarrierType { READ_WRITE = 0, WRITE_WRITE, + WRITE_READ, }; void barrierSource(VkBuffer source, size_t start, size_t end, BarrierType type = READ_WRITE) const; void barrierSource(std::tuple, BarrierType type = READ_WRITE) const; diff --git a/source/backend/vulkan/component/VulkanDevice.cpp b/source/backend/vulkan/component/VulkanDevice.cpp index 75fde6588..6fdf965d8 100644 --- a/source/backend/vulkan/component/VulkanDevice.cpp +++ b/source/backend/vulkan/component/VulkanDevice.cpp @@ -94,6 +94,10 @@ VulkanDevice::VulkanDevice(std::shared_ptr instance, const std:: auto& p = properties[i]; FUNC_PRINT_ALL(p.extensionName, s); } + FUNC_PRINT(mDeviceProty.limits.maxComputeWorkGroupSize[0]); + FUNC_PRINT(mDeviceProty.limits.maxComputeWorkGroupCount[0]); + FUNC_PRINT(mDeviceProty.limits.maxComputeWorkGroupInvocations); + FUNC_PRINT(mDeviceProty.limits.maxComputeSharedMemorySize); #endif } diff --git a/source/backend/vulkan/component/VulkanDevice.hpp b/source/backend/vulkan/component/VulkanDevice.hpp index 92c49f333..32a9d42f8 100644 --- a/source/backend/vulkan/component/VulkanDevice.hpp +++ b/source/backend/vulkan/component/VulkanDevice.hpp @@ -155,6 +155,22 @@ class VulkanDevice : public NonCopyable { const bool success() const { return (VK_NULL_HANDLE != mDevice); } + + const float getTimestampPeriod() const { + return mDeviceProty.limits.timestampPeriod; + } + + const int getMaxComputeWorkGroupInvocations() const { + return mDeviceProty.limits.maxComputeWorkGroupInvocations; + } + + const void getMaxComputeWorkGroupSize(std::vector &groups) const{ + if(groups.size() == 3){ + groups[0] = mDeviceProty.limits.maxComputeWorkGroupSize[0]; + groups[1] = mDeviceProty.limits.maxComputeWorkGroupSize[1]; + groups[2] = mDeviceProty.limits.maxComputeWorkGroupSize[2]; + } + } private: const VkResult enumerateDeviceExtensionProperties(const VkPhysicalDevice& dev, diff --git a/source/backend/vulkan/component/VulkanPipeline.cpp b/source/backend/vulkan/component/VulkanPipeline.cpp index fdbd2fc1c..c73a6b8bf 100644 --- a/source/backend/vulkan/component/VulkanPipeline.cpp +++ b/source/backend/vulkan/component/VulkanPipeline.cpp @@ -41,7 +41,7 @@ VulkanPipeline* VulkanPipelineFactory::createGraphicPipeline(SharedPtr& types, const std::vector& localSize) const { SharedPtr shader = VulkanShaderModule::create(mDevice, (const uint32_t*)data, dataSize); @@ -59,7 +59,7 @@ VulkanPipeline* VulkanPipelineFactory::createComputePipeline(const uint8_t* data if (localSize.size() > 0) { // FUNC_PRINT(localSize.size()); for (int i = 0; i < localSize.size(); i++) { - VkSpecializationMapEntry entry = {(uint32_t)(i + 1), (uint32_t)(sizeof(uint32_t) * i), + VkSpecializationMapEntry entry = {(uint32_t)(i), (uint32_t)(sizeof(uint32_t) * i), sizeof(uint32_t)}; /*id,offset,length*/ specializationMapEntry.push_back(entry); } @@ -73,13 +73,21 @@ VulkanPipeline* VulkanPipelineFactory::createComputePipeline(const uint8_t* data FUNC_PRINT(res); return nullptr; } - return new VulkanPipeline(mDevice, pipeline, layout, VK_PIPELINE_BIND_POINT_COMPUTE); + return new VulkanPipeline(mDevice, pipeline, layout, VK_PIPELINE_BIND_POINT_COMPUTE, shader, mCache); } const VulkanPipeline* VulkanPipelineFactory::getPipeline(const std::string& key, const std::vector& types, - const std::vector& localSize) const { - auto iter = mPipelines.find(key); + const std::vector& localSize, + const bool separate) const { + std::string pipelineKey = key; + for(int i = 0; i < localSize.size(); ++i){ + pipelineKey += "_" + std::to_string(localSize[i]); + } + if(separate){ + pipelineKey += "_tuned"; + } + auto iter = mPipelines.find(pipelineKey); if (iter != mPipelines.end()) { return iter->second.get(); } @@ -90,15 +98,17 @@ const VulkanPipeline* VulkanPipelineFactory::getPipeline(const std::string& key, } auto pipeline = createComputePipeline((uint8_t*)content.first, content.second, types, localSize); SharedPtr resPipeline = pipeline; - mPipelines.insert(std::make_pair(key, resPipeline)); + mPipelines.insert(std::make_pair(pipelineKey, resPipeline)); return pipeline; } -VulkanPipeline::VulkanPipeline(const VulkanDevice& dev, VkPipeline p, SharedPtr layout, VkPipelineBindPoint type) +VulkanPipeline::VulkanPipeline(const VulkanDevice& dev, VkPipeline p, SharedPtr layout, VkPipelineBindPoint type, SharedPtr shader, SharedPtr cache) : mDevice(dev) { mPipeline = p; mLayout = layout; mType = type; + mShader = shader; + mCache = cache; } VulkanPipeline::~VulkanPipeline() { @@ -116,6 +126,31 @@ VulkanLayout::DescriptorSet* VulkanPipeline::createSet() const { return mLayout->createSet(); } +void VulkanPipeline::changePipeline(const std::vector& localSize) const{ + VkPipeline pipeline = VK_NULL_HANDLE; + /*for localSize_x_id = 0,localSize_y_id = 1,localSize_z_id = 2*/ + std::vector specializationMapEntry; /*localSize data description*/ + std::shared_ptr specializationInfo = std::make_shared(); + if (localSize.size() > 0) { + // FUNC_PRINT(localSize.size()); + for (int i = 0; i < localSize.size(); i++) { + VkSpecializationMapEntry entry = {(uint32_t)(i), (uint32_t)(sizeof(uint32_t) * i), + sizeof(uint32_t)}; /*id,offset,length*/ + specializationMapEntry.push_back(entry); + } + specializationInfo->pData = localSize.data(); + specializationInfo->dataSize = localSize.size() * sizeof(uint32_t); /*bytes*/ + specializationInfo->pMapEntries = specializationMapEntry.data(); + specializationInfo->mapEntryCount = specializationMapEntry.size(); + } + + auto res = mDevice.createComputePipeline(pipeline, mShader->get(), mLayout->get(), mCache->get(), specializationInfo.get()); + if (VK_SUCCESS != res) { + FUNC_PRINT(1); + } + mPipeline = pipeline; +} + VulkanLayout::DescriptorSet* VulkanLayout::createSet() const { VkDescriptorPool descriptorPool; // FUNC_PRINT(poolInfo.poolSizeCount); diff --git a/source/backend/vulkan/component/VulkanPipeline.hpp b/source/backend/vulkan/component/VulkanPipeline.hpp index 817a428b8..c3b114786 100644 --- a/source/backend/vulkan/component/VulkanPipeline.hpp +++ b/source/backend/vulkan/component/VulkanPipeline.hpp @@ -150,7 +150,7 @@ class VulkanGraphicPipelineCache : public RefCount { }; class VulkanPipeline : public RefCount { public: - VulkanPipeline(const VulkanDevice& dev, VkPipeline p, SharedPtr layout, VkPipelineBindPoint type); + VulkanPipeline(const VulkanDevice& dev, VkPipeline p, SharedPtr layout, VkPipelineBindPoint type, SharedPtr shader, SharedPtr cache); virtual ~VulkanPipeline(); VkPipeline get() const { @@ -159,12 +159,15 @@ class VulkanPipeline : public RefCount { void bind(VkCommandBuffer buffer, VkDescriptorSet describeSet) const; VulkanLayout::DescriptorSet* createSet() const; + void changePipeline(const std::vector& localSize) const; private: const VulkanDevice& mDevice; - VkPipeline mPipeline; + mutable VkPipeline mPipeline; VkPipelineBindPoint mType; SharedPtr mLayout; + SharedPtr mShader; + SharedPtr mCache; }; class VulkanPipelineFactory : public NonCopyable { @@ -172,7 +175,7 @@ class VulkanPipelineFactory : public NonCopyable { VulkanPipelineFactory(const VulkanDevice& dev); ~VulkanPipelineFactory(); const VulkanPipeline* getPipeline(const std::string& key, const std::vector& types, - const std::vector& localSize = std::vector()) const; + const std::vector& localSize = std::vector(), const bool separate = false) const; VulkanPipeline* createGraphicPipeline(SharedPtr layout, VulkanGraphicPipelineCache* cache) const; VulkanPipeline* createComputePipeline(const uint8_t* data, size_t dataSize, const std::vector& types, const std::vector& localSize) const; SharedPtr createShader(const std::string& key) const; diff --git a/source/backend/vulkan/component/VulkanQueryPool.cpp b/source/backend/vulkan/component/VulkanQueryPool.cpp new file mode 100644 index 000000000..82ef40a41 --- /dev/null +++ b/source/backend/vulkan/component/VulkanQueryPool.cpp @@ -0,0 +1,41 @@ +// +// OpenCLRunningUtils.cpp +// MNN +// +// Created by MNN on 2023/10/27. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#include "VulkanQueryPool.hpp" + +namespace MNN { +VulkanQueryPool::VulkanQueryPool(const VulkanDevice& dev) : mDevice(dev){ + VkQueryPoolCreateInfo queryPoolCreateInfo = {}; + queryPoolCreateInfo.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO; + queryPoolCreateInfo.queryType = VK_QUERY_TYPE_TIMESTAMP; + queryPoolCreateInfo.queryCount = 2; // 需要两个时间戳,一个用于开始,一个用于结束 + + vkCreateQueryPool(mDevice.get(), &queryPoolCreateInfo, nullptr, &queryPool); +} + +VulkanQueryPool::~VulkanQueryPool(){ + vkDestroyQueryPool(mDevice.get(), queryPool, nullptr); +} + +void VulkanQueryPool::VulkanCmdResetQueryPool(VkCommandBuffer commandBuffer){ + vkCmdResetQueryPool(commandBuffer, queryPool, 0, 2); +} + +void VulkanQueryPool::VulkanCmdWriteTimestamp(VkCommandBuffer commandBuffer, int index){ + vkCmdWriteTimestamp(commandBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, queryPool, index); +} + +float VulkanQueryPool::VulkanGetQueryPoolResults(){ + uint64_t timestamps[2]; + vkGetQueryPoolResults(mDevice.get(), queryPool, 0, 2, sizeof(uint64_t) * 2, timestamps, sizeof(uint64_t), VK_QUERY_RESULT_WAIT_BIT); + + float timestampPeriod = mDevice.getTimestampPeriod(); + float executionTime = (timestamps[1] - timestamps[0]) * timestampPeriod * 1e-3f; // 微妙 + return executionTime; +} +} // namespace MNN diff --git a/source/backend/vulkan/component/VulkanQueryPool.hpp b/source/backend/vulkan/component/VulkanQueryPool.hpp new file mode 100644 index 000000000..a0a6876e9 --- /dev/null +++ b/source/backend/vulkan/component/VulkanQueryPool.hpp @@ -0,0 +1,33 @@ +// +// VulkanBasicExecution.hpp +// MNN +// +// Created by MNN on 2023/10/27. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#ifndef VulkanQueryPool_hpp +#define VulkanQueryPool_hpp + +#include "core/NonCopyable.hpp" +#include "backend/vulkan/vulkan/vulkan_wrapper.h" +#include "VulkanDevice.hpp" + +namespace MNN { + +class VulkanQueryPool : public NonCopyable { +public: + VulkanQueryPool(const VulkanDevice& dev); + virtual ~VulkanQueryPool(); + + void VulkanCmdResetQueryPool(VkCommandBuffer commandBuffer); + void VulkanCmdWriteTimestamp(VkCommandBuffer commandBuffer, int index); + float VulkanGetQueryPoolResults(); + +private: + const VulkanDevice& mDevice; + VkQueryPool queryPool; +}; + +} // namespace MNN +#endif /* VulkanQueryPool_hpp */ diff --git a/source/backend/vulkan/image/backend/VulkanBackend.cpp b/source/backend/vulkan/image/backend/VulkanBackend.cpp index c9acd17cc..37df01b9b 100644 --- a/source/backend/vulkan/image/backend/VulkanBackend.cpp +++ b/source/backend/vulkan/image/backend/VulkanBackend.cpp @@ -201,7 +201,7 @@ Execution* VulkanBackend::onCreate(const std::vector& inputs, const std } bool valid = true; for (int i=0; itype(), i)) { + if (!OpCommonUtils::opNeedContent(op, i)) { continue; } auto t = inputs[i]; diff --git a/source/backend/vulkan/runtime/VulkanRuntime.cpp b/source/backend/vulkan/runtime/VulkanRuntime.cpp index 77bf97d8a..d1257faaa 100644 --- a/source/backend/vulkan/runtime/VulkanRuntime.cpp +++ b/source/backend/vulkan/runtime/VulkanRuntime.cpp @@ -18,7 +18,7 @@ class VulkanBufferAllocator : public BufferAllocator::Allocator { // Do nothing } virtual MemChunk onAlloc(size_t size, size_t align) override { - VulkanBuffer* newBuffer = new VulkanBuffer(mPool, false, size, nullptr, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT); + VulkanBuffer* newBuffer = new VulkanBuffer(mPool, false, size, nullptr, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_SHARING_MODE_EXCLUSIVE, 0); return MemChunk(newBuffer, 0); } virtual void onRelease(MemChunk ptr) override { @@ -95,6 +95,7 @@ VulkanRuntime::VulkanRuntime(const Backend::Info& info) { mSampler = std::make_shared(dev, VK_FILTER_NEAREST, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER); mClampSampler = std::make_shared(dev, VK_FILTER_NEAREST, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE); mPipelineFactory = std::make_shared(dev); + mQueryPool = std::make_shared(dev); } VulkanRuntime::~VulkanRuntime() { @@ -102,6 +103,7 @@ VulkanRuntime::~VulkanRuntime() { while (!mUniformCache.empty()) { mUniformCache.pop(); } + mQueryPool = nullptr; mCmdPool = nullptr; mSampler = nullptr; mClampSampler = nullptr; diff --git a/source/backend/vulkan/runtime/VulkanRuntime.hpp b/source/backend/vulkan/runtime/VulkanRuntime.hpp index 3be26f72b..ab9edbab4 100644 --- a/source/backend/vulkan/runtime/VulkanRuntime.hpp +++ b/source/backend/vulkan/runtime/VulkanRuntime.hpp @@ -16,6 +16,7 @@ #include "VulkanImage.hpp" #include "VulkanInstance.hpp" #include "VulkanPipeline.hpp" +#include "VulkanQueryPool.hpp" #include "core/Backend.hpp" #define MNN_VULKAN #include @@ -42,6 +43,7 @@ class VulkanRuntime : public Runtime { std::shared_ptr mSampler; std::shared_ptr mClampSampler; std::shared_ptr mInstance; + std::shared_ptr mQueryPool; std::shared_ptr mDevice; std::queue> mUniformCache; // Limit Uniform cache size = mUniformSize * mCacheUniformLimitSize B diff --git a/source/core/Backend.hpp b/source/core/Backend.hpp index e2b79eefd..31d845940 100644 --- a/source/core/Backend.hpp +++ b/source/core/Backend.hpp @@ -160,6 +160,15 @@ class Backend : public NonCopyable { * @return MemObj for release, if failed, return nullptr. */ virtual MemObj* onAcquire(const Tensor* tensor, StorageType storageType) = 0; + + /** + * @brief get buffer from tensor directly + * @param tensor buffer provider. + * @return support or not + */ + virtual bool onGetTensorInfo(const Tensor* tensor, void* dstInfo) { + return false; + } /** * @brief clear all dynamic buffers. diff --git a/source/core/BackendRegister.cpp b/source/core/BackendRegister.cpp index d0c2c3324..4ae2eaf93 100644 --- a/source/core/BackendRegister.cpp +++ b/source/core/BackendRegister.cpp @@ -19,6 +19,11 @@ extern void registerCPURuntimeCreator(); #if MNN_METAL_ENABLED extern void registerMetalRuntimeCreator(); #endif +#if MNN_OPENCL_ENABLED +namespace OpenCL { +extern void registerOpenCLRuntimeCreator(); +} +#endif #if MNN_COREML_ENABLED extern void registerCoreMLRuntimeCreator(); #endif @@ -43,6 +48,9 @@ void registerBackend() { #ifdef MNN_NNAPI_ENABLED registerNNAPIRuntimeCreator(); #endif +#if MNN_OPENCL_ENABLED + OpenCL::registerOpenCLRuntimeCreator(); +#endif #if MNN_METAL_ENABLED registerMetalRuntimeCreator(); #endif diff --git a/source/core/OpCommonUtils.cpp b/source/core/OpCommonUtils.cpp index 0edc49f9a..43b8d3f83 100644 --- a/source/core/OpCommonUtils.cpp +++ b/source/core/OpCommonUtils.cpp @@ -462,7 +462,8 @@ int OpCommonUtils::computeStride(int32_t* strides, const int* shape, int length) return stride; } -bool OpCommonUtils::opNeedContent(int type, int index) { +bool OpCommonUtils::opNeedContent(const MNN::Op* op, int index) { + int type = op->type(); switch (type) { case OpType_ZerosLike: case OpType_ZeroGrad: @@ -488,10 +489,27 @@ bool OpCommonUtils::opNeedContent(int type, int index) { break; #ifdef MNN_SUPPORT_RENDER case OpType_RasterAndInterpolate: + { if (0 == index) { - return false; + int type = 4; + if (op->main_type() == OpParameter_Extra) { + auto extra = op->main_as_Extra(); + if (nullptr != extra->attr()) { + for (int i=0; iattr()->size(); ++i) { + auto attr = extra->attr()->GetAs(i); + if (attr->key()->str() == "primitiveType") { + type = attr->i(); + break; + } + } + } + } + if (type <= 4) { + return false; + } } break; + } #endif default: break; diff --git a/source/core/OpCommonUtils.hpp b/source/core/OpCommonUtils.hpp index 2321b48b6..484c8bd7b 100644 --- a/source/core/OpCommonUtils.hpp +++ b/source/core/OpCommonUtils.hpp @@ -37,7 +37,7 @@ class MNN_PUBLIC OpCommonUtils { const SPLITS& dstSplits, int pack = 4, bool swapnc = false, bool swapcw = false); static void turnToPackRegion(const Tensor::InsideDescribe::Region& region, Tensor::InsideDescribe::Region& c4Region, const SPLITS& srcSplits, const SPLITS& dstSplits, int pack = 4, bool swapnc = false); - static bool opNeedContent(int type, int index); + static bool opNeedContent(const MNN::Op* op, int index); // For lowp CPU Backend static bool opCompabilityForLowp(const Op* op); diff --git a/source/core/Pipeline.cpp b/source/core/Pipeline.cpp index b24cc4cf1..ac61b44b3 100644 --- a/source/core/Pipeline.cpp +++ b/source/core/Pipeline.cpp @@ -424,7 +424,7 @@ ErrorCode Pipeline::encode(bool supportDebug, bool permitCodegen) { } } else { for (int i = 0; i < cmd.inputs.size(); i++) { - if (OpCommonUtils::opNeedContent(opType, i) && inputs[i]->getType() != halide_type_of()) { + if (OpCommonUtils::opNeedContent(cmd.op, i) && inputs[i]->getType() != halide_type_of()) { bool needCast = CPUBackend::getDataType(inputs[i]) != runType; if (needCast) { cmd.inputs[i] = makeCommand(info.executeBuffer, inputs[i], runType); @@ -964,7 +964,7 @@ ErrorCode Pipeline::allocMemory(bool firstMalloc, bool forbidReplace) { #ifdef MNN_PIPELINE_DEBUG MNN_ERROR("Pipeline Resize error: %d\n", code); #endif - if (!iter.info.get()) { + if (iter.info.get()) { MNN_ERROR("Resize error for type = %s, name = %s \n", iter.info->type().c_str(), iter.info->name().c_str()); } return code; diff --git a/source/core/Schedule.cpp b/source/core/Schedule.cpp index 8f8d4ecff..b7a7bdca1 100644 --- a/source/core/Schedule.cpp +++ b/source/core/Schedule.cpp @@ -39,6 +39,7 @@ MNNForwardType Schedule::getApprociateType(const ScheduleConfig& config) { priorityList.push_back(MNN_FORWARD_CUDA); //CUDA priorityList.push_back(MNN_FORWARD_OPENCL); //OpenCL priorityList.push_back(MNN_FORWARD_METAL); //METAL + priorityList.push_back(MNN_FORWARD_VULKAN); //Vulkan priorityList.push_back(MNN_FORWARD_CPU); //CPU for (auto bn : priorityList) { diff --git a/source/core/Tensor.cpp b/source/core/Tensor.cpp index 9ddbc8d91..8ba3bd06d 100644 --- a/source/core/Tensor.cpp +++ b/source/core/Tensor.cpp @@ -477,5 +477,15 @@ void Tensor::destroy(Tensor* tensor) { delete tensor; } } +bool Tensor::getDeviceInfo(void* dst, int type) const { + auto nativeDescribe = mDescribe->mContent.get(); + if (nullptr == nativeDescribe->getBackend()) { + return false; + } + if (nativeDescribe->getBackend()->type() != type) { + return false; + } + return nativeDescribe->getBackend()->onGetTensorInfo(this, dst); +} } // namespace MNN diff --git a/source/geometry/GeometryBinary.cpp b/source/geometry/GeometryBinary.cpp index 5d69732b5..3033e2d95 100644 --- a/source/geometry/GeometryBinary.cpp +++ b/source/geometry/GeometryBinary.cpp @@ -44,12 +44,12 @@ class GeometryBinary : public GeometryComputer { bool input0Broadcast = false; bool input1Broadcast = false; if (outputSize != inputL0 || inp0format != outFormat || - (output->dimensions() != input0->dimensions() && MNN_DATA_FORMAT_NC4HW4 == outFormat) + (output->dimensions() != input0->dimensions() && (MNN_DATA_FORMAT_NC4HW4 == outFormat || context.forwardType() == MNN_FORWARD_OPENCL))// OpenCL default format is MNN_DATA_FORMAT_NC4HW4 ) { input0Broadcast = true; } if (outputSize != inputL1 || inp1format != outFormat || - (output->dimensions() != input1->dimensions() && MNN_DATA_FORMAT_NC4HW4 == outFormat)) { + (output->dimensions() != input1->dimensions() && (MNN_DATA_FORMAT_NC4HW4 == outFormat || context.forwardType() == MNN_FORWARD_OPENCL))) {// OpenCL default format is MNN_DATA_FORMAT_NC4HW4 input1Broadcast = true; } auto cacheTensor = std::move(res.extras); @@ -113,12 +113,12 @@ class GeometryBinary : public GeometryComputer { bool input0Broadcast = false; bool input1Broadcast = false; if (outputSize != inputL0 || inp0format != outFormat || - (output->dimensions() != input0->dimensions() && MNN_DATA_FORMAT_NC4HW4 == outFormat) + (output->dimensions() != input0->dimensions() && (MNN_DATA_FORMAT_NC4HW4 == outFormat || context.forwardType() == MNN_FORWARD_OPENCL))// OpenCL default format is MNN_DATA_FORMAT_NC4HW4 ) { input0Broadcast = true; } if (outputSize != inputL1 || inp1format != outFormat || - (output->dimensions() != input1->dimensions() && MNN_DATA_FORMAT_NC4HW4 == outFormat)) { + (output->dimensions() != input1->dimensions() && (MNN_DATA_FORMAT_NC4HW4 == outFormat || context.forwardType() == MNN_FORWARD_OPENCL))) {// OpenCL default format is MNN_DATA_FORMAT_NC4HW4 input1Broadcast = true; } #ifdef MNN_BINARY_LOOP_OPT diff --git a/source/geometry/GeometryComputerUtils.cpp b/source/geometry/GeometryComputerUtils.cpp index fddffa9f5..964ec73f4 100644 --- a/source/geometry/GeometryComputerUtils.cpp +++ b/source/geometry/GeometryComputerUtils.cpp @@ -60,7 +60,7 @@ int GeometryComputerUtils::buildConstantTensors(std::vectorusage == Tensor::InsideDescribe::CONSTANT) { continue; } - if (OpCommonUtils::opNeedContent(info.op->type(), i)) { + if (OpCommonUtils::opNeedContent(info.op, i)) { isConst = false; break; } @@ -346,7 +346,7 @@ void GeometryComputerUtils::makeRaster(const CommandBuffer& srcBuffer, CommandBu auto type = op->type(); MNN_ASSERT(OpType_Raster != type); for (int i = 0; i < iter.inputs.size(); ++i) { - if (!OpCommonUtils::opNeedContent(type, i)) { + if (!OpCommonUtils::opNeedContent(op, i)) { continue; } auto des = TensorUtils::getDescribe(cmd.inputs[i]); diff --git a/source/geometry/GeometryReverseSequence.cpp b/source/geometry/GeometryReverseSequence.cpp index cf620f263..f63a6e7e9 100644 --- a/source/geometry/GeometryReverseSequence.cpp +++ b/source/geometry/GeometryReverseSequence.cpp @@ -159,21 +159,25 @@ class GeometryReverse : public GeometryComputer { } auto outputDes = TensorUtils::getDescribe(output); outputDes->memoryType = Tensor::InsideDescribe::MEMORY_VIRTUAL; - for (int i = 0; i < outsideSize; i++) { - Tensor::InsideDescribe::Region region; - region.origin = input; - region.size[0] = reverseSize; - region.size[1] = insideSize; - region.size[2] = 1; + Tensor::InsideDescribe::Region region; + region.origin = input; - region.src.offset = (i + 1) * reverseSize * insideSize - insideSize; - region.src.stride[0] = -insideSize; + region.size[0] = outsideSize; + region.size[1] = reverseSize; + region.size[2] = insideSize; + + region.src.offset = reverseSize * insideSize - insideSize; + region.src.stride[0] = reverseSize*insideSize; + region.src.stride[1] = -insideSize; + region.src.stride[2] = 1; + + region.dst.offset = 0; + region.dst.stride[0] = reverseSize*insideSize; + region.dst.stride[1] = insideSize; + region.dst.stride[2] = 1; + outputDes->regions.emplace_back(std::move(region)); - region.dst.offset = i * reverseSize * insideSize; - region.dst.stride[0] = insideSize; - outputDes->regions.emplace_back(std::move(region)); - } return true; } }; diff --git a/source/shape/ShapeCast.cpp b/source/shape/ShapeCast.cpp index 9ce4b3f53..cae9cbc89 100644 --- a/source/shape/ShapeCast.cpp +++ b/source/shape/ShapeCast.cpp @@ -25,14 +25,6 @@ class CastSizeComputer : public SizeComputer { output->buffer().type = halide_type_of(); return true; } - if (OpType_QuantizeLinear == op->type()) { - output->buffer().type = halide_type_of(); - return true; - } - if (OpType_DequantizeLinear == op->type()) { - output->buffer().type = halide_type_of(); - return true; - } const auto opParam = op->main_as_CastParam(); outputs[0]->setType(opParam->dstT()); @@ -43,7 +35,4 @@ class CastSizeComputer : public SizeComputer { REGISTER_SHAPE(CastSizeComputer, OpType_Cast); REGISTER_SHAPE(CastSizeComputer, OpType_FloatToInt8); REGISTER_SHAPE(CastSizeComputer, OpType_Int8ToFloat); -REGISTER_SHAPE(CastSizeComputer, OpType_QuantizeLinear); -REGISTER_SHAPE(CastSizeComputer, OpType_DequantizeLinear); - } // namespace MNN diff --git a/source/shape/ShapeConvolution.cpp b/source/shape/ShapeConvolution.cpp index 1b26b0779..033593fa3 100644 --- a/source/shape/ShapeConvolution.cpp +++ b/source/shape/ShapeConvolution.cpp @@ -97,6 +97,10 @@ class ConvolutionSizeComputer : public SizeComputer { outputBuffer.dimensions = input->buffer().dimensions; auto format = TensorUtils::getDescribe(input)->dimensionFormat; outputBuffer.type = input->getType(); + if (op->main_as_Convolution2D() && op->main_as_Convolution2D()->symmetricQuan() && op->main_as_Convolution2D()->symmetricQuan()->outputDataType() != DataType_DT_INT8) { + auto type = op->main_as_Convolution2D()->symmetricQuan()->outputDataType(); + outputs[0]->setType(type); + } outputBuffer.dim[0].extent = input->buffer().dim[0].extent; if (MNN_DATA_FORMAT_NHWC == format) { outputBuffer.dim[3].extent = outputCount; diff --git a/source/shape/ShapeRegister.cpp b/source/shape/ShapeRegister.cpp index 0897e2702..ec639602e 100644 --- a/source/shape/ShapeRegister.cpp +++ b/source/shape/ShapeRegister.cpp @@ -43,8 +43,6 @@ extern void ___ConcatSizeComputer__OpType_QuantizedConcat__(); extern void ___CastSizeComputer__OpType_Cast__(); extern void ___CastSizeComputer__OpType_FloatToInt8__(); extern void ___CastSizeComputer__OpType_Int8ToFloat__(); -extern void ___CastSizeComputer__OpType_QuantizeLinear__(); -extern void ___CastSizeComputer__OpType_DequantizeLinear__(); extern void ___BatchToSpaceNDSizeComputer__OpType_BatchToSpaceND__(); extern void ___LinSpaceSizeComputer__OpType_LinSpace__(); extern void ___TileComputer__OpType_Tile__(); @@ -159,8 +157,6 @@ ___ConcatSizeComputer__OpType_QuantizedConcat__(); ___CastSizeComputer__OpType_Cast__(); ___CastSizeComputer__OpType_FloatToInt8__(); ___CastSizeComputer__OpType_Int8ToFloat__(); -___CastSizeComputer__OpType_QuantizeLinear__(); -___CastSizeComputer__OpType_DequantizeLinear__(); ___BatchToSpaceNDSizeComputer__OpType_BatchToSpaceND__(); ___LinSpaceSizeComputer__OpType_LinSpace__(); ___TileComputer__OpType_Tile__(); diff --git a/source/shape/SizeComputer.cpp b/source/shape/SizeComputer.cpp index d978ca6f1..672330aaf 100644 --- a/source/shape/SizeComputer.cpp +++ b/source/shape/SizeComputer.cpp @@ -209,6 +209,27 @@ std::vector SizeComputer::needInputContent(const MNN::Op* op, int inputSize if (op->type() == OpType_CumSum) { return std::vector{1}; } +#ifdef MNN_SUPPORT_RENDER + if (op->type() == OpType_RasterAndInterpolate) { + int type = 4; + if (op->main_type() == OpParameter_Extra) { + auto extra = op->main_as_Extra(); + if (nullptr != extra->attr()) { + for (int i=0; iattr()->size(); ++i) { + auto attr = extra->attr()->GetAs(i); + if (attr->key()->str() == "primitiveType") { + type = attr->i(); + break; + } + } + } + } + if (type <= 4) { + return std::vector{0}; + } + return std::vector{}; + } +#endif auto computer = computeFactory->search(op->type()); if (nullptr != computer) { return computer->mNeedContentInputIndex; diff --git a/test.sh b/test.sh index c70503027..91bcd16b2 100755 --- a/test.sh +++ b/test.sh @@ -169,6 +169,7 @@ android_static_build() { -DMNN_OPENGL=true \ -DMNN_BUILD_TRAIN=true \ -DMNN_VULKAN=true \ + -DMNN_OPENCL=true \ -DMNN_SUPPORT_BF16=true \ -DMNN_OPENCL=true -DMNN_ARM82=true \ -DNATIVE_LIBRARY_OUTPUT=. -DNATIVE_INCLUDE_OUTPUT=. $1 $2 $3 @@ -198,6 +199,7 @@ android_static_build() { -DMNN_OPENGL=true \ -DMNN_BUILD_TRAIN=true \ -DMNN_VULKAN=true \ + -DMNN_OPENCL=true \ -DMNN_BUILD_MINI=true \ -DMNN_SUPPORT_BF16=true \ -DMNN_OPENCL=true\ @@ -235,6 +237,7 @@ linux_build() { -DCMAKE_BUILD_TYPE=Release \ -DMNN_BUILD_TEST=ON \ -DMNN_CUDA=ON \ + -DMNN_OPENCL=ON \ -DMNN_BUILD_QUANTOOLS=ON \ -DMNN_BUILD_DEMO=ON \ -DMNN_BUILD_CONVERTER=ON \ @@ -420,6 +423,25 @@ opencv_test() { fi } +llm_test() { + # 1. build llm with low memory + cmake -DMNN_OPENCV_TEST=ON -DMNN_BUILD_LLM=ON .. + make -j8 + llm_build_wrong=$[$? > 0] + printf "TEST_NAME_LLM_BUILD: LLM编译测试\nTEST_CASE_AMOUNT_LLM_BUILD: {\"blocked\":0,\"failed\":%d,\"passed\":%d,\"skipped\":0}\n" \ + $llm_build_wrong $[1 - $llm_build_wrong] + if [ $llm_build_wrong -ne 0 ]; then + echo '### LLM编译失败,测试终止!' + failed + fi + # 2. run llm model test + ./llm_demo ~/AliNNModel/qwen-1.8b-int4 ~/AliNNModel/qwen-1.8b-int4/prompt.txt + if [ $? -gt 0 ]; then + echo '### LLM模型测试失败,测试终止!' + failed + fi +} + coverage_init() { popd lcov -c -i -d ./ -o init.info @@ -552,7 +574,7 @@ android_test() { # 1. build Android32 mkdir build_32 pushd build_32 - ../build_32.sh -DMNN_BUILD_TRAIN=OFF -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + ../build_32.sh -DMNN_BUILD_TRAIN=OFF -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DMNN_OPENCL=true android32_build_wrong=$[$? > 0] mnn32_size=$(ls -lh libMNN.so | awk '{print $5}') expr32_size=$(ls -lh libMNN_Express.so | awk '{print $5}') @@ -570,7 +592,7 @@ android_test() { # 3. build Android64 mkdir build_64 pushd build_64 - ../build_64.sh -DMNN_BUILD_TRAIN=OFF -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DMNN_ARM82=true + ../build_64.sh -DMNN_BUILD_TRAIN=OFF -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DMNN_ARM82=true -DMNN_OPENCL=true android64_build_wrong=$[$? > 0] mnn64_size=$(ls -lh libMNN.so | awk '{print $5}') expr64_size=$(ls -lh libMNN_Express.so | awk '{print $5}') @@ -616,6 +638,7 @@ case "$1" in ptq_test pymnn_test opencv_test + llm_test coverage_report ;; android) diff --git a/test/op/BinaryOPTest.cpp b/test/op/BinaryOPTest.cpp index a30be18f9..6bf659190 100644 --- a/test/op/BinaryOPTest.cpp +++ b/test/op/BinaryOPTest.cpp @@ -125,6 +125,16 @@ class AddTest : public BinaryTestCommon { } }; +class AddBroastTest : public BinaryTestCommon { +public: + virtual ~AddBroastTest() = default; + virtual bool run(int precision) { + return test(MNN::Express::_Add, "AddBroast", 0.01, + {-1.0, -2.0, -3.0, -4.0}, {1.0, 2.0, 3.0, 4.0}, {0.0, 0.0, 0.0, 0.0}, + {1, 1, 4}, {4}, {1, 1, 4}); + } +}; + class AddInt8Test : public BinaryTestCommon { public: virtual ~AddInt8Test() = default; @@ -412,7 +422,7 @@ class ModTestFloat : public BinaryTestCommon { z[i + j * 2] = FP32Converter[precision](fmodf(FP32Converter[precision](x[i+j*2]), FP32Converter[precision](y[i]))); } } - return test(MNN::Express::_Mod, "ModTestFloat", 0, + return test(MNN::Express::_Mod, "ModTestFloat", 0.01, x,y,z, {4, 2}, {2}, {4, 2}); } @@ -719,3 +729,5 @@ MNNTestSuiteRegister(Atan2Int8Test, "op/binary/atan2Int8"); MNNTestSuiteRegister(SquaredDifferenceInt8Test, "op/binary/sqdInt8"); MNNTestSuiteRegister(AddC4Test, "op/binary/addC4"); +MNNTestSuiteRegister(AddBroastTest, "op/binary/AddBroast"); + diff --git a/test/op/MatMulTest.cpp b/test/op/MatMulTest.cpp index 3e449f01e..39dee0f71 100644 --- a/test/op/MatMulTest.cpp +++ b/test/op/MatMulTest.cpp @@ -173,6 +173,17 @@ class MatMulTestBConst : public MatMulTest { protected: virtual bool run(int precision) { + { + // Test avoid crash + int e = 5, l = 5, h = 4; + // Use Conv1x1 instead of MatMul + auto x0 = MNN::Express::_Input({1, l, e, 1}, NC4HW4, halide_type_of()); + auto y = _Conv(0.0f, 0.0f, x0, {l, h}, {1, 1}); + Variable::prepareCompute({y}); + //Prepare + x0->writeMap(); + y->readMap(); + } { bool succ = MatMulCommonTest::test(MNN_FORWARD_CPU, "device_name", "MatMul", 2, 2, 2, 1, true, false, precision, true); diff --git a/test/op/ReverseTest.cpp b/test/op/ReverseTest.cpp index 002207c0c..8220944ef 100644 --- a/test/op/ReverseTest.cpp +++ b/test/op/ReverseTest.cpp @@ -16,57 +16,111 @@ class ReverseTest : public MNNTestCase { public: virtual ~ReverseTest() = default; virtual bool run(int precision) { - auto input = _Input({3, 2, 3}, NCHW); - input->setName("input_tensor"); - // set input data - const float inpudata[] = { 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18 }; - auto inputPtr = input->writeMap(); - memcpy(inputPtr, inpudata, 18 * sizeof(float)); - auto output0 = _Reverse(input, _Scalar(0)); - const std::vector expectedOutput0 = { 13, 14, 15, 16, 17, 18, - 7, 8, 9, 10, 11, 12, - 1, 2, 3, 4, 5, 6 }; - auto gotOutput0 = output0->readMap(); - for (int i = 0; i < 18; ++i) { - auto diff = ::fabsf(gotOutput0[i] - expectedOutput0[i]); - if (diff > 0.01) { - MNN_ERROR("ReverseTest[axis=0] test failed: %f - %f!\n", expectedOutput0[i], gotOutput0[i]); - return false; + { + auto input = _Input({3, 2, 3}, NCHW); + input->setName("input_tensor"); + // set input data + const float inpudata[] = { 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18 }; + auto inputPtr = input->writeMap(); + memcpy(inputPtr, inpudata, 18 * sizeof(float)); + auto output0 = _Reverse(input, _Scalar(0)); + const std::vector expectedOutput0 = { 13, 14, 15, 16, 17, 18, + 7, 8, 9, 10, 11, 12, + 1, 2, 3, 4, 5, 6 }; + auto gotOutput0 = output0->readMap(); + for (int i = 0; i < 18; ++i) { + auto diff = ::fabsf(gotOutput0[i] - expectedOutput0[i]); + if (diff > 0.01) { + MNN_ERROR("ReverseTest[axis=0] test failed: %f - %f!\n", expectedOutput0[i], gotOutput0[i]); + return false; + } } - } - auto output1 = _Reverse(input, _Scalar(1)); - const std::vector expectedOutput1 = { 4, 5, 6, 1, 2, 3, - 10, 11, 12, 7, 8, 9, - 16, 17, 18, 13, 14, 15 }; - auto gotOutput1 = output1->readMap(); - for (int i = 0; i < 18; ++i) { - auto diff = ::fabsf(gotOutput1[i] - expectedOutput1[i]); - if (diff > 0.01) { - MNN_ERROR("ReverseTest[axis=1] test failed: %f - %f!\n", expectedOutput1[i], gotOutput1[i]); - return false; + auto output1 = _Reverse(input, _Scalar(1)); + const std::vector expectedOutput1 = { 4, 5, 6, 1, 2, 3, + 10, 11, 12, 7, 8, 9, + 16, 17, 18, 13, 14, 15 }; + auto gotOutput1 = output1->readMap(); + for (int i = 0; i < 18; ++i) { + auto diff = ::fabsf(gotOutput1[i] - expectedOutput1[i]); + if (diff > 0.01) { + MNN_ERROR("ReverseTest[axis=1] test failed: %f - %f!\n", expectedOutput1[i], gotOutput1[i]); + return false; + } + } + auto output2 = _Reverse(input, _Scalar(2)); + const std::vector expectedOutput2 = { 3, 2, 1, 6, 5, 4, + 9, 8, 7, 12, 11, 10, + 15, 14, 13, 18, 17, 16 }; + auto gotOutput2 = output2->readMap(); + for (int i = 0; i < 18; ++i) { + auto diff = ::fabsf(gotOutput2[i] - expectedOutput2[i]); + if (diff > 0.01) { + MNN_ERROR("ReverseTest[axis=2] test failed: %f - %f!\n", expectedOutput2[i], gotOutput2[i]); + return false; + } } } - auto output2 = _Reverse(input, _Scalar(2)); - const std::vector expectedOutput2 = { 3, 2, 1, 6, 5, 4, - 9, 8, 7, 12, 11, 10, - 15, 14, 13, 18, 17, 16 }; - auto gotOutput2 = output2->readMap(); - for (int i = 0; i < 18; ++i) { - auto diff = ::fabsf(gotOutput2[i] - expectedOutput2[i]); - if (diff > 0.01) { - MNN_ERROR("ReverseTest[axis=2] test failed: %f - %f!\n", expectedOutput2[i], gotOutput2[i]); - return false; + + { + auto input = _Input({2, 2, 2, 2}, NCHW, halide_type_of()); + input->setName("input_tensor"); + // set input data + const uint8_t inpudata[] = { 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 }; + auto inputPtr = input->writeMap(); + memcpy(inputPtr, inpudata, 16 * sizeof(uint8_t)); + auto output0 = _Reverse(input, _Scalar(0)); + const std::vector expectedOutput0 = { + 9, 10, 11, 12, 13, 14, 15, 16, + 1, 2, 3, 4, 5, 6, 7, 8 }; + auto gotOutput0 = output0->readMap(); + for (int i = 0; i < 16; ++i) { + auto diff = ::fabsf(gotOutput0[i] - expectedOutput0[i]); + if (diff > 0.01) { + MNN_ERROR("ReverseTest4D[axis=0] test failed: %d - %d!\n", expectedOutput0[i], gotOutput0[i]); + return false; + } + } + auto output1 = _Reverse(input, _Scalar(1)); + const std::vector expectedOutput1 = {5, 6, 7, 8, 1, 2, 3, 4, + 13, 14, 15, 16, 9, 10, 11, 12, + }; + auto gotOutput1 = output1->readMap(); + for (int i = 0; i < 16; ++i) { + auto diff = ::fabsf(gotOutput1[i] - expectedOutput1[i]); + if (diff > 0.01) { + MNN_ERROR("ReverseTest4D[axis=1] test failed: %d - %d!\n", expectedOutput1[i], gotOutput1[i]); + return false; + } + } + auto output2 = _Reverse(input, _Scalar(2)); + const std::vector expectedOutput2 = { 3, 4, 1, 2, 7, 8, 5, 6, + 11, 12, 9, 10, 15, 16, 13, 14 }; + auto gotOutput2 = output2->readMap(); + for (int i = 0; i < 16; ++i) { + auto diff = ::fabsf(gotOutput2[i] - expectedOutput2[i]); + if (diff > 0.01) { + MNN_ERROR("ReverseTest4D[axis=2] test failed: %d - %d!\n", expectedOutput2[i], gotOutput2[i]); + return false; + } + } + auto output3 = _Reverse(input, _Scalar(3)); + const std::vector expectedOutput3 = { 2, 1, 4, 3, 6, 5, 8, 7, + 10, 9, 12, 11, 14, 13, 16, 15 }; + auto gotOutput3 = output3->readMap(); + for (int i = 0; i < 16; ++i) { + auto diff = ::fabsf(gotOutput3[i] - expectedOutput3[i]); + if (diff > 0.01) { + MNN_ERROR("ReverseTest4D[axis=3] test failed: %d - %d!\n", expectedOutput3[i], gotOutput3[i]); + return false; + } } } return true; } -private: - VARP _Reverse(VARP x, VARP axis) { - std::unique_ptr op(new MNN::OpT); - op->type = MNN::OpType_Reverse; - return (Variable::create(Expr::create(op.get(), {x, axis}))); - } }; MNNTestSuiteRegister(ReverseTest, "op/reverse"); diff --git a/test/op/UnaryTest.cpp b/test/op/UnaryTest.cpp index 75e9c28c3..1199fab1a 100644 --- a/test/op/UnaryTest.cpp +++ b/test/op/UnaryTest.cpp @@ -859,9 +859,15 @@ class SignTestInt8 : public UnaryTestCommon { virtual ~SignTestInt8() = default; virtual bool run(int precision) { float scale[2] = {0.0125490196, 1.0}, zeros[2] = {1.0, 0.}; + float inp[5] = {-1.2, 0., 0.4, 1.6, 0.4}; + float oup[5] = {-1., 0., 1., 1., 1.}; + std::vector input(20), output(20); + for (int i = 0; i < 4; ++i) { + ::memcpy(input.data() + i * 5, inp, 5 * sizeof(float)); + ::memcpy(output.data() + i * 5, oup, 5 * sizeof(float)); + } return test(_Sign, "SignTestInt8", 0.01, - {-1.2, 0., 0.4, 1.6}, {-1., 0., 1., 1.}, - {4}, {4}, scale, zeros); + input, output, {20}, {20}, scale, zeros); } }; class NegativeTestInt8 : public UnaryTestCommon { @@ -1133,7 +1139,7 @@ class AcosTestInt8 : public UnaryTestCommon { {4}, {4}); } }; -/* + MNNTestSuiteRegister(AbsTest, "op/unary/abs"); MNNTestSuiteRegister(NegativeTest, "op/unary/negative"); MNNTestSuiteRegister(FloorTest, "op/unary/floor"); @@ -1164,7 +1170,7 @@ MNNTestSuiteRegister(ErfcTest, "op/unary/erfc"); MNNTestSuiteRegister(ErfinvTest, "op/unary/erfinv"); MNNTestSuiteRegister(Expm1Test, "op/unary/expm1"); MNNTestSuiteRegister(SinhTest, "op/unary/sinh"); -MNNTestSuiteRegister(GeluTest, "op/unary/gelu");*/ +MNNTestSuiteRegister(GeluTest, "op/unary/gelu"); MNNTestSuiteRegister(AbsTestInt8, "op/unary/absInt8"); MNNTestSuiteRegister(SignTestInt8, "op/unary/signInt8"); MNNTestSuiteRegister(NegativeTestInt8, "op/unary/negativeInt8"); diff --git a/tools/converter/source/optimizer/PostConverter.cpp b/tools/converter/source/optimizer/PostConverter.cpp index d2bc426da..19c3de40c 100644 --- a/tools/converter/source/optimizer/PostConverter.cpp +++ b/tools/converter/source/optimizer/PostConverter.cpp @@ -271,7 +271,7 @@ std::unique_ptr optimizeNetImpl(std::unique_ptr& originNet // Remove Invalid Cast "RemoveInvalidCast" }; -// auto tensorDescribe = std::move(originNet->extraTensorDescribe); + auto tensorDescribe = std::move(originNet->extraTensorDescribe); std::unique_ptr newNet; newNet = std::move(RunExtraPass(originNet, inputs)); RunNetPass(midOptPass, newNet); @@ -341,7 +341,7 @@ std::unique_ptr optimizeNetImpl(std::unique_ptr& originNet newNet = std::move(RunMergePass(newNet, inputs, PASS_PRIORITY_LOW)); newNet = std::move(RunMergePass(newNet, inputs, PASS_PRIORITY_FINAL)); -// newNet->extraTensorDescribe = std::move(tensorDescribe); + newNet->extraTensorDescribe = std::move(tensorDescribe); RunNetPass({"ReIndexTensor"}, newNet); RunNetPass({"ReIndexOnnxIfAlias"}, newNet); diff --git a/tools/converter/source/optimizer/merge/BinaryDeQuantizeLinearFuseToBinaryInt8.cpp b/tools/converter/source/optimizer/merge/BinaryDeQuantizeLinearFuseToBinaryInt8.cpp deleted file mode 100644 index d4edb4d47..000000000 --- a/tools/converter/source/optimizer/merge/BinaryDeQuantizeLinearFuseToBinaryInt8.cpp +++ /dev/null @@ -1,120 +0,0 @@ -// -// BinaryDeQuantizeLinearFuseToBinaryInt8.cpp -// MNNConverter -// -// Created by MNN on 2020/07/28. -// Copyright © 2018, Alibaba Group Holding Limited -// - -#include "../TemplateMerge.hpp" -#include "MNN/expr/MathOp.hpp" -#include "MNN/expr/NeuralNetWorkOp.hpp" -#include "MNN_generated.h" -#include "MNN_compression.pb.h" -#include - -namespace MNN { -namespace Express { - -static auto gRegister = []() { - auto match = [](EXPRP expr) { - if (nullptr == expr->get()) { - return false; - } - if (expr->get()->type() != OpType_QuantizeLinear) { - return false; - } - - VARP binary_var = expr->inputs().at(0); - EXPRP binary_expr = binary_var->expr().first; - if (!binary_expr->get() || binary_expr->get()->type() != OpType_BinaryOp) { - return false; - } - - VARP binary_input1_var = binary_expr->inputs().at(0); - EXPRP binary_input1_expr = binary_input1_var->expr().first; - if (!binary_input1_expr->get() || (binary_input1_expr->get()->type() != OpType_DequantizeLinear)) { - return false; - } - - VARP binary_input2_var = binary_expr->inputs().at(1); - EXPRP binary_input2_expr = binary_input2_var->expr().first; - if (!binary_input2_expr->get() || (binary_input2_expr->get()->type() != OpType_DequantizeLinear)) { - return false; - } - - return true; - }; - - auto transform = [](EXPRP expr) { - auto gConverterConfig = Global::Get(); - std::string compressFileName = gConverterConfig->compressionParamsFile; - Compression::Pipeline proto; - if (compressFileName != "") { - std::fstream input(compressFileName.c_str(), std::ios::in | std::ios::binary); - if (!proto.ParseFromIstream(&input)) { - MNN_ERROR("Failed to parse compression pipeline proto.\n"); - } - } - - VARP binary_var = expr->inputs().at(0); - EXPRP binary_expr = binary_var->expr().first; - VARP input1_var = binary_expr->inputs().at(0); // Binary float inputs - VARP input2_var = binary_expr->inputs().at(1); - EXPRP input1_expr = input1_var->expr().first; // Dequantize layer - EXPRP input2_expr = input2_var->expr().first; - - // BinaryInt8 input - VARP input1_int8_var = input1_expr->inputs().at(0); - VARP input2_int8_var = input2_expr->inputs().at(0); - - // Binary input quant parameters - VARP input1_scale_var = input1_expr->inputs().at(1); - VARP input1_zero_var = input1_expr->inputs().at(2); - VARP input2_scale_var = input2_expr->inputs().at(1); - VARP input2_zero_var = input2_expr->inputs().at(2); - // Binary output quant parameters - VARP output_scale_var = expr->inputs().at(1); - VARP output_zeroz_var = expr->inputs().at(2); - // Binary out var - - - float scale1 = input1_scale_var->readMap()[0]; - int8_t zero1 = input1_zero_var->readMap()[0]; - float scale2 = input2_scale_var->readMap()[0]; - int8_t zero2 = input2_zero_var->readMap()[0]; - float scale_out = output_scale_var->readMap()[0]; - int8_t zero_out = output_zeroz_var->readMap()[0]; - - input1_int8_var->writeScaleMap(scale1, (float)zero1); - input2_int8_var->writeScaleMap(scale2, (float)zero2); - - // BinaryOp expr - std::unique_ptr binaryOp(binary_expr->get()->UnPack()); - auto binaryParams = binaryOp->main.AsBinaryOp(); - - std::unique_ptr binary_op(new OpT); - binary_op->name = expr->name(); - binary_op->type = binaryOp->type; - binary_op->main.type = OpParameter_BinaryOp; - - auto binary = new MNN::BinaryOpT; - binary->opType = binaryParams->opType; - binary_op->main.value = binary; - - auto new_expr = Expr::create(binary_op.get(), {input1_int8_var, input2_int8_var}); - - new_expr->setName(binary_expr->name()); - Expr::replace(expr, new_expr); - // Add quant info to output node. - expr->outputs()[0].lock()->inputs().at(0)->writeScaleMap(scale_out, zero_out); - return true; - }; - - TemplateMerge::getInstance("Merge").insertTemplate("BinaryDeQuantizeLinearFuseToBinaryInt8", match, transform, - PASS_PRIORITY_MIDDLE); - return true; -}(); - -} -} // namespace MNN diff --git a/tools/converter/source/optimizer/merge/CastFuseToQuantizeLinear.cpp b/tools/converter/source/optimizer/merge/CastFuseToQuantizeLinear.cpp deleted file mode 100644 index 6b08fe2e7..000000000 --- a/tools/converter/source/optimizer/merge/CastFuseToQuantizeLinear.cpp +++ /dev/null @@ -1,81 +0,0 @@ -// -// CastFuseToQuantizeLinear.cpp -// MNNConverter -// -// Created by MNN on 2020/07/28. -// Copyright © 2018, Alibaba Group Holding Limited -// - -#include "../TemplateMerge.hpp" -#include "MNN/expr/MathOp.hpp" -#include "MNN/expr/NeuralNetWorkOp.hpp" -#include "MNN_generated.h" -#include "MNN_compression.pb.h" -#include - -namespace MNN { -namespace Express { - -static auto gRegister = []() { - auto match = [](EXPRP expr) { - return false; - if (nullptr == expr->get()) { - return false; - } - if (expr->get()->type() != OpType_Cast) { - return false; - } - - VARP quantize_var = expr->inputs().at(0); - EXPRP quantize_expr = quantize_var->expr().first; - if (!quantize_expr->get() || quantize_expr->get()->type() != OpType_QuantizeLinear) { - return false; - } - return true; - }; - - auto transform = [](EXPRP expr) { - auto gConverterConfig = Global::Get(); - std::string compressFileName = gConverterConfig->compressionParamsFile; - Compression::Pipeline proto; - if (compressFileName != "") { - std::fstream input(compressFileName.c_str(), std::ios::in | std::ios::binary); - if (!proto.ParseFromIstream(&input)) { - MNN_ERROR("Failed to parse compression pipeline proto.\n"); - } - } - VARP quantize_var = expr->inputs().at(0); - EXPRP quantize_expr = quantize_var->expr().first; - - VARP quantize_data_var = quantize_expr->inputs().at(0); - VARP quantize_scale_var = quantize_expr->inputs().at(1); - VARP quantize_zero_var = nullptr; - if (quantize_expr->inputs().size() > 2) { - quantize_zero_var = quantize_expr->inputs().at(2); - } - - auto newParam = new QuantizeLinearT; - std::unique_ptr quantizeOp(quantize_expr->get()->UnPack()); - auto convParams = quantizeOp->main.AsQuantizeLinear(); - newParam->scaleAxis = convParams->scaleAxis; - newParam->scaleSize = convParams->scaleSize; - - std::unique_ptr quantize_op(new OpT); - quantize_op->name = expr->name(); - quantize_op->type = OpType_QuantizeLinear; - quantize_op->main.type = OpParameter_QuantizeLinear; - quantize_op->main.value = newParam; - - auto new_expr = Expr::create(quantize_op.get(), {quantize_data_var, quantize_scale_var, quantize_zero_var}); - new_expr->setName(quantize_expr->name()); - Expr::replace(expr, new_expr); - return true; - }; - - TemplateMerge::getInstance("Merge").insertTemplate("CastFuseToQuantizeLinear", match, transform, - PASS_PRIORITY_MIDDLE); - return true; -}(); - -} -} // namespace MNN diff --git a/tools/converter/source/optimizer/merge/ConvDeQuantizeLinearFuseToConvInt8.cpp b/tools/converter/source/optimizer/merge/ConvDeQuantizeLinearFuseToConvInt8.cpp index 7a96a7cdd..ab7d8db68 100644 --- a/tools/converter/source/optimizer/merge/ConvDeQuantizeLinearFuseToConvInt8.cpp +++ b/tools/converter/source/optimizer/merge/ConvDeQuantizeLinearFuseToConvInt8.cpp @@ -15,42 +15,313 @@ namespace MNN { namespace Express { +static VARP _ReshapeF(VARP x, VARP shape, MNN::MNN_DATA_FORMAT format) { + MNN_ASSERT(nullptr != x); + std::unique_ptr reshape(new OpT); + reshape->type = OpType_Reshape; + reshape->main.type = OpParameter_Reshape; + reshape->main.value = new ReshapeT; + reshape->main.AsReshape()->dimType = format; + return (Variable::create(Expr::create(reshape.get(), {x, shape}))); +} +static bool matchConvInt8ToOther(EXPRP expr, int i) { // convint8->quant->cast->dequant->other + // check op type not convint8. + if (nullptr == expr->get()) { + return false; + } + if (expr->get()->type() == OpType_ConvInt8 || expr->get()->type() == OpType_Cast || expr->get()->type() == OpType_Int8ToFloat || expr->get()->type() == OpType_FloatToInt8 || expr->get()->type() == OpType_Const || expr->get()->type() == OpType_DepthwiseConvInt8 || expr->get()->type() == OpType_MatMul) { + return false; + } + // check dequantize linear + VARP dequant_var = expr->inputs().at(i); + EXPRP dequant_expr = dequant_var->expr().first; + if (!dequant_expr->get() || dequant_expr->get()->type() != OpType_Int8ToFloat) { + return false; + } + if (dequant_expr->inputs().size() != 5) { + return false; + } + // check cast + VARP cast_var = dequant_expr->inputs().at(0); + EXPRP cast_expr = cast_var->expr().first; + if (!cast_expr->get() || cast_expr->get()->type() != OpType_Cast) { + return false; + } + // check quantize linear + VARP quan_var = cast_expr->inputs().at(0); + EXPRP quan_expr = quan_var->expr().first; + if (!quan_expr->get() || quan_expr->get()->type() != OpType_FloatToInt8) { + return false; + } + if (quan_expr->inputs().size() != 5) { + return false; + } + // check other + VARP conv_var = quan_expr->inputs().at(0); + EXPRP conv_expr = conv_var->expr().first; + + if (!conv_expr->get() || (conv_expr->get()->type() != OpType_ConvInt8 && conv_expr->get()->type() != OpType_DepthwiseConvInt8)) { + return false; + } + return true; +} +static VARP transformConvInt8ToOther(EXPRP expr, int i) { // convint8->quant->cast->dequant->other => convInt8(float output)->other + auto dequant_var = expr->inputs()[i]; + auto dequant_expr = dequant_var->expr().first; + auto cast_var = dequant_expr->inputs().at(0); + auto cast_expr = cast_var->expr().first; + auto quan_var = cast_expr->inputs().at(0); + auto quan_expr = quan_var->expr().first; + auto conv_var = quan_expr->inputs().at(0); + auto conv_expr = conv_var->expr().first; + auto convInt8Input = conv_expr->inputs().at(0); + + // change old convInt8 to return a float value, which is input to expr; + std::unique_ptr newConvInt8(new MNN::Convolution2DT); + std::unique_ptr oldConvOp(conv_expr->get()->UnPack()); + auto oldConvParams = oldConvOp->main.AsConvolution2D(); + newConvInt8->common.reset(new MNN::Convolution2DCommonT); + newConvInt8->common = std::move(oldConvParams->common); + newConvInt8->symmetricQuan.reset(new QuantizedFloatParamT); + newConvInt8->symmetricQuan = std::move(oldConvParams->symmetricQuan); + newConvInt8->symmetricQuan->outputDataType = MNN::DataType_DT_FLOAT; + + std::unique_ptr conv_op(new OpT); + conv_op->name = conv_expr->name(); + conv_op->type = oldConvOp->type; + conv_op->main.type = OpParameter_Convolution2D; + conv_op->main.value = newConvInt8.release(); + + auto newconv_expr = Expr::create(conv_op.get(), {convInt8Input}); + newconv_expr->setName(conv_expr->name()); + auto newconv_var = Variable::create(newconv_expr); + newconv_var->setName(conv_expr->outputName(0)); + Expr::replace(conv_expr, newconv_expr); + return newconv_var; + +} + +static bool matchOtherToOther (EXPRP expr, int i) { // ohter->quant->cast->dequant->other + // check op type not convint8. + if (nullptr == expr->get()) { + return false; + } + if (expr->get()->type() == OpType_ConvInt8 || expr->get()->type() == OpType_Cast || expr->get()->type() == OpType_Int8ToFloat || expr->get()->type() == OpType_FloatToInt8 || expr->get()->type() == OpType_Const || expr->get()->type() == OpType_DepthwiseConvInt8 || expr->get()->type() == OpType_MatMul) { + return false; + } + // check dequantize linear + VARP dequant_var = expr->inputs().at(i); + EXPRP dequant_expr = dequant_var->expr().first; + if (!dequant_expr->get() || dequant_expr->get()->type() != OpType_Int8ToFloat) { + return false; + } + if (dequant_expr->inputs().size() != 5) { + return false; + } + // check cast + VARP cast_var = dequant_expr->inputs().at(0); + EXPRP cast_expr = cast_var->expr().first; + if (!cast_expr->get() || cast_expr->get()->type() != OpType_Cast) { + return false; + } + // check quantize linear + VARP quan_var = cast_expr->inputs().at(0); + EXPRP quan_expr = quan_var->expr().first; + if (!quan_expr->get() || quan_expr->get()->type() != OpType_FloatToInt8) { + return false; + } + if (quan_expr->inputs().size() != 5) { + return false; + } + // check other + VARP other_var = quan_expr->inputs().at(0); + EXPRP other_expr = other_var->expr().first; + + if (!other_expr->get()) { + return false; + } + if (other_expr->get()->type() == OpType_ConvInt8 || other_expr->get()->type() == OpType_Cast || other_expr->get()->type() == OpType_Int8ToFloat || other_expr->get()->type() == OpType_FloatToInt8 || other_expr->get()->type() == OpType_Const || other_expr->get()->type() == OpType_DepthwiseConvInt8) { + return false; + } + return true; +} +static VARP transformOtherToOther (EXPRP expr, int i) { // ohter->quant->cast->dequant->other => other->other + auto dequant_var = expr->inputs()[i]; + auto dequant_expr = dequant_var->expr().first; + auto cast_var = dequant_expr->inputs().at(0); + auto cast_expr = cast_var->expr().first; + auto quan_var = cast_expr->inputs().at(0); + auto quan_expr = quan_var->expr().first; + auto other_var = quan_expr->inputs().at(0); -static auto gRegister = []() { - auto match = [](EXPRP expr) { + return other_var; +} +static VARP buildInputForMatmulInt8 (VARP input, VARP transposeA, int num_input) { + auto transposeAType = transposeA->expr().first; + auto transposeAInfo = transposeA->getInfo(); + if (!transposeAInfo) { + return input; + } + if (transposeAInfo) { + if (!transposeAInfo->dim.empty()) { + return input; + } + } + VARP newInput = std::move(input); + auto format = MNN::MNN_DATA_FORMAT_NCHW; + auto inputL = _Unsqueeze(_Scalar(num_input), {0}); + inputL.fix(VARP::CONSTANT); + VARP inputE; + bool needSqueezeA = false; + if (newInput->getInfo() && newInput->getInfo()->dim.size() <= 1) { + newInput = _Unsqueeze(newInput, {0}); + needSqueezeA = true; + } + auto rank = _Rank(newInput); + auto inputShape = _Shape(newInput, NCHW); + if (transposeA->readMap()[0]) { + inputE = _Slice(inputShape, _Unsqueeze(rank - _Scalar(1), {0}), _Unsqueeze(_Scalar(1), {0})); + newInput = _ReshapeF(newInput, _Concat({_Unsqueeze(_Scalar(-1), {0}), inputL, inputE, _Unsqueeze(_Scalar(1), {0})}, 0), format); + } else { + newInput = _ReshapeF(newInput, _Concat({_Unsqueeze(_Scalar(-1), {0}), inputL, _Unsqueeze(_Scalar(1), {0}), _Unsqueeze(_Scalar(1), {0})}, 0), format); + } + return newInput; +} + +static auto gRegister = []() { // convInt8->quant->cast->dequant->convInt8 + auto matchConvInt8ToConvInt8 = [](EXPRP expr) { + // check convInt8 if (nullptr == expr->get()) { return false; } - if (expr->get()->type() != OpType_QuantizeLinear) { + if (expr->get()->type() != OpType_ConvInt8 && expr->get()->type() != OpType_DepthwiseConvInt8) { return false; } - - VARP conv_var = expr->inputs().at(0); + // check dequantize linear + VARP dequant_var = expr->inputs().at(0); + EXPRP dequant_expr = dequant_var->expr().first; + if (!dequant_expr->get() || dequant_expr->get()->type() != OpType_Int8ToFloat) { + return false; + } + if (dequant_expr->inputs().size() != 5) { + return false; + } + // check cast + VARP cast_var = dequant_expr->inputs().at(0); + EXPRP cast_expr = cast_var->expr().first; + if (!cast_expr->get() || cast_expr->get()->type() != OpType_Cast) { + return false; + } + // check quantize linear + VARP quan_var = cast_expr->inputs().at(0); + EXPRP quan_expr = quan_var->expr().first; + if (!quan_expr->get() || quan_expr->get()->type() != OpType_FloatToInt8) { + return false; + } + if (quan_expr->inputs().size() != 5) { + return false; + } + // check convInt8 + VARP conv_var = quan_expr->inputs().at(0); EXPRP conv_expr = conv_var->expr().first; - if (!conv_expr->get() || (conv_expr->get()->type() != OpType_ConvInt8 && - conv_expr->get()->type() != OpType_DepthwiseConvInt8)) { + if (!conv_expr->get() || (conv_expr->get()->type() != OpType_ConvInt8 && conv_expr->get()->type() != OpType_DepthwiseConvInt8)) { return false; } - return true; }; + auto transformConvInt8ToConvInt8 = [](EXPRP expr) { + auto quant_var = expr->inputs()[0]; + auto quant_expr = quant_var->expr().first; + auto cast_var = quant_expr->inputs().at(0); + auto cast_expr = cast_var->expr().first; + auto dequan_var = cast_expr->inputs().at(0); + auto dequan_expr = dequan_var->expr().first; + auto convInt8Input = dequan_expr->inputs().at(0); + if (expr->inputs().size() == 2) { + auto matmulop = expr->get(); + auto count_input = matmulop->main_as_Convolution2D()->common()->inputCount(); + convInt8Input = buildInputForMatmulInt8(convInt8Input, expr->inputs().at(1), count_input); + } + + std::unique_ptr newConvInt8(new MNN::Convolution2DT); + std::unique_ptr oldConvOp(expr->get()->UnPack()); + auto oldConvParams = oldConvOp->main.AsConvolution2D(); + newConvInt8->common.reset(new MNN::Convolution2DCommonT); + newConvInt8->common = std::move(oldConvParams->common); + newConvInt8->symmetricQuan.reset(new QuantizedFloatParamT); + newConvInt8->symmetricQuan = std::move(oldConvParams->symmetricQuan); + + std::unique_ptr conv_op(new OpT); + conv_op->name = expr->name(); + conv_op->type = oldConvOp->type; + conv_op->main.type = OpParameter_Convolution2D; + conv_op->main.value = newConvInt8.release(); - auto transform = [](EXPRP expr) { - auto gConverterConfig = Global::Get(); - std::string compressFileName = gConverterConfig->compressionParamsFile; - Compression::Pipeline proto; - if (compressFileName != "") { - std::fstream input(compressFileName.c_str(), std::ios::in | std::ios::binary); - if (!proto.ParseFromIstream(&input)) { - MNN_ERROR("Failed to parse compression pipeline proto.\n"); - } + auto conv_expr = Expr::create(conv_op.get(), {convInt8Input}); + conv_expr->setName(expr->name()); +// auto conv_var = Variable::create(conv_expr); +// conv_var->setName(expr->outputName(0)); + Expr::replace(expr, conv_expr); + return true; + + }; + + auto matchOtherToConvInt8 = [](EXPRP expr) { // otherOp->quant->cast->dequant->convint8 + // check op type not convint8. + if (nullptr == expr->get()) { + return false; + } + if (expr->get()->type() != OpType_ConvInt8 && expr->get()->type() != OpType_DepthwiseConvInt8) { + return false; + } + // check dequantize linear + VARP dequant_var = expr->inputs().at(0); + EXPRP dequant_expr = dequant_var->expr().first; + if (!dequant_expr->get() || dequant_expr->get()->type() != OpType_Int8ToFloat) { + return false; + } + if (dequant_expr->inputs().size() != 5) { + return false; + } + // check cast + VARP cast_var = dequant_expr->inputs().at(0); + EXPRP cast_expr = cast_var->expr().first; + if (!cast_expr->get() || cast_expr->get()->type() != OpType_Cast) { + return false; + } + // check quantize linear + VARP quan_var = cast_expr->inputs().at(0); + EXPRP quan_expr = quan_var->expr().first; + if (!quan_expr->get() || quan_expr->get()->type() != OpType_FloatToInt8) { + return false; + } + if (quan_expr->inputs().size() != 5) { + return false; + } + // check other + VARP other_var = quan_expr->inputs().at(0); + EXPRP other_expr = other_var->expr().first; + if (!other_expr->get() || other_expr->get()->type() == OpType_ConvInt8 || other_expr->get()->type() == OpType_Cast || other_expr->get()->type() == OpType_Int8ToFloat || other_expr->get()->type() == OpType_FloatToInt8 || other_expr->get()->type() == OpType_Const || other_expr->get()->type() == OpType_DepthwiseConvInt8) { + return false; + } + return true; + }; + auto transformOtherToConvInt8 = [](EXPRP expr) { + auto dequant_var = expr->inputs()[0]; + auto dequant_expr = dequant_var->expr().first; + auto cast_var = dequant_expr->inputs().at(0); + auto cast_expr = cast_var->expr().first; + auto quan_var = cast_expr->inputs().at(0); + auto quan_expr = quan_var->expr().first; + auto convInt8Input = quan_expr->inputs().at(1); + if (expr->inputs().size() == 2) { // The convInt8 comes from matmul. + auto matmulop = expr->get(); + auto count_input = matmulop->main_as_Convolution2D()->common()->inputCount(); + convInt8Input = buildInputForMatmulInt8(convInt8Input, expr->inputs().at(1), count_input); } - auto convInt8Varp = expr->inputs()[0]; - auto convInt8Expr = convInt8Varp->expr().first; - auto convInt8Input = convInt8Expr->inputs()[0]; std::unique_ptr newConvInt8(new MNN::Convolution2DT); - std::unique_ptr oldConvOp(convInt8Expr->get()->UnPack()); + std::unique_ptr oldConvOp(expr->get()->UnPack()); auto oldConvParams = oldConvOp->main.AsConvolution2D(); newConvInt8->common.reset(new MNN::Convolution2DCommonT); newConvInt8->common = std::move(oldConvParams->common); @@ -64,15 +335,153 @@ static auto gRegister = []() { conv_op->main.value = newConvInt8.release(); auto conv_expr = Expr::create(conv_op.get(), {convInt8Input}); - conv_expr->setName(convInt8Expr->name()); - auto conv_var = Variable::create(conv_expr); - conv_var->setName(convInt8Expr->outputName(0)); + conv_expr->setName(expr->name()); Expr::replace(expr, conv_expr); return true; + }; + + // X to otherOp + auto matchXToOther = [](EXPRP expr) { // X->quant->cast->dequant->other + // check op type not convint8. + if (nullptr == expr->get()) { + return false; + } + int inputs_size = static_cast(expr->inputs().size()); + for (int i = 0; i < inputs_size; ++i) { + if (!matchConvInt8ToOther(expr, i) && !matchOtherToOther(expr, i)) { + return false; + } + } + return true; + }; + auto transformXToOther = [](EXPRP expr) { // ohter->quant->cast->dequant->other => other->other + int input_size = static_cast(expr->inputs().size()); + std::vector new_inputs(input_size); + for (int i = 0; i < input_size; ++i) { + if (matchConvInt8ToOther(expr, i)) { + VARP input_i = transformConvInt8ToOther(expr, i); + new_inputs[i] = input_i; + } else { + VARP input_i = transformOtherToOther(expr, i); + new_inputs[i] = input_i; + } + } + + // generate a new oher op. + std::unique_ptr oldOtherOp(expr->get()->UnPack()); + auto newop_expr = Expr::create(oldOtherOp.get(), new_inputs); + Expr::replace(expr, newop_expr); + return true; + + }; + + // endding op->X + auto matchXToEnd= [](EXPRP expr) { // otherOp->quant->cast->dequant->convint8 + if (nullptr == expr->get()) { + return false; + } + // check op type is Int8ToFloat. + if (expr->get()->type() != OpType_Int8ToFloat) { + return false; + } + // check op is the last op. + if (expr->outputs().size() != 0) { + return false; + } + // check cast + VARP cast_var = expr->inputs().at(0); + EXPRP cast_expr = cast_var->expr().first; + if (!cast_expr->get() || cast_expr->get()->type() != OpType_Cast) { + return false; + } + // check FloatToInt8 + VARP quan_var = cast_expr->inputs().at(0); + EXPRP quan_expr = quan_var->expr().first; + if (!quan_expr->get() || quan_expr->get()->type() != OpType_FloatToInt8) { + return false; + } + // check X + VARP X_var = quan_expr->inputs().at(0); + EXPRP X_expr = X_var->expr().first; + if (!X_expr->get() || X_expr->get()->type() == OpType_FloatToInt8 || X_expr->get()->type() == OpType_Const || X_expr->get()->type() == OpType_Cast || X_expr->get()->type() == OpType_Int8ToFloat) { + return false; + } + if (X_expr->get()->type() == OpType_ConvInt8) { + return true; + } + if (X_expr->get()->type() == OpType_Reshape) { + auto convert_var = X_expr->inputs().at(0); + auto convert_expr = convert_var->expr().first; + if (convert_expr->get() && convert_expr->get()->type() == OpType_ConvertTensor) { + auto convint8_var = convert_expr->inputs().at(0); + auto convint8_expr = convint8_var->expr().first; + if (convint8_expr->get() && convint8_expr->get()->type() == OpType_ConvInt8) { + return true; + } + } + } + return true; + }; + auto transformXToEnd = [](EXPRP expr) { + auto cast_var = expr->inputs()[0]; + auto cast_expr = cast_var->expr().first; + auto quan_var = cast_expr->inputs().at(0); + auto quan_expr = quan_var->expr().first; + auto X_var = quan_expr->inputs().at(0); + auto X_expr = X_var->expr().first; + + bool convInt8End = X_expr->get()->type() == OpType_ConvInt8; + if (X_expr->get()->type() == OpType_Reshape) { + auto convert_var = X_expr->inputs().at(0); + auto convert_expr = convert_var->expr().first; + if (convert_expr->get() && convert_expr->get()->type() == OpType_ConvertTensor) { + auto convint8_var = convert_expr->inputs().at(0); + auto convint8_expr = convint8_var->expr().first; + if (convint8_expr->get() && convint8_expr->get()->type() == OpType_ConvInt8) { + convInt8End = true; + X_expr = std::move(convint8_expr); + } + } + } + + if (convInt8End) { + auto convInt8Input = X_expr->inputs().at(0); + std::unique_ptr newConvInt8(new MNN::Convolution2DT); + std::unique_ptr oldConvOp(X_expr->get()->UnPack()); + auto oldConvParams = oldConvOp->main.AsConvolution2D(); + newConvInt8->common.reset(new MNN::Convolution2DCommonT); + newConvInt8->common = std::move(oldConvParams->common); + newConvInt8->symmetricQuan.reset(new QuantizedFloatParamT); + newConvInt8->symmetricQuan = std::move(oldConvParams->symmetricQuan); + newConvInt8->symmetricQuan->outputDataType = DataType_DT_FLOAT; // If convInt8 is the last op, float value is the torch-fx model's output. + + std::unique_ptr conv_op(new OpT); + conv_op->name = X_expr->name(); + conv_op->type = oldConvOp->type; + conv_op->main.type = OpParameter_Convolution2D; + conv_op->main.value = newConvInt8.release(); + + auto conv_expr = Expr::create(conv_op.get(), {convInt8Input}); + conv_expr->setName(X_expr->name()); + Expr::replace(expr, conv_expr); + return true; + } + + // directly return the op output. + std::unique_ptr oldOtherOp(X_expr->get()->UnPack()); + auto newop_expr = Expr::create(oldOtherOp.get(), X_expr->inputs()); + Expr::replace(expr, newop_expr); + return true; }; - TemplateMerge::getInstance("Merge").insertTemplate("ConvQuantizeDequantizeLinearFuseToConvInt8", match, transform, + TemplateMerge::getInstance("Merge").insertTemplate("ConvInt8ToConvInt8", matchConvInt8ToConvInt8, transformConvInt8ToConvInt8, + PASS_PRIORITY_MIDDLE); + TemplateMerge::getInstance("Merge").insertTemplate("OtherOpToConvInt8", matchOtherToConvInt8, transformOtherToConvInt8, + PASS_PRIORITY_MIDDLE); + TemplateMerge::getInstance("Merge").insertTemplate("XToOtherOp", matchXToOther, transformXToOther, + PASS_PRIORITY_MIDDLE); + TemplateMerge::getInstance("Merge").insertTemplate("XToEndOp", matchXToEnd, transformXToEnd, PASS_PRIORITY_MIDDLE); return true; }(); diff --git a/tools/converter/source/optimizer/merge/ConvertMatMulToConv2D.cpp b/tools/converter/source/optimizer/merge/ConvertMatMulToConv2D.cpp index 97824d82e..638997845 100644 --- a/tools/converter/source/optimizer/merge/ConvertMatMulToConv2D.cpp +++ b/tools/converter/source/optimizer/merge/ConvertMatMulToConv2D.cpp @@ -77,7 +77,7 @@ ConvertMatMulToConv2D::ConvertMatMulToConv2D() { } } - if (input->expr().first->inputs().size() > 2) { // matmul has already had a bias. + if (input->expr().first->inputs().size() > 2) { // matmul has already had a bias or matmul comes from _MatMul_Int8 return false; } @@ -180,6 +180,11 @@ ConvertMatMulToConv2D::ConvertMatMulToConv2D() { if (info->dim.size() == 0) { return false; } + if (info->type.bits != 8 && info->type.bits != 32) { + MNN_ERROR("Do not support weight bits=%d\n", (int)info->type.bits); + return false; + } + bool convertToConvInt8 = info->type.bits == 8; bool needSqueezeB = false; if (info->dim.size() == 1) { weight = _Unsqueeze(weight, {1}); @@ -215,26 +220,42 @@ ConvertMatMulToConv2D::ConvertMatMulToConv2D() { const float* weightDataPtr = nullptr; const float* biasPtr = nullptr; weightDataPtr = weight->readMap(); + if (convertToConvInt8) { // DynamicQuantizeLinear + dense->symmetricQuan.reset(new QuantizedFloatParamT); + dense->symmetricQuan->nbits = 8; + std::vector scale_1(num_output, 1.0); + dense->symmetricQuan->clampMin = -1; + dense->symmetricQuan->clampMax = -1; + dense->symmetricQuan->zeroPoint = 0; + dense->symmetricQuan->outputZeroPoint = 0; + dense->symmetricQuan->scale = std::move(scale_1); + dense->symmetricQuan->outputDataType = DataType_DT_FLOAT; + } if (weightDataPtr) { // Weight is a const node. - dense->weight.resize(info->size); - memcpy(dense->weight.data(), weightDataPtr, info->size * sizeof(float)); - // Release compute cache for save memory - weight->expr().first->inside()->mCache = nullptr; - - dense->bias.resize(num_output); - if (expr->inputs().size() == 3) { // bias is a const node. - auto bias = expr->inputs()[2]; - biasPtr = bias->readMap(); - ::memcpy(dense->bias.data(), biasPtr, num_output * sizeof(float)); - // Release compute cache for save memory - bias->expr().first->inside()->mCache = nullptr; - } else if (param->bias() && param->bias()->size() == num_output) { - ::memcpy(dense->bias.data(), param->bias()->data(), num_output * sizeof(float)); + if (false == convertToConvInt8) { + dense->weight.resize(info->size); + memcpy(dense->weight.data(), weightDataPtr, info->size * sizeof(float)); + dense->bias.resize(num_output); + if (expr->inputs().size() == 3) { // bias is a const node. + auto bias = expr->inputs()[2]; + biasPtr = bias->readMap(); + ::memcpy(dense->bias.data(), biasPtr, num_output * sizeof(float)); + // Release compute cache for save memory + bias->expr().first->inside()->mCache = nullptr; + } else if (param->bias() && param->bias()->size() == num_output) { + ::memcpy(dense->bias.data(), param->bias()->data(), num_output * sizeof(float)); + } else { + std::fill(dense->bias.begin(), dense->bias.end(), 0.0f); + } } else { - std::fill(dense->bias.begin(), dense->bias.end(), 0.0f); + dense->symmetricQuan->weight.resize(info->size); + memcpy(dense->symmetricQuan->weight.data(), weightDataPtr, info->size * sizeof(int8_t)); + dense->symmetricQuan->bias.resize(num_output, 0); } + // Release compute cache for save memory + weight->expr().first->inside()->mCache = nullptr; } dense->common.reset(new Convolution2DCommonT); @@ -242,7 +263,11 @@ ConvertMatMulToConv2D::ConvertMatMulToConv2D() { dense->common->outputCount = num_output; std::unique_ptr dense_op(new OpT); - dense_op->type = OpType_Convolution; + if (convertToConvInt8) { + dense_op->type = OpType_ConvInt8; + } else { + dense_op->type = OpType_Convolution; + } dense_op->main.type = OpParameter_Convolution2D; dense_op->main.value = dense.release(); auto rank = _Rank(input); @@ -272,7 +297,9 @@ ConvertMatMulToConv2D::ConvertMatMulToConv2D() { RemoveAndStoreParam(dense_op, config->externalFile, config->externalOffset); } EXPRP dense_expr; - if (weightDataPtr) { + if (convertToConvInt8) { + dense_expr = Expr::create(dense_op.get(), {input}, 1); + } else if (weightDataPtr) { dense_expr = Expr::create(dense_op.get(), {input}, 1); } else { if (expr->inputs().size() > 2) { @@ -300,6 +327,215 @@ ConvertMatMulToConv2D::ConvertMatMulToConv2D() { }; TemplateMerge::getInstance("Merge").insertTemplate("ConvertMatMulToConv2D", match, fold, PASS_PRIORITY_MIDDLE); } + // Directly convert matmul with quantize linear to convint8 + { + auto fold = [this](EXPRP expr) -> bool { + auto config = Global::Get(); + auto version = config->targetVersion; + if (version < 1.1f) { + // For target version < 1.1 , don't support matmul + bias fuse + return false; + } + if (!expr->get()) { + return false; + } + if (expr->get()->type() != OpType_BinaryOp && expr->get()->type() != OpType_MatMul) { + return false; + } + if (expr->get()->type() != OpType_BinaryOp && expr->get()->main_as_BinaryOp() && expr->get()->main_as_BinaryOp()->opType() != BinaryOpOperation_ADD) { + return false; + } + VARP matmul_var; + EXPRP matmul_expr; + VARP bias_var = nullptr; + bool matmulAddBias = true; + // First, get matmul_expr + if (expr->get()->type() == OpType_BinaryOp) { + matmul_var = expr->inputs().at(0); + matmul_expr = matmul_var->expr().first; + if (matmul_expr->get() == nullptr) { + return false; + } + if (expr->inputs().size() > 1) { + bias_var = expr->inputs().at(1); + if (matmul_var->expr().first->get() == nullptr || matmul_var->expr().first->get()->type() == OpType_Const) { + bias_var = expr->inputs()[0]; + matmul_var = expr->inputs()[1]; + matmul_expr = matmul_var->expr().first; + } + } + if (bias_var->getInfo() == nullptr) { + return false; + } + if (bias_var->expr().first->inputType() == VARP::InputType::INPUT) { + return false; + } + // conv -> reshape -> convert -> add + if (matmul_expr->get()->type() == OpType_ConvertTensor) { + matmul_var = matmul_expr->inputs()[0]; + matmul_expr = matmul_var->expr().first; + if (matmul_expr->get()->type() == OpType_Reshape) { + matmul_var = matmul_expr->inputs()[0]; + matmul_expr = matmul_var->expr().first; + } + } + if (matmul_expr->inputs().size() != 8 && matmul_expr->inputs().size() != 9) { // matmul 8 input: (x,y,x_scale,x_zero,y_scale,y_zero,out_scale,out_zero,bias + return false; + } + if (matmul_var->linkNumber() > 1) { + return false; + } + } else { + matmul_expr = std::move(expr); + if (matmul_expr->inputs().size() != 8 && matmul_expr->inputs().size() != 9) { + return false; + } + matmulAddBias = false; + } // finish getting matmul_expr + + // Second, get matmul parameters + auto matmulOp = matmul_expr->get(); + auto matmul_input = matmul_expr->inputs().at(0); + auto input = matmul_expr->inputs().at(0); + auto weight = matmul_expr->inputs()[1]; + auto weightInfo = weight->getInfo(); + if (nullptr == matmulOp || matmulOp->type() != OpType_MatMul) { + return false; + } + if (nullptr == weightInfo || weightInfo->dim.size() != 2 || weightInfo->type.bits != 8) { + return false; + } + // Compute number_output + auto transposeB = matmulOp->main_as_MatMul()->transposeB(); + auto transposeA = matmulOp->main_as_MatMul()->transposeA(); + auto needSqueezeB = false; + auto needSqueezeA = false; + if (weightInfo->dim.size() == 1) { + weight = _Unsqueeze(weight, {1}); + needSqueezeB = true; + } + if (!transposeB) { + weight = _Transpose(weight, {1, 0}); + } + weightInfo = weight->getInfo(); + if (input->getInfo() && input->getInfo()->dim.size() <= 1) { + input = _Unsqueeze(input, {0}); + needSqueezeA = true; + } + if (needSqueezeA && needSqueezeB) { + MNN_ERROR("Invalid MatMul for one-dimension A and B\n"); + return false; + } + auto format = MNN::MNN_DATA_FORMAT_NCHW; + if (config->model == modelConfig::TFLITE || config->model == modelConfig::TENSORFLOW) { + format = MNN_DATA_FORMAT_NHWC; + } + int numberOutput = weightInfo->dim[0]; // need to check + int numberInput = weightInfo->dim[1]; + + if (matmulAddBias) { + auto biasInfo = bias_var->getInfo(); + if (biasInfo->size != numberOutput) { + return false; + } + } + auto matmulInput = matmul_expr->inputs().at(0); + auto inputScale = matmul_expr->inputs().at(2); + auto inputZero = matmul_expr->inputs().at(3); + auto weightScale = matmul_expr->inputs().at(4); + auto outputScale = matmul_expr->inputs().at(6); + auto outputZero = matmul_expr->inputs().at(7); + + float input_zero = inputZero->readMap()[0]; + float input_scale = inputScale->readMap()[0]; + const float* weight_scale = weightScale->readMap(); + float output_scale = outputScale->readMap()[0]; + uint8_t output_zero = outputZero->readMap()[0]; + // Convint8 + std::unique_ptr dense(new MNN::Convolution2DT); + dense->common.reset(new MNN::Convolution2DCommonT); + dense->common->inputCount = numberInput; + dense->common->outputCount = numberOutput; + // quant info + dense->symmetricQuan.reset(new QuantizedFloatParamT); + dense->symmetricQuan->nbits = 8; + dense->symmetricQuan->clampMin = -128; + dense->symmetricQuan->clampMax = 127; + dense->symmetricQuan->zeroPoint = static_cast(input_zero); + dense->symmetricQuan->outputZeroPoint = static_cast(output_zero); + // weight and bias + auto weight_ptr = weight->readMap(); + dense->symmetricQuan->weight.resize(weightInfo->size); + memcpy(dense->symmetricQuan->weight.data(), weight_ptr, weightInfo->size * sizeof(int8_t)); + dense->symmetricQuan->bias.resize(numberOutput, 0); + if (matmul_expr->inputs().size() == 9) { + bias_var = matmul_expr->inputs().at(8); + auto bias_ptr = bias_var->readMap(); + memcpy(dense->symmetricQuan->bias.data(), bias_ptr, sizeof(int32_t) * numberOutput); + } + // compute conv scale=input_scale * weight_scale / output_scale + std::vector conv_scale(numberOutput); + for (int k = 0; k < numberOutput; ++k) { + if (output_scale != 0) { + conv_scale[k] = input_scale * weight_scale[k] / output_scale; + } else { + conv_scale[k] = 0.f; + } + } + dense->symmetricQuan->scale = std::move(conv_scale); + + // Third, build convint8 op + std::unique_ptr dense_op(new OpT); + dense_op->type = OpType_ConvInt8; + dense_op->main.type = OpParameter_Convolution2D; + dense_op->main.value = dense.release(); + auto rank = _Rank(input); + auto inputShape = _Shape(input, NCHW); + auto inputL = _Unsqueeze(_Scalar(numberInput), {0}); + inputL.fix(VARP::CONSTANT); + auto outputH = _Unsqueeze(_Scalar(numberOutput), {0}); + outputH.fix(VARP::CONSTANT); + VARP inputE; + VARP inputRemain = _StridedSlice(inputShape, _Unsqueeze(_Scalar(0), {0}), _Unsqueeze(rank - _Scalar(2), {0}), _Unsqueeze(_Scalar(1), {0}), 0, 0, 0, 0, 0); + if (transposeA) { + inputE = _Slice(inputShape, _Unsqueeze(rank - _Scalar(1), {0}), _Unsqueeze(_Scalar(1), {0})); + if (format == MNN_DATA_FORMAT_NHWC) { + input = _ReshapeF(input, _Concat({_Unsqueeze(_Scalar(-1), {0}), inputE, _Unsqueeze(_Scalar(1), {0}), inputL}, 0), format); + } else { + input = _ReshapeF(input, _Concat({_Unsqueeze(_Scalar(-1), {0}), inputL, inputE, _Unsqueeze(_Scalar(1), {0})}, 0), format); + } + } else { + inputE = _Slice(inputShape, _Unsqueeze(rank - _Scalar(2), {0}), _Unsqueeze(_Scalar(1), {0})); + if (format == MNN_DATA_FORMAT_NHWC) { + input = _ReshapeF(input, _Concat({_Unsqueeze(_Scalar(-1), {0}), _Unsqueeze(_Scalar(1), {0}), _Unsqueeze(_Scalar(1), {0}), inputL}, 0), format); + } else { + input = _ReshapeF(input, _Concat({_Unsqueeze(_Scalar(-1), {0}), inputL, _Unsqueeze(_Scalar(1), {0}), _Unsqueeze(_Scalar(1), {0})}, 0), format); + } + } + if (config->externalFile && weightInfo->size >= config->externalTreshold) { + RemoveAndStoreParam(dense_op, config->externalFile, config->externalOffset); + } + float aa = 0; + if (transposeA) { + aa = 1.0f; + } + EXPRP dense_expr = Expr::create(dense_op.get(), {matmul_input, _Const(aa)}, 1); + VARP output = Variable::create(dense_expr); + output->setName(matmul_expr->outputName(0) + "__matmul_converted"); + output = _ConvertF(output, format); + VARP reshapeVar = _ReshapeF(output, _Concat({inputRemain, inputE, outputH}, 0), format); + if (needSqueezeA) { + reshapeVar = _Squeeze(reshapeVar, {0}); + } + if (needSqueezeB) { + reshapeVar = _Squeeze(reshapeVar, {1}); + } + reshapeVar->setName(matmul_expr->outputName(0) + "__matmul_cvt_convInt8"); + Expr::replace(matmul_expr, reshapeVar->expr().first); + return true; + }; + TemplateMerge::getInstance("Merge").insertTemplateV2("MatMulInt8ToConvInt8", fold, PASS_PRIORITY_HIGH); + } } static ConvertMatMulToConv2D g_convert_matmul_to_dense; diff --git a/tools/converter/source/optimizer/merge/ReluDequantizeLinearFuseToConvInt8.cpp b/tools/converter/source/optimizer/merge/ReluDequantizeLinearFuseToConvInt8.cpp deleted file mode 100644 index fc8fc05e3..000000000 --- a/tools/converter/source/optimizer/merge/ReluDequantizeLinearFuseToConvInt8.cpp +++ /dev/null @@ -1,109 +0,0 @@ -// -// ReluDequantizeLinearFuseToConvInt8.cpp -// MNNConverter -// -// Created by MNN on 2020/07/28. -// Copyright © 2018, Alibaba Group Holding Limited -// - -#include "../TemplateMerge.hpp" -#include "MNN/expr/MathOp.hpp" -#include "MNN/expr/NeuralNetWorkOp.hpp" -#include "MNN_generated.h" -#include "MNN_compression.pb.h" -#include - -namespace MNN { -namespace Express { - -static auto gRegister = []() { - auto match = [](EXPRP expr) { - if (nullptr == expr->get() || expr->get()->type() != OpType_QuantizeLinear) { - return false; - } - - VARP relu6_var = expr->inputs().at(0); - EXPRP relu6_expr = relu6_var->expr().first; - if (!relu6_expr->get() || relu6_expr->get()->type() != OpType_ReLU6) { - return false; - } - - VARP dequant_var = relu6_expr->inputs().at(0); - EXPRP dequant_expr = dequant_var->expr().first; - if (!dequant_expr->get() || (dequant_expr->get()->type() != OpType_DequantizeLinear)) { - return false; - } - - VARP convert_var = dequant_expr->inputs().at(0); - EXPRP convert_expr = convert_var->expr().first; - if (!convert_expr->get() || convert_expr->get()->type() != OpType_ConvertTensor) { - return false; - } - - VARP cast_var = convert_expr->inputs().at(0); - EXPRP cast_expr = cast_var->expr().first; - if (!cast_expr->get() || cast_expr->get()->type() != OpType_Cast) { - return false; - } - - VARP convInt8_var = cast_expr->inputs().at(0); - EXPRP convInt8_expr = convInt8_var->expr().first; - if (!convInt8_expr->get() || (convInt8_expr->get()->type() != OpType_ConvInt8 && convInt8_expr->get()->type() != OpType_DepthwiseConvInt8)) { - return false; - } - return true; - }; - - auto transform = [](EXPRP expr) { - auto gConverterConfig = Global::Get(); - std::string compressFileName = gConverterConfig->compressionParamsFile; - Compression::Pipeline proto; - if (compressFileName != "") { - std::fstream input(compressFileName.c_str(), std::ios::in | std::ios::binary); - if (!proto.ParseFromIstream(&input)) { - MNN_ERROR("Failed to parse compression pipeline proto.\n"); - } - } - - auto relu6_var = expr->inputs()[0]; - auto relu6_expr = relu6_var->expr().first; - auto dequantize_var = relu6_expr->inputs()[0]; - auto dequantize_expr = dequantize_var->expr().first; - auto convert_var = dequantize_expr->inputs()[0]; - auto convert_expr = convert_var->expr().first; - auto cast_var = convert_expr->inputs()[0]; - auto cast_expr = cast_var->expr().first; -// auto quantize_var = cast_expr->inputs()[0]; -// auto quantize_expr = quantize_var->expr().first; - auto convInt8_var = cast_expr->inputs()[0]; - auto convInt8_expr= convInt8_var->expr().first; - auto convInt8Input = convInt8_expr->inputs()[0]; - - std::unique_ptr convInt8Op(convInt8_expr->get()->UnPack()); - - std::unique_ptr newconv_op(new OpT); - newconv_op->name = expr->name(); - newconv_op = std::move(convInt8Op); - - auto convParams = newconv_op->main.AsConvolution2D(); - auto& common = convParams->common; - common->relu6 = true; - newconv_op->type = OpType_ConvInt8; - bool is_depthwise = common->inputCount == common->outputCount && common->outputCount == common->group; - if (is_depthwise) { - newconv_op->type = OpType_DepthwiseConvInt8; - } - - auto conv_expr = Expr::create(newconv_op.get(), {convInt8Input}); - conv_expr->setName(convInt8_expr->name()); - Expr::replace(expr, conv_expr); - return true; - }; - - TemplateMerge::getInstance("Merge").insertTemplate("ReluDequantizeLinearFuseToConvInt8", match, transform, - PASS_PRIORITY_LOW); - return true; -}(); - -} -} // namespace MNN diff --git a/tools/converter/source/optimizer/onnxextra/MatMulInteger.cpp b/tools/converter/source/optimizer/onnxextra/MatMulInteger.cpp index 3e2b23715..b034c29ee 100644 --- a/tools/converter/source/optimizer/onnxextra/MatMulInteger.cpp +++ b/tools/converter/source/optimizer/onnxextra/MatMulInteger.cpp @@ -22,11 +22,24 @@ class OnnxMatMulIntegerTransform : public OnnxExtraManager::Transform { auto y = inputs[1]; x = _Cast(x); y = _Cast(y); + auto offset = _Const(128.0f); + auto x_fp32 = x - offset; + auto y_fp32 = y - offset; + auto y_int8 = _Cast(y_fp32); + auto x_int8 = _FloatToInt8(x_fp32, _Scalar(1.0f), -128, 127); + auto z = _MatMul(x_int8, y_int8); if (inputs.size() > 2) { - x = x - _Cast(inputs[2]); - y = y - _Cast(inputs[3]); + auto x_zero_fp32 = _Cast(inputs[2]) - offset; + auto x_zero_int8 = _Cast(x_zero_fp32); + auto y_shape = y->getInfo()->dim; // y:[K,N] + auto y_zero = _Unsqueeze(_Cast(inputs[3]), {0}); + auto y_zero_fp32 = y_zero - offset; + auto y_zero_1xN = _Cast(y_zero_fp32); + int N = y_shape[1]; + auto y_reduce0 = _ReduceSum(y - y_zero, {0}, true); // y_:[1,N] + auto x_reduce1 = _ReduceSum(x_fp32, {2}, true); + z = _MatMul(x_int8, y_int8) - x_zero_fp32 * y_reduce0 - _MatMul(x_reduce1, y_zero_fp32); } - auto z = _MatMul(x, y); auto zInt = _Cast(z); auto newExpr = zInt->expr().first; newExpr->setName(expr->name()); diff --git a/tools/converter/source/optimizer/onnxextra/OnnxConvolutionMerge.cpp b/tools/converter/source/optimizer/onnxextra/OnnxConvolutionMerge.cpp index 730ab7c0c..479057c0a 100644 --- a/tools/converter/source/optimizer/onnxextra/OnnxConvolutionMerge.cpp +++ b/tools/converter/source/optimizer/onnxextra/OnnxConvolutionMerge.cpp @@ -137,13 +137,30 @@ class OnnxConvolutionTransform : public OnnxExtraManager::Transform { } auto weight = inputs[1]; auto weight_expr = weight->expr().first; - - auto weightInfo = weight->getInfo(); - if (nullptr == weightInfo) { + bool weightIden = false; + bool xIden = false; + if (weight_expr->get()) { + weightIden = weight_expr->get()->type() == OpType_Int8ToFloat; + } + if (inputs[0]->expr().first->get()) { + xIden = inputs[0]->expr().first->get()->type() == OpType_Int8ToFloat; + } + if (false == weightIden && nullptr == weight->getInfo()) { MNN_ERROR("Convolution should know weight shape infromation!\n"); return nullptr; } - auto& weightShape = weightInfo->dim; + INTS weightShape; + if (weightIden) { + auto dim = weight_expr->inputs().at(4)->readMap(); + int dimSize = weight_expr->inputs().at(4)->getInfo()->dim[0]; + for (int k = 0; k < dimSize; ++k) { + weightShape.emplace_back(dim[k]); + } + } else { + weightShape = weight->getInfo()->dim; + } + bool convertToConvint8 = false; + convertToConvint8 = (true == weightIden && true == xIden && weight_expr->inputs().size() == 5); auto op = expr->get(); auto extraParam = op->main_as_Extra(); @@ -275,18 +292,17 @@ class OnnxConvolutionTransform : public OnnxExtraManager::Transform { // Fastest limitNumber = 100; } - if ( weight->linkNumber() <= limitNumber) { + if ( weight->linkNumber() <= limitNumber && !convertToConvint8) { weightDataPtr = weight->readMap(); } - bool mergeQuantizeLinearToConvInt8 = weight_expr->get() && weight_expr->get()->type() == OpType_DequantizeLinear; - if (true == mergeQuantizeLinearToConvInt8) { + if (convertToConvint8) { // Get output quant info. auto outputExpr = expr->outputs().front().lock(); auto outputScaleVar = outputExpr->inputs()[1]; float outputScale = outputScaleVar->readMap()[0]; int8_t outputZero = 0; if (outputExpr->inputs().size() > 2) { - outputZero = outputExpr->inputs()[2]->readMap()[0]; + outputZero = static_cast(outputExpr->inputs()[2]->readMap()[0]); } // Get weight quant info. float inputClampMin = -128; @@ -319,18 +335,15 @@ class OnnxConvolutionTransform : public OnnxExtraManager::Transform { // Get input quant info. auto inputExpr = inputs[0]->expr().first; - x = inputExpr->inputs()[0]; - auto inputScaleVar = inputExpr->inputs()[1]; + //x = inputExpr->inputs()[0]; // for op merge to convint8, so remain int8ToFloat layer for the moment + auto inputScaleVar = inputExpr->inputs()[2]; + auto inputZeroVar = inputExpr->inputs()[3]; float inputScale = inputScaleVar->readMap()[0]; - int8_t inputZero = 0; - if (inputExpr->inputs().size() > 2) { - auto inputZeroVar = inputExpr->inputs()[2]; - inputZero = inputZeroVar->readMap()[0]; - } - + int8_t inputZero = static_cast(inputZeroVar->readMap()[0]); + // Compute convInt8 scale=(inputScale * weightScale)/outputScale std::vector scale(co); - auto weightScale = weightexpr->inputs()[1]; + auto weightScale = weightexpr->inputs().at(2); auto ptrscale = weightScale->readMap(); for (int cnt = 0; cnt < co; ++cnt) { if (outputScale != 0){ @@ -341,12 +354,12 @@ class OnnxConvolutionTransform : public OnnxExtraManager::Transform { } convParam->symmetricQuan->scale = std::move(scale); convParam->symmetricQuan->clampMax = 127; - convParam->symmetricQuan->clampMin = -127; + convParam->symmetricQuan->clampMin = -128; convParam->symmetricQuan->zeroPoint = std::move(inputZero); convParam->symmetricQuan->outputZeroPoint = std::move(outputZero); } // Do not return convInt8. - if (false == mergeQuantizeLinearToConvInt8 && weightDataPtr) { + if (false == convertToConvint8 && weightDataPtr) { if (weight->linkNumber() > 1) { static bool gPrint = false; if (!gPrint) { @@ -397,7 +410,7 @@ class OnnxConvolutionTransform : public OnnxExtraManager::Transform { } } - if (!isDeconv && true == mergeQuantizeLinearToConvInt8) { + if (!isDeconv && true == weightIden && true == xIden && weight_expr->inputs().size() == 5) { newOp->type = OpType_ConvInt8; if (common->inputCount == common->outputCount && common->outputCount == common->group) { newOp->type = OpType_DepthwiseConvInt8; @@ -420,7 +433,7 @@ class OnnxConvolutionTransform : public OnnxExtraManager::Transform { outputShape.insert(outputShape.begin(), 1); outputShape.push_back(1); auto output_shape = _Const(outputShape.data(), {4}, NHWC, halide_type_of()); - if (weightDataPtr) { + if (weightDataPtr || convertToConvint8) { // merge weight(bias) node to Conv parameter convolutionExpr = Expr::create(newOp.get(), {x, output_shape}); } else { @@ -432,7 +445,7 @@ class OnnxConvolutionTransform : public OnnxExtraManager::Transform { convolutionExpr = Expr::create(newOp.get(), {x, inputs[1], output_shape}); } } - } else if (weightDataPtr) { + } else if (weightDataPtr || convertToConvint8) { // merge weight(bias) node to Conv parameter convolutionExpr = Expr::create(newOp.get(), {x}); } else { diff --git a/tools/converter/source/optimizer/onnxextra/OnnxDeQuantizeLinear.cpp b/tools/converter/source/optimizer/onnxextra/OnnxDeQuantizeLinear.cpp index b5a543bcd..b3c241104 100644 --- a/tools/converter/source/optimizer/onnxextra/OnnxDeQuantizeLinear.cpp +++ b/tools/converter/source/optimizer/onnxextra/OnnxDeQuantizeLinear.cpp @@ -1,5 +1,5 @@ // -// OnnxQuantizeLinear.cpp +// OnnxDequantizeLinear.cpp // MNNConverter // // Created by MNN on 2023/03/03. @@ -13,44 +13,6 @@ namespace MNN { namespace Express { -static VARP _DequantizeLinear(VARP x, VARP scales, VARP zeroPoints) { - auto scaleInfo = scales->getInfo(); - auto zeroInfo = zeroPoints->getInfo(); - INTS zeroShape; - auto& scaleShape = scaleInfo->dim; // e.g [1,1,D,1], D>1 - if (nullptr != zeroInfo) { - zeroShape = zeroInfo->dim; // e.g [1,1,D,1], D>1 - } - if (zeroInfo && scaleShape.size() != zeroShape.size()) { - MNN_ERROR("QuantizeLinear scale and zeroPoints should be the same shape!\n"); - return nullptr; - } - int scaleSize = 1, zeroSize = 1; - int scaleAxis = 0, zeroAxis = 0; - for (int d = 0; d < scaleShape.size(); ++d) { - if (scaleShape[d] > scaleSize) { - scaleSize = scaleShape[d]; - scaleAxis = d; - } - if (zeroInfo && zeroShape[d] > zeroSize) { - zeroSize = zeroShape[d]; - zeroAxis = d; - } - } - if (zeroInfo && (scaleSize != zeroSize || scaleAxis != zeroAxis)) { - MNN_ERROR("QuantizeLinear scale and zeroPoints should be the same size and same axis!\n"); - return nullptr; - } - - std::unique_ptr dequantizeLinear(new OpT); - dequantizeLinear->type = OpType_DequantizeLinear; - dequantizeLinear->main.type = OpParameter_DequantizeLinear; - dequantizeLinear->main.value = new DequantizeLinearT; - dequantizeLinear->main.AsDequantizeLinear()->scaleSize = scaleSize; - dequantizeLinear->main.AsDequantizeLinear()->scaleAxis = scaleAxis; - return (Variable::create(Expr::create(dequantizeLinear.get(), {x, scales, zeroPoints}))); - } - class OnnxDequantizeLinearTransform : public OnnxExtraManager::Transform { public: virtual EXPRP onExecute(EXPRP expr) const override { @@ -72,9 +34,26 @@ class OnnxDequantizeLinearTransform : public OnnxExtraManager::Transform { if (inputs.size() > 2) { zeropoint = inputs[2]; } - auto output = _DequantizeLinear(input, scale, zeropoint); - output->setName(expr->name()); - return output->expr().first; + + std::vector inputDim = {}; + if (input->getInfo()) { + inputDim = input->getInfo()->dim; + } + if (!scale->getInfo()->dim.empty()) { + zeropoint = _Unsqueeze(zeropoint, {1,2,3}); + scale = _Unsqueeze(scale, {1, 2, 3}); + } else { + scale = _Reshape(scale, {1}); + zeropoint = _Reshape(zeropoint, {1}); + } + auto _shape = _Const(inputDim.data(), {static_cast(inputDim.size())}, NHWC, halide_type_of()); + auto output = (_Cast(input) - _Cast(zeropoint)) * scale; + std::unique_ptr iden(new MNN::OpT); + iden->type = OpType_Int8ToFloat; + + auto newExpr = MNN::Express::Expr::create(iden.get(), {input, output, scale, _Cast(zeropoint), _shape}, 5); + newExpr->setName(expr->name()); + return newExpr; } }; diff --git a/tools/converter/source/optimizer/onnxextra/OnnxGemm.cpp b/tools/converter/source/optimizer/onnxextra/OnnxGemm.cpp index 6300d4f8e..70490e32f 100644 --- a/tools/converter/source/optimizer/onnxextra/OnnxGemm.cpp +++ b/tools/converter/source/optimizer/onnxextra/OnnxGemm.cpp @@ -11,6 +11,15 @@ namespace MNN { namespace Express { +static VARP _MatMul_Int8(VARP a, VARP b, bool tranposeA, bool tranposeB, VARP scaleA, VARP zeroA, VARP scaleB, VARP zeroB, VARP ScaleOut, VARP ScaleZero, VARP bias = nullptr) { + std::unique_ptr op(new OpT); + op->main.type = OpParameter_MatMul; + op->type = OpType_MatMul; + op->main.value = new MatMulT; + op->main.AsMatMul()->transposeA = tranposeA; + op->main.AsMatMul()->transposeB = tranposeB; + return (Variable::create(Expr::create(op.get(), {a, b, scaleA, zeroA, scaleB, zeroB, ScaleOut, ScaleZero, bias}))); +} class OnnxGemmTransform : public OnnxExtraManager::Transform { public: @@ -21,6 +30,7 @@ class OnnxGemmTransform : public OnnxExtraManager::Transform { bool transB = false; float alpha = 1.0f; float beta = 1.0f; + bool op8 = false; auto extraParam = op->main_as_Extra(); const int attrSize = extraParam->attr()->size(); @@ -46,7 +56,32 @@ class OnnxGemmTransform : public OnnxExtraManager::Transform { } auto X = inputs[0]; auto Y = inputs[1]; + auto x_expr = X->expr().first; + auto y_expr = Y->expr().first; auto Z = _MatMul(X, Y, transA, transB); + if (x_expr->get() && y_expr->get() && x_expr->get()->type() == OpType_Int8ToFloat && y_expr->get()->type() == OpType_Int8ToFloat) { + // input quant info + auto y_int8 = y_expr->inputs().at(0); + auto y_scale = y_expr->inputs().at(2); + auto y_zero = y_expr->inputs().at(3); + auto x_int8 = x_expr->inputs().at(0); + auto x_scale = x_expr->inputs().at(2); + auto x_zero = x_expr->inputs().at(3); + // output quant info + auto outputExpr = expr->outputs().front().lock(); + auto outputScaleVar = outputExpr->inputs()[1]; + auto outputZero = outputExpr->inputs()[2]; + + Z = _MatMul_Int8(X, y_int8, transA, transB, x_scale, x_zero, y_scale, y_zero, outputScaleVar, outputZero); + if (inputs.size() > 2) { + auto bias_expr = inputs[2]->expr().first; + auto bias_int32 = bias_expr->inputs().at(0); + Z = _MatMul_Int8(X, y_int8, transA, transB, x_scale, x_zero, y_scale, y_zero, outputScaleVar, outputZero, bias_int32); + } + Z->setName(expr->name()); + return Z->expr().first; + } + if (1.0f != alpha) { Z = Z * _Scalar(alpha); } diff --git a/tools/converter/source/optimizer/onnxextra/OnnxQuantizeLinear.cpp b/tools/converter/source/optimizer/onnxextra/OnnxQuantizeLinear.cpp index e8a7579d5..6f24ae485 100644 --- a/tools/converter/source/optimizer/onnxextra/OnnxQuantizeLinear.cpp +++ b/tools/converter/source/optimizer/onnxextra/OnnxQuantizeLinear.cpp @@ -14,44 +14,6 @@ namespace MNN { namespace Express { /* Given a float input value x, it quantizes x to corresponding int8 value quant_x using scales and zeroPoint. */ -static VARP _QuantizeLinear(VARP x, VARP scales, VARP zeroPoints) { - auto scaleInfo = scales->getInfo(); - auto zeroInfo = zeroPoints->getInfo(); - INTS zeroShape; - auto& scaleShape = scaleInfo->dim; // e.g [1,1,D,1], D>1 - if (nullptr != zeroInfo) { - zeroShape = zeroInfo->dim; // e.g [1,1,D,1], D>1 - } - if (zeroInfo && scaleShape.size() != zeroShape.size()) { - MNN_ERROR("QuantizeLinear scale and zeroPoints should be the same shape!\n"); - return nullptr; - } - int scaleSize = 1, zeroSize = 1; - int scaleAxis = 0, zeroAxis = 0; - for (int d = 0; d < scaleShape.size(); ++d) { - if (scaleShape[d] > scaleSize) { - scaleSize = scaleShape[d]; - scaleAxis = d; - } - if (zeroInfo && zeroShape[d] > zeroSize) { - zeroSize = zeroShape[d]; - zeroAxis = d; - } - } - if (zeroInfo && (scaleSize != zeroSize || scaleAxis != zeroAxis)) { - MNN_ERROR("QuantizeLinear scale and zeroPoints should be the same size and same axis!\n"); - return nullptr; - } - - std::unique_ptr quantizeLinear(new OpT); - quantizeLinear->type = OpType_QuantizeLinear; - quantizeLinear->main.type = OpParameter_QuantizeLinear; - quantizeLinear->main.value = new QuantizeLinearT; - quantizeLinear->main.AsQuantizeLinear()->scaleSize = scaleSize; - quantizeLinear->main.AsQuantizeLinear()->scaleAxis = scaleAxis; - return (Variable::create(Expr::create(quantizeLinear.get(), {x, scales, zeroPoints}))); -} - class OnnxQuantizeLinearTransform : public OnnxExtraManager::Transform { public: virtual EXPRP onExecute(EXPRP expr) const override { @@ -69,13 +31,23 @@ class OnnxQuantizeLinearTransform : public OnnxExtraManager::Transform { MNN_ERROR("QuantizeLinear should provide scale and input\n"); return nullptr; } - VARP zeropoint = nullptr; + VARP zeropoint = _Const(0.f); if (inputs.size() > 2) { - zeropoint = inputs[2]; + zeropoint = _Cast(inputs[2]); + } + auto scaleReq = _Reciprocal(scale); + auto output = _Cast(_Round(_Relu6(_Round(input * scaleReq) + zeropoint, -128.0f, 127.0f))); + std::unique_ptr iden(new MNN::OpT); + iden->type = OpType_FloatToInt8; + std::vector inputDim = {}; + + if (input->getInfo()) { + inputDim = input->getInfo()->dim; } - auto output = _QuantizeLinear(input, scale, zeropoint); - output->setName(expr->name()); - return output->expr().first; + auto _shape = _Const(inputDim.data(), {static_cast(inputDim.size())}, NHWC, halide_type_of()); + auto newExpr = MNN::Express::Expr::create(iden.get(), {input, output, scale, zeropoint, _shape}, 5); + newExpr->setName(expr->name()); + return newExpr; } }; diff --git a/tools/cpp/CMakeLists.txt b/tools/cpp/CMakeLists.txt index 50668009c..96a3ca2f8 100644 --- a/tools/cpp/CMakeLists.txt +++ b/tools/cpp/CMakeLists.txt @@ -42,6 +42,9 @@ list(APPEND MNN_CPP_TOOLS timeProfile.out) add_executable(testTrain.out ${CMAKE_CURRENT_LIST_DIR}/testTrain.cpp) list(APPEND MNN_CPP_TOOLS testTrain.out) +add_executable(fuseTest ${CMAKE_CURRENT_LIST_DIR}/fuseTest.cpp) +list(APPEND MNN_CPP_TOOLS fuseTest) + foreach(TARGET ${MNN_CPP_TOOLS}) target_link_libraries(${TARGET} ${MNN_DEPS}) if (MSVC) diff --git a/tools/cpp/ExprDebug.hpp b/tools/cpp/ExprDebug.hpp index f4a251067..87d5222f7 100644 --- a/tools/cpp/ExprDebug.hpp +++ b/tools/cpp/ExprDebug.hpp @@ -162,6 +162,9 @@ static void _initTimeTrace() { return true; }; MNN::TensorCallBackWithInfo callBack = [&](const std::vector& ntensors, const MNN::OperatorInfo* info) { + for (auto t : ntensors) { + t->wait(MNN::Tensor::MAP_TENSOR_READ, true); + } gTimeTraceInfo->end(); return true; }; diff --git a/tools/cpp/ModuleBasic.cpp b/tools/cpp/ModuleBasic.cpp index 022d580f8..4dd1a6337 100644 --- a/tools/cpp/ModuleBasic.cpp +++ b/tools/cpp/ModuleBasic.cpp @@ -220,6 +220,9 @@ int main(int argc, char *argv[]) { config.backendConfig = &backendConfig; MNN::Express::Module::Config mConfig; + if (runMask & 256) { + mConfig.dynamic = true; + } mConfig.shapeMutable = shapeMutable; std::shared_ptr rtmgr(Executor::RuntimeManager::createRuntimeManager(config)); rtmgr->setCache(cacheFileName); @@ -387,6 +390,9 @@ int main(int argc, char *argv[]) { for (int i = 0; i < t; ++i) { Timer _l; auto out = net->onForward(inputs); + for (auto o : out) { + ((MNN::Tensor*)o->getTensor())->wait(MNN::Tensor::MAP_TENSOR_READ, true); + } times[i] = _l.durationInUs() / 1000.0f; } if (nullptr != gTimeTraceInfo) { diff --git a/tools/cpp/fuseTest.cpp b/tools/cpp/fuseTest.cpp new file mode 100644 index 000000000..f5de4cc68 --- /dev/null +++ b/tools/cpp/fuseTest.cpp @@ -0,0 +1,255 @@ +#include +#include +#include "MNN_generated.h" +#include +#include +#include +#include "core/Backend.hpp" +#include "core/Macro.h" +#include "core/TensorUtils.hpp" +#include "rapidjson/document.h" +#include "core/Execution.hpp" + +using namespace MNN; +int main(int argc, const char* argv[]) { + if (argc < 3) { + MNN_ERROR("Usage: ./fuseTest XXX.spirv XXX.json\n"); + return 0; + } + { + ScheduleConfig config; + std::vector configs = {config}; + auto rt = Interpreter::createRuntime(configs); + } + rapidjson::Document configJson; + std::ifstream fileNames(argv[2]); + if (fileNames.fail()) { + MNN_ERROR("Can' open config file: %s\n", argv[2]); + return 0; + } + { + std::ostringstream output; + output << fileNames.rdbuf(); + auto outputStr = output.str(); + configJson.Parse(outputStr.c_str()); + } + if (configJson.HasParseError()) { + MNN_ERROR("Invalid json\n"); + return 0; + } + + auto type = MNN_FORWARD_VULKAN; + auto creator = MNNGetExtraRuntimeCreator(type); + if (nullptr == creator) { + MNN_ERROR("Don't support %d\n", type); + return 0;; + } + MNN::Backend::Info info; + info.type = type; + BackendConfig user; + user.precision = BackendConfig::Precision_High; + info.user = &user; + std::shared_ptr runtime(creator->onCreate(info)); + std::shared_ptr bn(runtime->onCreate(&user)); + + // Load Config + std::unique_ptr op(new OpT); + op->type = OpType_Extra; + op->main.type = OpParameter_Extra; + op->main.value = new ExtraT; + std::vector> inputs; + std::vector> outputs; + if (configJson.HasMember("inputs")) { + auto inputArray = configJson["inputs"].GetArray(); + int pos = 0; + for (auto iter = inputArray.Begin(); iter != inputArray.End(); iter++) { + std::unique_ptr attr(new AttributeT); + attr->key = "input"; + attr->list.reset(new ListValueT); + attr->i = (*iter)["binding"].GetInt(); + attr->list->i = {0, pos}; + attr->b = false; + + op->main.AsExtra()->attr.emplace_back(std::move(attr)); + halide_type_t type = halide_type_of(); + std::vector shape; + if (iter->HasMember("dims")) { + auto dimArray = (*iter)["dims"].GetArray(); + for (auto shapeIter = dimArray.Begin(); shapeIter != dimArray.End(); shapeIter++) { + shape.emplace_back(shapeIter->GetInt()); + } + } + // Create Tensor + std::shared_ptr tensor(Tensor::createDevice(shape, type, Tensor::CAFFE)); + bn->onAcquireBuffer(tensor.get(), Backend::STATIC); + TensorUtils::getDescribe(tensor.get())->setBackend(bn.get()); + bool isFloat = std::string((*iter)["type"].GetString()) == "float"; + if (iter->HasMember("filename")) { + auto ptr = tensor->map(MNN::Tensor::MAP_TENSOR_WRITE, MNN::Tensor::CAFFE); + { + auto fileName = std::string( (*iter)["filename"].GetString()); + FUNC_PRINT_ALL(fileName.c_str(), s); + std::ifstream is(fileName.c_str()); + if (is.fail()) { + MNN_ERROR("Can't open data file for %d input\n", pos); + } + auto size = tensor->elementSize(); + if (isFloat) { + auto uptr = (float*)ptr; + for (int i=0; i> v; + uptr[i] = v; + } + } else { + auto uptr = (uint32_t*)ptr; + for (int i=0; i> v; + uptr[i] = v; + } + } + } + tensor->unmap(MNN::Tensor::MAP_TENSOR_WRITE, MNN::Tensor::CAFFE, ptr); + } + inputs.emplace_back(tensor); + pos++; + } + } + if (configJson.HasMember("outputs")) { + auto inputArray = configJson["outputs"].GetArray(); + int pos = 0; + for (auto iter = inputArray.Begin(); iter != inputArray.End(); iter++) { + std::unique_ptr attr(new AttributeT); + attr->key = "input"; + attr->list.reset(new ListValueT); + attr->i = (*iter)["binding"].GetInt(); + attr->list->i = {1, pos}; + attr->b = false; + + op->main.AsExtra()->attr.emplace_back(std::move(attr)); + halide_type_t type = halide_type_of(); + std::vector shape; + if (iter->HasMember("dims")) { + auto dimArray = (*iter)["dims"].GetArray(); + for (auto shapeIter = dimArray.Begin(); shapeIter != dimArray.End(); shapeIter++) { + shape.emplace_back(shapeIter->GetInt()); + } + } + // Create Tensor + std::shared_ptr tensor(Tensor::createDevice(shape, type, Tensor::CAFFE)); + bn->onAcquireBuffer(tensor.get(), Backend::STATIC); + TensorUtils::getDescribe(tensor.get())->setBackend(bn.get()); + outputs.emplace_back(tensor); + pos++; + } + } + if (configJson.HasMember("uniforms")) { + auto inputArray = configJson["uniforms"].GetArray(); + int pos = 0; + for (auto iter = inputArray.Begin(); iter != inputArray.End(); iter++) { + std::unique_ptr attr(new AttributeT); + attr->key = "const"; + attr->list.reset(new ListValueT); + attr->i = (*iter)["binding"].GetInt(); + attr->b = true; + attr->tensor.reset(new BlobT); + attr->tensor->dataType = DataType_DT_INT32; + std::vector shape; + int size = 1; + if (iter->HasMember("dims")) { + auto dimArray = (*iter)["dims"].GetArray(); + for (auto shapeIter = dimArray.Begin(); shapeIter != dimArray.End(); shapeIter++) { + shape.emplace_back(shapeIter->GetInt()); + size *= shapeIter->GetInt(); + } + } + attr->tensor->dims = shape; + attr->tensor->dataFormat = MNN_DATA_FORMAT_NCHW; + if (iter->HasMember("data")) { + auto dimArray = (*iter)["data"].GetArray(); + for (auto shapeIter = dimArray.Begin(); shapeIter != dimArray.End(); shapeIter++) { + attr->tensor->int32s.emplace_back(shapeIter->GetInt()); + } + } + op->main.AsExtra()->attr.emplace_back(std::move(attr)); + } + } + if (configJson.HasMember("group_size")) { + std::vector shape; + auto dimArray = configJson["group_size"].GetArray(); + for (auto shapeIter = dimArray.Begin(); shapeIter != dimArray.End(); shapeIter++) { + shape.emplace_back(shapeIter->GetInt()); + } + std::unique_ptr attr(new AttributeT); + attr->key = "group_size"; + attr->tensor.reset(new BlobT); + attr->tensor->int32s = shape; + op->main.AsExtra()->attr.emplace_back(std::move(attr)); + } + if (configJson.HasMember("local_size")) { + std::vector shape; + auto dimArray = configJson["local_size"].GetArray(); + for (auto shapeIter = dimArray.Begin(); shapeIter != dimArray.End(); shapeIter++) { + shape.emplace_back(shapeIter->GetInt()); + } + std::unique_ptr attr(new AttributeT); + attr->key = "local_size"; + attr->tensor.reset(new BlobT); + attr->tensor->int32s = shape; + op->main.AsExtra()->attr.emplace_back(std::move(attr)); + } + { + std::ifstream is(argv[1]); + if (is.fail()) { + MNN_ERROR("Can't load spirv\n"); + return 0; + } + is.seekg(0, std::ios::end); + std::unique_ptr attr(new AttributeT); + attr->key = "spirv"; + attr->tensor.reset(new BlobT); + attr->tensor->int8s.resize(is.tellg()); + is.seekg(0, std::ios::beg); + is.read((char*)attr->tensor->int8s.data(), attr->tensor->int8s.size()); + op->main.AsExtra()->attr.emplace_back(std::move(attr)); + } + std::vector inputsW(inputs.size()); + for (int i=0; i outputsW(outputs.size()); + for (int i=0; i(builder.GetBufferPointer()); + std::shared_ptr exeution(bn->onCreate(inputsW, outputsW, opRaw)); + bn->onResizeBegin(); + exeution->onResize(inputsW, outputsW); + bn->onResizeEnd(); + bn->onExecuteBegin(); + exeution->onExecute(inputsW, outputsW); + bn->onExecuteEnd(); + for (int i=0; imap(MNN::Tensor::MAP_TENSOR_READ, MNN::Tensor::CAFFE); + auto size = outputsW[i]->elementSize(); + auto iPtr = (int32_t*)ptr; + std::ostringstream fileNameOs; + fileNameOs << i << ".txt"; + std::ofstream _o(fileNameOs.str().c_str()); + for (int v=0; vunmap(MNN::Tensor::MAP_TENSOR_READ, MNN::Tensor::CAFFE, ptr); + } + + exeution.reset(); + inputs.clear(); + outputs.clear(); + bn.reset(); + runtime.reset(); + + return 0; +} diff --git a/tools/cpp/resfusetest/cumsum.comp b/tools/cpp/resfusetest/cumsum.comp new file mode 100644 index 000000000..386a2c29a --- /dev/null +++ b/tools/cpp/resfusetest/cumsum.comp @@ -0,0 +1,53 @@ +#version 440 core +layout(std430) buffer; + +layout(set=0, binding=0) writeonly buffer pointoffsetSum{ + highp uint data[]; +} uPointoffsetSum; + + +layout(set=0, binding=1) readonly buffer pointoffset{ + highp uint data[]; +} uPointoffset; + +layout(set=0, binding=2) uniform constBuffer { + ivec4 point; // point size +} uConstant; + +shared uint local_sum[256]; + +#define UNIT 3 +#define LOCAL_SIZE 8 +layout (local_size_x = LOCAL_SIZE, local_size_y = 1, local_size_z = 1) in; +void main() +{ + int tId = int(gl_LocalInvocationID.x); + int size = uConstant.point.x; + int curOffset = 0; + uint threadBuffer[UNIT]; + while (curOffset < size) { + int sta = tId * UNIT + curOffset; + int fin = min(sta + UNIT, size); + for (int i=sta; i sta) { + uint sum = 0; + for (int i=0; i=0: inputs[inputVar.name] = np.random.uniform(0, 12, shapes).astype(np.int32) elif inputVar.type.find('bool') >=0: - inputs[inputVar.name] = np.random.uniform(0, 1, shapes).astype(np.bool) + inputs[inputVar.name] = np.random.uniform(0, 1, shapes).astype(np.bool_) else: # Float inputs[inputVar.name] = np.random.uniform(0.1, 1.2, shapes).astype(np.float32)