Repository: Vincentqyw/LineSegmentsDetection Branch: master Commit: b6ae4fd08643 Files: 220 Total size: 2.3 MB Directory structure: gitextract_wpkbhclo/ ├── .gitmodules ├── README.md ├── assets/ │ └── run.sh └── thirdparty/ ├── CannyLines/ │ ├── CMakeLists.txt │ └── src/ │ ├── CannyLine.cpp │ ├── CannyLine.h │ ├── MetaLine.cpp │ ├── MetaLine.h │ ├── QuickSort.h │ ├── buffer_2d.cpp │ ├── buffer_2d.h │ ├── main.cpp │ └── types.h ├── LSD/ │ ├── COPYING │ ├── Makefile │ ├── README.md │ ├── chairs.lsd.eps │ ├── chairs.lsd.txt │ ├── chairs.pgm │ ├── doc/ │ │ ├── annotated.html │ │ ├── doxygen.css │ │ ├── files.html │ │ ├── formula.repository │ │ ├── functions.html │ │ ├── functions_vars.html │ │ ├── globals.html │ │ ├── globals_defs.html │ │ ├── globals_func.html │ │ ├── globals_type.html │ │ ├── graph_legend.dot │ │ ├── graph_legend.html │ │ ├── index.html │ │ ├── lsd_8c-source.html │ │ ├── lsd_8c.html │ │ ├── lsd_8h-source.html │ │ ├── lsd_8h.html │ │ ├── structcoorlist.html │ │ ├── structimage__char__s.html │ │ ├── structimage__double__s.html │ │ ├── structimage__int__s.html │ │ ├── structntuple__list__s.html │ │ ├── structpoint.html │ │ ├── structrect.html │ │ └── structrect__iter.html │ ├── doxygen.config │ ├── lsd.c │ ├── lsd.h │ ├── lsd_call_example.c │ └── lsd_cmd.c ├── LSWMS/ │ ├── CMakeLists.txt │ ├── LSWMS.cpp │ ├── LSWMS.h │ └── main.cpp └── MCMLSD/ ├── MCMLSD/ │ ├── Readme.txt │ ├── code/ │ │ ├── ElderZuckerEdgeDetector/ │ │ │ ├── code/ │ │ │ │ ├── checkInParam.m │ │ │ │ ├── checkOutParam.m │ │ │ │ ├── check_save_requirements.m │ │ │ │ ├── convolve_2.m │ │ │ │ ├── d2gauss.m │ │ │ │ ├── derivative2nd.m │ │ │ │ ├── elderEdge.m │ │ │ │ ├── elderEdge.m~ │ │ │ │ ├── find_edges.c │ │ │ │ ├── find_edges.mexa64 │ │ │ │ ├── find_edges.mexmaci64 │ │ │ │ ├── find_edges.mexw64 │ │ │ │ ├── g1scale.m │ │ │ │ ├── g1steer.m │ │ │ │ ├── g2scale.m │ │ │ │ ├── g2steer.m │ │ │ │ ├── gauss.m │ │ │ │ ├── gradient.m │ │ │ │ ├── main_edge.m │ │ │ │ ├── mat2hough_scale.m │ │ │ │ ├── plot_edgelmap.m │ │ │ │ ├── round2frac.m │ │ │ │ ├── run_elderEdge.m │ │ │ │ ├── scalespace.m │ │ │ │ └── setvalues.m │ │ │ └── filters/ │ │ │ ├── g1x05.ascii │ │ │ ├── g1x1.ascii │ │ │ ├── g1y05.ascii │ │ │ ├── g1y1.ascii │ │ │ ├── g2x05.ascii │ │ │ ├── g2x1.ascii │ │ │ ├── g2y05.ascii │ │ │ ├── g2y1.ascii │ │ │ ├── gx05.ascii │ │ │ ├── gx1.ascii │ │ │ ├── gy05.ascii │ │ │ └── gy1.ascii │ │ ├── computeKernel.m │ │ ├── determine_hough_lines_kernel_vote_remove.m │ │ ├── get_all_segments_assoc_edgeremoval.m │ │ ├── get_line_segment_DP_edgeremoval.m │ │ ├── hough_find_peaks_vote_removal.m │ │ ├── kernelInitialization.m │ │ ├── lineSegmentation_HighRes.m │ │ ├── mexfiles/ │ │ │ ├── hmmParameters.m │ │ │ ├── hmmParameters.mexa64 │ │ │ ├── hmmParameters.mexmaci64 │ │ │ ├── hmmParameters.prj │ │ │ ├── mexRemoveVotes_v3_scale.c │ │ │ ├── mexRemoveVotes_v3_scale.mexa64 │ │ │ ├── mexRemoveVotes_v3_scale.mexmaci64 │ │ │ ├── mexVoteEdges_v3_scale.c │ │ │ ├── mexVoteEdges_v3_scale.mexa64 │ │ │ ├── mexVoteEdges_v3_scale.mexmaci64 │ │ │ ├── returnLines.m │ │ │ ├── returnLines.mexa64 │ │ │ ├── returnLines.mexmaci64 │ │ │ ├── returnLines.prj │ │ │ ├── sampleLine.m │ │ │ ├── sampleLine.mexa64 │ │ │ ├── sampleLine.mexmaci64 │ │ │ └── sampleLine.prj │ │ ├── parameters/ │ │ │ └── likelihood_model.mat │ │ ├── precompute_kernels_sparse_res2.m │ │ ├── project_point_to_line_segment_vec.m │ │ ├── run_lineSegmentAlgorithm.m │ │ ├── trace_Back.m │ │ └── utils/ │ │ ├── getDebug.m │ │ ├── getImg.m │ │ ├── getLegend.m │ │ ├── setDebug.m │ │ ├── setImg.m │ │ └── setLegend.m │ └── demo_start_v2.m └── __MACOSX/ ├── ._MCMLSD └── MCMLSD/ ├── ._.DS_Store ├── ._Imgs ├── ._Readme.txt ├── ._code ├── ._demo_start_v2.m ├── Imgs/ │ └── ._.DS_Store └── code/ ├── ._.DS_Store ├── ._ElderZuckerEdgeDetector ├── ._computeKernel.m ├── ._determine_hough_lines_kernel_vote_remove.m ├── ._get_all_segments_assoc_edgeremoval.m ├── ._get_line_segment_DP_edgeremoval.m ├── ._hough_find_peaks_vote_removal.m ├── ._kernelInitialization.m ├── ._lineSegmentation_HighRes.m ├── ._mexfiles ├── ._parameters ├── ._precompute_kernels_sparse_res2.m ├── ._project_point_to_line_segment_vec.m ├── ._run_lineSegmentAlgorithm.m ├── ._trace_Back.m ├── ._utils ├── ElderZuckerEdgeDetector/ │ ├── ._code │ ├── ._filters │ ├── ._images │ ├── code/ │ │ ├── ._checkInParam.m │ │ ├── ._checkOutParam.m │ │ ├── ._check_save_requirements.m │ │ ├── ._convolve_2.m │ │ ├── ._d2gauss.m │ │ ├── ._derivative2nd.m │ │ ├── ._elderEdge.m │ │ ├── ._elderEdge.m~ │ │ ├── ._find_edges.c │ │ ├── ._find_edges.mexa64 │ │ ├── ._find_edges.mexmaci64 │ │ ├── ._find_edges.mexw64 │ │ ├── ._g1scale.m │ │ ├── ._g1steer.m │ │ ├── ._g2scale.m │ │ ├── ._g2steer.m │ │ ├── ._gauss.m │ │ ├── ._gradient.m │ │ ├── ._main_edge.m │ │ ├── ._mat2hough_scale.m │ │ ├── ._plot_edgelmap.m │ │ ├── ._round2frac.m │ │ ├── ._run_elderEdge.m │ │ ├── ._scalespace.m │ │ └── ._setvalues.m │ ├── filters/ │ │ ├── ._g1x05.ascii │ │ ├── ._g1x1.ascii │ │ ├── ._g1y05.ascii │ │ ├── ._g1y1.ascii │ │ ├── ._g2x05.ascii │ │ ├── ._g2x1.ascii │ │ ├── ._g2y05.ascii │ │ ├── ._g2y1.ascii │ │ ├── ._gx05.ascii │ │ ├── ._gx1.ascii │ │ ├── ._gy05.ascii │ │ ├── ._gy1.ascii │ │ └── ._resource.frk │ └── images/ │ └── ._peppers ├── mexfiles/ │ ├── ._.DS_Store │ ├── ._hmmParameters.m │ ├── ._hmmParameters.mexa64 │ ├── ._hmmParameters.mexmaci64 │ ├── ._hmmParameters.prj │ ├── ._mexRemoveVotes_v3_scale.c │ ├── ._mexRemoveVotes_v3_scale.mexa64 │ ├── ._mexRemoveVotes_v3_scale.mexmaci64 │ ├── ._mexVoteEdges_v3_scale.c │ ├── ._mexVoteEdges_v3_scale.mexa64 │ ├── ._mexVoteEdges_v3_scale.mexmaci64 │ ├── ._returnLines.m │ ├── ._returnLines.mexa64 │ ├── ._returnLines.mexmaci64 │ ├── ._returnLines.prj │ ├── ._sampleLine.m │ ├── ._sampleLine.mexa64 │ ├── ._sampleLine.mexmaci64 │ └── ._sampleLine.prj ├── parameters/ │ ├── ._.DS_Store │ └── ._likelihood_model.mat └── utils/ ├── ._getDebug.m ├── ._getImg.m ├── ._getLegend.m ├── ._setDebug.m ├── ._setImg.m └── ._setLegend.m ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitmodules ================================================ [submodule "thirdparty/DeepLSD"] path = thirdparty/DeepLSD url = https://github.com/cvg/DeepLSD.git [submodule "thirdparty/MLSD"] path = thirdparty/MLSD url = https://github.com/navervision/mlsd.git [submodule "thirdparty/F-Clip"] path = thirdparty/F-Clip url = https://github.com/Delay-Xili/F-Clip.git [submodule "thirdparty/SOLD2"] path = thirdparty/SOLD2 url = https://github.com/cvg/SOLD2.git [submodule "thirdparty/LETR"] path = thirdparty/LETR url = https://github.com/mlpc-ucsd/LETR.git [submodule "thirdparty/HAWP"] path = thirdparty/HAWP url = https://github.com/cherubicXN/hawp.git [submodule "thirdparty/TP-LSD"] path = thirdparty/TP-LSD url = https://github.com/Siyuada7/TP-LSD.git [submodule "thirdparty/ULSD"] path = thirdparty/ULSD url = https://github.com/lh9171338/Unified-Line-Segment-Detection.git [submodule "thirdparty/DHTLP"] path = thirdparty/DHTLP url = https://github.com/yanconglin/Deep-Hough-Transform-Line-Priors.git [submodule "thirdparty/AFM-LSD"] path = thirdparty/AFM-LSD url = https://github.com/cherubicXN/afm_cvpr2019.git [submodule "thirdparty/LCNN"] path = thirdparty/LCNN url = https://github.com/zhou13/lcnn.git [submodule "thirdparty/LBD"] path = thirdparty/LBD url = https://github.com/mtamburrano/LBD_Descriptor.git ================================================ FILE: README.md ================================================


Line Segment Detection
A collection of line segment detection algorithms

## This repository hosts the papers with code for line segment detection, enjoy yourself. ![SOLD2](assets/images/demo_moving_camera.gif) ## Usage ``` bash git clone --recurse-submodules https://github.com/Vincentqyw/LineSegmentsDetection.git ``` ## DeepLSD - Title: "DeepLSD: Line Segment Detection and Refinement with Deep Image Gradients", Arxiv 2022. - Paper: https://arxiv.org/abs/2212.07766 - Code: https://github.com/cvg/DeepLSD ## M-LSD - Title: "M-LSD: Towards Light-weight and Real-time Line Segment Detection", AAAI 2022. - Paper: [https://arxiv.org/abs/2106.00186](https://arxiv.org/abs/2106.00186) - Code: https://github.com/navervision/mlsd ## F-Clip - Title: "Fully Convolutional Line Parsing", Neurocomputing 2022. - Paper: [https://arxiv.org/abs/2104.11207](https://arxiv.org/abs/2104.11207) - Code: https://github.com/Delay-Xili/F-Clip ## SOLD2 - Title: "SOLD2: Self-supervised Occlusion-aware Line Description and Detection", CVPR 2021. - Paper: https://arxiv.org/abs/2104.03362 - Code: https://github.com/cvg/SOLD2, [[Kornia Tutorial]](https://kornia-tutorials.readthedocs.io/en/latest/line_detection_and_matching_sold2.html) ## LETR - Title: "Line Segment Detection Using Transformers without Edges", CVPR 2021. - Paper: [https://arxiv.org/abs/2101.01909](https://arxiv.org/abs/2101.01909) - Code: https://github.com/mlpc-ucsd/LETR ## HAWP - Title: "Holistically-Attracted Wireframe Parsing: From Supervised Learning to Self-Supervised Learning", CVPR 2020. - Paper: https://arxiv.org/abs/2210.12971 - Code: https://github.com/cherubicXN/hawp ## TP-LSD - Title: "TP-LSD: Tri-Points Based Line Segment Detector", ECCV 2020. - Paper: https://arxiv.org/abs/2009.05505 - Code: https://github.com/Siyuada7/TP-LSD ## ULSD - Title: "ULSD: Unified Line Segment Detection across Pinhole, Fisheye, and Spherical Cameras", ISPRS 2020. - Paper: https://arxiv.org/abs/2011.03174 - Code: https://github.com/lh9171338/Unified-Line-Segment-Detection ## Deep-Hough-Transform-Line-Priors - Title: "Deep Hough-Transform Line Priors", ECCV 2020. - Paper: [https://arxiv.org/abs/2007.09493](https://arxiv.org/abs/2007.09493) - Code: https://github.com/yanconglin/Deep-Hough-Transform-Line-Priors ## AFM-LSD - Title: "Learning Attraction Field Representation for Robust Line Segment Detection", CVPR 2019. - Paper: [https://arxiv.org/abs/1812.02122](https://arxiv.org/abs/1812.02122) - Code: https://github.com/cherubicXN/afm_cvpr2019 ## L-CNN - Title: "End-to-End Wireframe Parsing", ICCV 2019. - Paper: [https://arxiv.org/abs/1905.03246](https://arxiv.org/abs/1905.03246) - Code: https://github.com/zhou13/lcnn ## MCMLSD - Title: "MCMLSD: A Dynamic Programming Approach to Line Segment Detection", CVPR 2017. - Paper: http://openaccess.thecvf.com/content_cvpr_2017/papers/Almazan_MCMLSD_A_Dynamic_CVPR_2017_paper.pdf - Code: http://www.elderlab.yorku.ca/?smd_process_download=1&download_id=8423 ## CannyLines - Title: "CannyLines: A Parameter-Free Line Segment Detector", ICIP 2015. - Project Page: https://cvrs.whu.edu.cn/cannylines - Paper: http://cvrs.whu.edu.cn/projects/cannyLines/papers/CannyLines-ICIP2015.pdf - Code: http://cvrs.whu.edu.cn/projects/cannyLines/codes/CannyLines-v3.rar ## EDline - Title: "Edge Drawing: A Combined Real-Time Edge and Segment Detector", JVCIR 2012. - Paper: https://www.sciencedirect.com/science/article/abs/pii/S1047320312000831 - Code: https://github.com/mtamburrano/LBD_Descriptor ## LSD - Title: "LSD: a Line Segment Detector", Image Processing On Line 2012. - Project Page: http://www.ipol.im/pub/art/2012/gjmr-lsd/ - Paper: http://www.ipol.im/pub/art/2012/gjmr-lsd/article.pdf - Code: http://www.ipol.im/pub/art/2012/gjmr-lsd/lsd_1.5.zip ## LSWMS - Title: "Line segment detection using weighted mean shift procedures on a 2D slice sampling strategy", Pattern Analysis and Applications 2011. - Paper: [https://www.researchgate.net/LSWMS.pdf](https://www.researchgate.net/profile/Marcos_Nieto3/publication/220654859_Line_segment_detection_using_weighted_mean_shift_procedures_on_a_2D_slice_sampling_strategy/links/56a5d56a08aef91c8c16b1ac.pdf?inViewer=0&origin=publication_detail&pdfJsDownload=0) - Code: https://sourceforge.net/projects/lswms/ ================================================ FILE: assets/run.sh ================================================ ## [DELETE SUBMODULES] # git rm --cached SOLD2 # git rm --cached DeepLSD # git rm --cached TP-LSD # git rm --cached Unified-Line-Segment-Detection # git rm --cached LETR # git rm --cached Deep-Hough-Transform-Line-Priors # git rm --cached F-Clip # git rm --cached mlsd # git rm --cached afm_cvpr2019 # git rm --cached lcnn # git rm --cached hawp # rm -rf SOLD2 # rm -rf DeepLSD # rm -rf TP-LSD # rm -rf Unified-Line-Segment-Detection # rm -rf LETR # rm -rf Deep-Hough-Transform-Line-Priors # rm -rf F-Clip # rm -rf mlsd # rm -rf afm_cvpr2019 # rm -rf lcnn # rm -rf hawp # rm .gitmodules ## [ADD SUBMODULES] # mkdir thirdparty # git submodule add https://github.com/cvg/DeepLSD.git thirdparty/DeepLSD # git submodule add https://github.com/navervision/mlsd.git thirdparty/MLSD # git submodule add https://github.com/Delay-Xili/F-Clip.git thirdparty/F-Clip # git submodule add https://github.com/cvg/SOLD2.git thirdparty/SOLD2 # git submodule add https://github.com/mlpc-ucsd/LETR.git thirdparty/LETR # git submodule add https://github.com/cherubicXN/hawp.git thirdparty/HAWP # git submodule add https://github.com/Siyuada7/TP-LSD.git thirdparty/TP-LSD # git submodule add https://github.com/lh9171338/Unified-Line-Segment-Detection.git thirdparty/ULSD # git submodule add https://github.com/yanconglin/Deep-Hough-Transform-Line-Priors.git thirdparty/DHTLP # git submodule add https://github.com/cherubicXN/afm_cvpr2019.git thirdparty/AFM-LSD # git submodule add https://github.com/zhou13/lcnn.git thirdparty/LCNN # git submodule add https://github.com/mtamburrano/LBD_Descriptor.git thirdparty/LBD ================================================ FILE: thirdparty/CannyLines/CMakeLists.txt ================================================ # set project's name PROJECT( CannyLine ) ############################################################################### # CMake settings CMAKE_MINIMUM_REQUIRED(VERSION 2.8.3) # this command finds OpenCV libraries and sets all required variables FIND_PACKAGE(OpenCV REQUIRED) FILE(GLOB_RECURSE HDRS_FILES *.h *.hpp) FILE(GLOB_RECURSE SRCS_FILES *.c *.cpp) #ADD_LIBRARY(${PROJECT_NAME} ${HDRS_FILES} ${SRCS_FILES}) #TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OpenCV_LIBS}) ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS_FILES} ${HDRS_FILES}) TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OpenCV_LIBS}) ================================================ FILE: thirdparty/CannyLines/src/CannyLine.cpp ================================================ #include "CannyLine.h" #include "MetaLine.h" CannyLine::CannyLine(void) { } CannyLine::~CannyLine(void) { } void CannyLine::cannyLine(cv::Mat &image,std::vector > &lines) { MetaLine deterctor; float gausSigma=1.0; int gausHalfSize=1; deterctor.MetaLineDetection(image,gausSigma,gausHalfSize,lines); } ================================================ FILE: thirdparty/CannyLines/src/CannyLine.h ================================================ #ifndef _CANNY_LINE_H_ #define _CANNY_LINE_H_ #pragma once #include "cv.h" #include "highgui.h" #include "cxcore.h" class CannyLine { public: CannyLine(void); ~CannyLine(void); static void cannyLine(cv::Mat &image,std::vector > &lines); }; #endif // _CANNY_LINE_H_ ================================================ FILE: thirdparty/CannyLines/src/MetaLine.cpp ================================================ #include "MetaLine.h" #include "QuickSort.h" #define INF 10000000000 MetaLine::MetaLine(void) { visualMeaningfulGradient=70; p=0.125; sigma=1.0; thAngle=0.0; } MetaLine::~MetaLine(void) { } bool MetaLine::gradientWeightedLeastSquareFitting(string_t &string,float *parameters,float sigma) { int i,j; int N=string.size(); float kCoarse=0.0; if (string[0].x==string[string.size()-1].x) kCoarse=INF; else kCoarse=float(string[0].y-string[string.size()-1].y)/(string[0].x-string[string.size()-1].x); float k=0.0,b=0.0,dev=0.0,temp=0.0; float totalGradient=0; std::vector weight(N,0); float *ptr=(float*) gradientMap.data; for (i=0;idevMax) devMax=temp; dev+=temp*temp; } dev=sqrt(dev/float(N-2)); parameters[0]=0; //label } else { float sumX=0.0; float sumY=0.0; float sumY2=0.0; float sumXY=0.0; for (i=0;idevMax) devMax=temp; dev+=temp*temp; } dev=sqrt(dev/float(N-2)); parameters[0]=1; //label } parameters[1]=k; parameters[2]=b; parameters[3]=dev; if (dev offsets(N,0); for (i=0;i=0;--i) { if (offsets[i]<1.0) index++; if (index==2) { end=i; break; } else devOutliers+=offsets[i]*offsets[i]; } if (end<=start) return false; dev=sqrt((dev-devOutliers)/float(N-2)); cluster.pixels=&(cluster.pixels[start]); cluster.size=end-start+1; parameters[0]=0; //label } else { float sumX=0.0; float sumY=0.0; float sumY2=0.0; float sumXY=0.0; for (i=0;i offsets(N,0); for (i=0;i=0;--i) { if (offsets[i]<1.0) index++; if (index==2) { end=i; break; } else devOutliers+=offsets[i]*offsets[i]; } if (end<=start) return false; dev=sqrt((dev-devOutliers)/float(N-2)); cluster.pixels=&(cluster.pixels[start]); cluster.size=end-start+1; parameters[0]=1; //label } parameters[1]=k; parameters[2]=b; parameters[3]=dev; return true; } bool MetaLine::leastSquareFitting(std::vector &points, float *parameters,float sigma) { int i,j; int N=points.size(); float kCoarse=0.0; if (points[0].x==points[N-1].x) kCoarse=INF; else kCoarse=float(points[0].y-points[N-1].y)/(points[0].x-points[N-1].x); float k=0.0,b=0.0,dev=0.0,temp=0.0,devMax=0.0; if (abs(kCoarse)<1) { float sumX=0.0; float sumY=0.0; float sumX2=0.0; float sumXY=0.0; for (i=0;idevMax) devMax=temp; dev+=temp*temp; } dev=sqrt(dev/float(N-2)); parameters[0]=0; //label } else { float sumX=0.0; float sumY=0.0; float sumY2=0.0; float sumXY=0.0; for (i=0;idevMax) devMax=temp; dev+=temp*temp; } dev=sqrt(dev/float(N-2)); parameters[0]=1; //label } parameters[1]=k; parameters[2]=b; parameters[3]=dev; if (dev edgeChain; int xSeed=pts.x; int ySeed=pts.y; int x,y; int count=0; bool isEnd=false; while(count!=10&&!isEnd) { for (size_t i=0; i!=8; ++i) { x = xSeed + X_OFFSET[i]; if ((0 <= x) && (x < cols)) { y = ySeed + Y_OFFSET[i]; if ((0 <= y) && (y < rows)) { cout<=3) { float deltaX=edgeChain[0].x-edgeChain[edgeChain.size()-1].x; float deltaY=edgeChain[0].y-edgeChain[edgeChain.size()-1].y; angle=atan(deltaY/deltaX+0.00000101); return 1; //1 for finding a edge chain } else return 0; //0 for no edge chain } bool MetaLine::crossingCheck(Point2f pts,Point2f pte,int ID) { int i,j; float *ptrMI=(float*) maskImage.data; float deltaX=pts.x-pte.x; float deltaY=pts.y-pte.y; if (abs(deltaX)>abs(deltaY)) { float k=deltaY/deltaX; float b=pts.y-k*pts.x; float angle=atan(k); int xMin=int(min(pts.x,pte.x)+0.5); int xMax=int(max(pts.x,pte.x)+0.5); if (xMin<0) xMin=0; if (xMin>=cols) xMin=cols-2; if (xMax<0) xMax=0; if (xMax>=cols) xMax=cols-1; float y=k*xMin+b; for (i=xMin+1;iCV_PI/6.0)||(CV_PI-abs(angle-angleEdge)>CV_PI/6.0)) return false; } else if (Rnt<0) return false; } } else break; } } else { float k=deltaX/deltaY; float b=pts.x-k*pts.y; float angle=CV_PI/2.0-atan(k); int yMin=int(min(pts.y,pte.y)+0.5); int yMax=int(max(pts.y,pte.y)+0.5); if (yMin<0) yMin=0; if (yMin>=rows) yMin=rows-2; if (yMax<0) yMax=0; if (yMax>=rows) yMax=rows-1; float x=k*yMin+b; for (i=yMin+1;iCV_PI/6.0)||(CV_PI-abs(angle-angleEdge)>CV_PI/6.0)) return false; } else if (Rnt<0) return false; } } else break; } } return true; } void MetaLine::extendHirozontal(line_t &metaLineCur,lines_list_t &metaLines,int *removal) { int i,j; float *ptrMI=(float*) maskImage.data; float *ptrGM=(float*) gradientMap.data; int ID=metaLineCur.ID; float k=metaLineCur.k; float b=metaLineCur.b; float xs=metaLineCur.points[0].x; float xe=metaLineCur.points[metaLineCur.points.size()-1].x; float ye=k*xe+b; float xCur=xe; float yCur=ye; int xInt=int(xCur+0.5); int yInt=int(yCur+0.5); int index=(xe-xs)/abs(xe-xs); cluster_t pointsFormer; pointsFormer.pixels=&metaLineCur.points[0]; pointsFormer.size=metaLineCur.points.size(); int loc=0; int gap=0; int edge=0; int edgeTotal=0; float m0,m1,m2; float g0,g1,g2; bool extend=false; while (1) { xInt+=index; yCur+=index*k; yInt=int(yCur+0.5); bool chooseUp=false; if (yInt+0.5>yCur)chooseUp=true; if (0=1 metaLineCur.k=newPara[1]; metaLineCur.b=newPara[2]; metaLineCur.dev=newPara[3]; metaLineCur.ys=metaLineCur.points[0].y; metaLineCur.xs=metaLineCur.k*metaLineCur.ys+metaLineCur.b; metaLineCur.ye=metaLineCur.points[metaLineCur.points.size()-1].y; metaLineCur.xe=metaLineCur.k*metaLineCur.ye+metaLineCur.b; extendVertical(metaLineCur,metaLines,removal); extend=true; } // pointsFormer.size=metaLineCur.points.size(); for (j=0;j=m1&&m0>=m2) { pixel_t &p=metaLineCur.points.push_back(); p.x=xInt; p.y=yInt; ptrMI[loc]=-ID; } else if (m1==1&&m1>=m0&&m1>=m2) { pixel_t &p=metaLineCur.points.push_back(); p.x=xInt; p.y=yInt-1; ptrMI[loc-cols]=-ID; } else if (m2==1&&m2>=m0&&m2>=m1) { if (chooseUp) {gap++;continue;}; pixel_t &p=metaLineCur.points.push_back(); p.x=xInt; p.y=yInt+1; ptrMI[loc+cols]=-ID; } edge++; edgeTotal++; } else gap++; if ((double)gap/edge>=0.25||edge==0) break; if (gap==2) { edge=0; gap=0; } if (edgeTotal>=thMeaningfulLength) { float metaLineParas[4]; leastSquareFitting(metaLineCur.points,metaLineParas,sigma); k=metaLineParas[1]; b=metaLineParas[2]; yCur=xInt*k+b; edgeTotal=0; gap=0; extend=true; pointsFormer.size=metaLineCur.points.size(); } } } else break; } if (extend) { float metaLineParas[4]; leastSquareFitting(metaLineCur.points,metaLineParas,sigma); metaLineCur.dir=metaLineParas[0]; //0 for k<1, 1 for k >=1 metaLineCur.k=metaLineParas[1]; metaLineCur.b=metaLineParas[2]; metaLineCur.dev=metaLineParas[3]; if (metaLineCur.dir==0) { metaLineCur.xs=metaLineCur.points[0].x; metaLineCur.ys=metaLineCur.k*metaLineCur.xs+metaLineCur.b; metaLineCur.xe=metaLineCur.points[metaLineCur.points.size()-1].x; metaLineCur.ye=metaLineCur.k*metaLineCur.xe+metaLineCur.b; } else { metaLineCur.ys=metaLineCur.points[0].y; metaLineCur.xs=metaLineCur.k*metaLineCur.ys+metaLineCur.b; metaLineCur.ye=metaLineCur.points[metaLineCur.points.size()-1].y; metaLineCur.xe=metaLineCur.k*metaLineCur.ye+metaLineCur.b; } } else metaLineCur.points.resize(pointsFormer.size); } void MetaLine::extendVertical(line_t &metaLineCur,lines_list_t &metaLines,int *removal) { int i,j; float *ptrMI=(float*) maskImage.data; float *ptrGM=(float*) gradientMap.data; int ID=metaLineCur.ID; float k=metaLineCur.k; float b=metaLineCur.b; float ys=metaLineCur.points[0].y; float ye=metaLineCur.points[metaLineCur.points.size()-1].y; float xe=k*ye+b; float xCur=xe; float yCur=ye; int xInt=int(xCur+0.5); int yInt=int(yCur+0.5); int index=(ye-ys)/abs(ye-ys); cluster_t pointsFormer; pointsFormer.pixels=&metaLineCur.points[0]; pointsFormer.size=metaLineCur.points.size(); int loc=0; int gap=0; int edge=0; int edgeTotal=0; float m0,m1,m2; float g0,g1,g2; bool extend=false; while (1) { yInt+=index; xCur+=index*k; xInt=int(xCur+0.5); bool chooseLeft=false; if (xInt+0.5>xCur)chooseLeft=true; if (0=1 metaLineCur.k=newPara[1]; metaLineCur.b=newPara[2]; metaLineCur.dev=newPara[3]; metaLineCur.xs=metaLineCur.points[0].x; metaLineCur.ys=metaLineCur.k*metaLineCur.xs+metaLineCur.b; metaLineCur.xe=metaLineCur.points[metaLineCur.points.size()-1].x; metaLineCur.ye=metaLineCur.k*metaLineCur.xe+metaLineCur.b; extendHirozontal(metaLineCur,metaLines,removal); } // pointsFormer.size=metaLineCur.points.size(); for (j=0;j=m1&&m0>=m2) { pixel_t &p=metaLineCur.points.push_back(); p.x=xInt; p.y=yInt; ptrMI[loc]=-ID; } else if (m1==1&&m1>=m0&&m1>=m2) { pixel_t &p=metaLineCur.points.push_back(); p.x=xInt-1; p.y=yInt; ptrMI[loc-1]=-ID; } else if (m2==1&&m2>=m0&&m2>=m1) { if (chooseLeft) {gap++;continue;}; pixel_t &p=metaLineCur.points.push_back(); p.x=xInt+1; p.y=yInt; ptrMI[loc+1]=-ID; } edge++; edgeTotal++; } else gap++; if ((double)gap/edge>=0.25||edge==0) break; if (gap==2) { edge=0; gap=0; } if (edgeTotal>=thMeaningfulLength) { float metaLineParas[4]; leastSquareFitting(metaLineCur.points,metaLineParas,sigma); k=metaLineParas[1]; b=metaLineParas[2]; xCur=yInt*k+b; edgeTotal=0; gap=0; extend=true; pointsFormer.size=metaLineCur.points.size(); } } } else break; } // if (extend) { float metaLineParas[4]; leastSquareFitting(metaLineCur.points,metaLineParas,sigma); metaLineCur.dir=metaLineParas[0]; //0 for k<1, 1 for k >=1 metaLineCur.k=metaLineParas[1]; metaLineCur.b=metaLineParas[2]; metaLineCur.dev=metaLineParas[3]; if (metaLineCur.dir==0) { metaLineCur.xs=metaLineCur.points[0].x; metaLineCur.ys=metaLineCur.k*metaLineCur.xs+metaLineCur.b; metaLineCur.xe=metaLineCur.points[metaLineCur.points.size()-1].x; metaLineCur.ye=metaLineCur.k*metaLineCur.xe+metaLineCur.b; } else { metaLineCur.ys=metaLineCur.points[0].y; metaLineCur.xs=metaLineCur.k*metaLineCur.ys+metaLineCur.b; metaLineCur.ye=metaLineCur.points[metaLineCur.points.size()-1].y; metaLineCur.xe=metaLineCur.k*metaLineCur.ye+metaLineCur.b; } } else metaLineCur.points.resize(pointsFormer.size); } float MetaLine::probability(int N,int k,float p) { int i=0; float v=pow(p,N); float prob=v; for (i=0;i 0.0 && gausHalfSize > 0 ) { int gausSize = gausHalfSize*2 + 1; cv::GaussianBlur(grayImage, filteredImage, cv::Size(gausSize,gausSize), gausSigma); } //get gradient map and orientation map gradientMap = Mat::zeros(filteredImage.rows,filteredImage.cols,CV_32FC1); orientationMap = Mat::zeros(filteredImage.rows,filteredImage.cols,CV_32FC1); orientationMapInt=Mat::zeros(filteredImage.rows,filteredImage.cols,CV_8U); maskImage = Mat::zeros(filteredImage.rows,filteredImage.cols,CV_32FC1); cv::Mat orientationIndex = Mat::zeros(filteredImage.rows,filteredImage.cols,CV_8U); cv::Mat dx(filteredImage.rows, filteredImage.cols, CV_16S,Scalar(0)); cv::Mat dy(filteredImage.rows, filteredImage.cols, CV_16S,Scalar(0)); cv::Sobel(filteredImage, dx, CV_16S, 1, 0, apertureSize, 1, 0, cv::BORDER_REPLICATE); cv::Sobel(filteredImage, dy, CV_16S, 0, 1, apertureSize, 1, 0, cv::BORDER_REPLICATE); //temp cv::Mat temp(filteredImage.rows, filteredImage.cols, CV_8U,Scalar(0)); char *ptr_temp=(char *)temp.data; //calculate gradient and orientation int totalNum=0; int t=8; std::vector histogram(t*grayLevels,0); for (i=0;i(i); float *ptrO=orientationMap.ptr(i); uchar *ptrOI=orientationMapInt.ptr(i); short *ptrX=dx.ptr(i); short *ptrY=dy.ptr(i); for (j=0;jthGradientLow) { histogram[int(ptrG[j]+0.5)]++; totalNum++; } else ptrG[j]=0.0; } } //gradient statistic N2=0; for (i=0;i(t*grayLevels,0); smallerThan=std::vector(t*grayLevels,0); int count=0; for (i=t*grayLevels-1;i>=0;--i) { count+=histogram[i]; float probabilityGreater=float(count)/float(totalNum); greaterThan[i]=probabilityGreater; } count=0; /* for (i=0;i=0;--i) { if (greaterThan[i]>pMax) { thGradientHigh=i; break; } } */ for (i=t*grayLevels-1;i>=0;--i) { if (greaterThan[i]>pMax) { thGradientHigh=i; break; } } for (i=t*grayLevels-1;i>=0;--i) { if (greaterThan[i]>pMin) { thGradientLow=i; break; } } if (thGradientLow::SortDescent(&gradientValue[0], 0, numGradientPoints-1, &gradientPoints[0]); //find strings strings_list_t strings; for (i=0;i colors(7); for (i=0;i<7;++i) { int R=int(double(rand())/RAND_MAX*255); int G=int(double(rand())/RAND_MAX*255); int B=int(double(rand())/RAND_MAX*255); colors[i]=Scalar(R,G,B); } for (i=0;i colors(7); // for (i=0;i<7;++i) // { // int R=int(double(rand())/RAND_MAX*255); // int G=int(double(rand())/RAND_MAX*255); // int B=int(double(rand())/RAND_MAX*255); // // colors[i]=Scalar(R,G,B); // } int times=1; cv::Mat clustersImage(times*rows,times*cols,CV_8UC3,cv::Scalar(0,0,0)); for (i=0;i=1 metaLineTemp.k=parameters[1]; metaLineTemp.b=parameters[2]; if (!parameters[0]) { metaLineTemp.xs=metaLineTemp.points[0].x; metaLineTemp.ys=metaLineTemp.k*metaLineTemp.xs+metaLineTemp.b; metaLineTemp.xe=metaLineTemp.points[metaLineTemp.points.size()-1].x; metaLineTemp.ye=metaLineTemp.k*metaLineTemp.xe+metaLineTemp.b; } else { metaLineTemp.ys=metaLineTemp.points[0].y; metaLineTemp.xs=metaLineTemp.k*metaLineTemp.ys+metaLineTemp.b; metaLineTemp.ye=metaLineTemp.points[metaLineTemp.points.size()-1].y; metaLineTemp.xe=metaLineTemp.k*metaLineTemp.ye+metaLineTemp.b; } } } void MetaLine::MetaLineDetection(cv::Mat originalImage,float gausSigma, int gausHalfSize,std::vector > &lines) { int i,j; getInformations(originalImage, gausSigma, gausHalfSize,p); //smart routing float minDeviation=2.0; int minSize=thMeaningfulLength/2; clusters_list_t segments; smartRouting(segments,minDeviation,minSize); //get initial meta lines lines_list_t metaLines; getMetaLine(segments,metaLines,sigma); //meta line extending int *removal=(int *)malloc(metaLines.size()*sizeof(int)); memset(removal,0,metaLines.size()*sizeof(int)); metaLineExtending(metaLines,removal); //meta line merging //metaLineMerging(metaLines,removal); //line validity check lineValidityCheck(metaLines,removal); //get lines std::vector ID; for (i=0;i lineTemp(5); lineTemp[0]=metaLines[i].xs; lineTemp[1]=metaLines[i].ys; lineTemp[2]=metaLines[i].xe; lineTemp[3]=metaLines[i].ye; lineTemp[4]=metaLines[i].ID; lines.push_back(lineTemp); } } free(removal); } int MetaLine::lineMerging(int IDCur,line_t &metaLineCur,size_list_t &lineHyps,lines_list_t &metaLines,float thAngle) { int i,j; int numCur=metaLineCur.points.size(); float angleCur=0.0; if (metaLineCur.points[0].x==metaLineCur.points[numCur-1].x) { angleCur=CV_PI/2.0; } else angleCur=atan(float(metaLineCur.points[0].y-metaLineCur.points[numCur-1].y)/float(metaLineCur.points[0].x-metaLineCur.points[numCur-1].x)); //meta line merge judge std::vector nums; std::vector angles; for (i=0;ithAngle) return -1; else { //merged the line float thDis=4; int numHyp=metaLines[metaIDHyp].points.size(); float k=abs(tan(angleCur)); if (k>1) { float dis_s=abs(metaLines[metaIDHyp].points[0].y-metaLineCur.points[numCur-1].y); float dis_e=abs(metaLines[metaIDHyp].points[numHyp-1].y-metaLineCur.points[numCur-1].y); if (dis_s removal(lineHyps.size(),0); for (i=0;i2*thDev) removal[i]=1; } std::vector IDHypsNew; std::vector dis; for (i=0;i::SortAscent(&dis[0], 0, dis.size()-1, &IDHypsNew[0]); for (i=0;i1) { std::vector mergedPoints; if (disMin==dis1) { pts=Point2f(xs,ys); pte=Point2f(xsCur,ysCur); for (j=length-1;j>=0;--j) { mergedPoints.push_back(Point2f(metaLineCur.points[j].x,metaLineCur.points[j].y)) ; } for (j=0;j=0;--j) { mergedPoints.push_back(Point2f(metaLineCur.points[j].x,metaLineCur.points[j].y)) ; } for (j=lengthCur-1;j>=0;--j) { mergedPoints.push_back(Point2f(metaLines[IDHypsNew[i]].points[j].x,metaLines[IDHypsNew[i]].points[j].y)); } } else if (disMin==dis3) { pts=Point2f(xe,ye); pte=Point2f(xsCur,ysCur); for (j=0;j=0;--j) { mergedPoints.push_back(Point2f(metaLines[IDHypsNew[i]].points[j].x,metaLines[IDHypsNew[i]].points[j].y)); } } //line fitting float newPara[4]; float metaLineParas[4]; if (leastSquareFitting(mergedPoints,metaLineParas,sigma)) { if (crossingCheck( pts, pte, -IDCur-1)) { metaLineCur.dir=metaLineParas[0]; //0 for k<1, 1 for k >=1 metaLineCur.k=metaLineParas[1]; metaLineCur.b=metaLineParas[2]; metaLineCur.dev=metaLineParas[3]; if (metaLineCur.dir==0) { metaLineCur.xs=mergedPoints[0].x; metaLineCur.ys=metaLineCur.k*metaLineCur.xs+metaLineCur.b; metaLineCur.xe=mergedPoints[mergedPoints.size()-1].x; metaLineCur.ye=metaLineCur.k*metaLineCur.xe+metaLineCur.b; } else { metaLineCur.ys=mergedPoints[0].y; metaLineCur.xs=metaLineCur.k*metaLineCur.ys+metaLineCur.b; metaLineCur.ye=mergedPoints[mergedPoints.size()-1].y; metaLineCur.xe=metaLineCur.k*metaLineCur.ye+metaLineCur.b; } size_t &temp=IDMerged.push_back(); temp=IDHypsNew[i]; metaLineCur.points.resize(mergedPoints.size()); for (j=0;j length; std::vector index; for (i=0;i2*thMeaningfulLength) { index.push_back(i); length.push_back(metaLines[i].points.size()); } } QuickSort::SortDescent(&length[0], 0, length.size()-1, &index[0]); for (i=0;i=1 metaLines[t].k=metaLineParas[1]; metaLines[t].b=metaLineParas[2]; metaLines[t].dev=metaLineParas[3]; if (metaLines[t].dir) { metaLines[t].ys=metaLines[t].points[0].y; metaLines[t].xs=metaLines[t].k*metaLines[t].ys+metaLines[t].b; metaLines[t].ye=metaLines[t].points[metaLines[t].points.size()-1].y; metaLines[t].xe=metaLines[t].k*metaLines[t].ye+metaLines[t].b; } else { metaLines[t].xs=metaLines[t].points[0].x; metaLines[t].ys=metaLines[t].k*metaLines[t].xs+metaLines[t].b; metaLines[t].xe=metaLines[t].points[metaLines[t].points.size()-1].x; metaLines[t].ye=metaLines[t].k*metaLines[t].xe+metaLines[t].b; } } } } void MetaLine::metaLineMerging(lines_list_t &metaLines,int *removal) { int i,j,m,n; //sort lines std::vector length; std::vector index; for (i=0;i2*thMeaningfulLength) { index.push_back(i); length.push_back(metaLines[i].points.size()); } } QuickSort::SortDescent(&length[0], 0, length.size()-1, &index[0]); //creat line bins int numBins=16; float stepBins=CV_PI/numBins; std::vector > bins(numBins); std::vector lineBinIndex(length.size(),0); std::vector lineAngle(length.size(),0); for (i=0;i( (x * x) + (y * y) ) ); // Find the pixels with maximum deviation from the line segment in order to subdivide the cluster. size_t max_pixel_index = 0; float deviation, max_deviation = -1.0; for (size_t i=first_index, count=string.size(); i!=last_index; i=(i+1)%count) { const pixel_t ¤t = string[i]; deviation = static_cast( abs( ((current.x - first.x) * (first.y - last.y)) + ((current.y - first.y) * (last.x - first.x)) ) ); if (deviation > max_deviation) { max_pixel_index = i; max_deviation = deviation; } } max_deviation /= length; // // // Compute the ratio between the length of the segment and the maximum deviation. // float ratio = length / std::max( max_deviation, min_deviation ); // Test the number of pixels of the sub-clusters. int half_min_size=min_size/2; if ((max_deviation>=min_deviation) && ((max_pixel_index - first_index + 1) >= half_min_size) && ((last_index - max_pixel_index + 1) >= half_min_size)) { subDivision( clusters, string, first_index, max_pixel_index, min_deviation, min_size ); subDivision( clusters, string, max_pixel_index, last_index, min_deviation, min_size ); // // Test the quality of the sub-clusters against the quality of the current cluster. // if ((ratio1 > ratio) || (ratio2 > ratio)) // { // return std::max( ratio1, ratio2 ); // } } else { // Remove the sub-clusters from the list of clusters. clusters.resize( clusters_count ); // Keep current cluster cluster_t &cluster = clusters.push_back(); cluster.pixels = &first; cluster.size = (last_index - first_index) + 1; } } void MetaLine::lineValidityCheck(lines_list_t &metaLines,int *removal) { int i,j; // line Validity Check on Gradient orientation int num=0; for (i=0;i1) { removal[i]=1; num++; } } } } float MetaLine::lineValidityCheckGradientLevel(line_t &metaLines) { int i,j; float* ptrGM=(float*) gradientMap.data; int thGptNum=thMeaningfulLength; std::vector gradient; int numPoints=metaLines.points.size(); int step=numPoints/thGptNum; if (step==0) step=1; step=1; for (j=0;j::SortDescent(&gradient[0], 0, gradient.size()-1); int index=int(gradient[gradient.size()-1]+0.5); float probability=pow(greaterThan[index],numPoints); return probability; } float MetaLine::lineValidityCheckGradientOrientation(line_t &metaLines) { int i,j; float* ptr=(float*) orientationMap.data; float angleOffset=CV_PI/8.0; float deltaX=metaLines.xs-metaLines.xe; float deltaY=metaLines.ys-metaLines.ye; float angleLine = atan(deltaY/deltaX); std::vector alignIndex(metaLines.points.size(),0); int count1=0; int count2=0; int count3=0; for (j=0;j #include "types.h" #include using namespace cv; using namespace std; enum DIR{LEFT,RIGHT,UP,DOWN}; class MetaLine { public: MetaLine(void); ~MetaLine(void); void MetaLineDetection(cv::Mat originalImage,float gausSigma, int gausHalfSize,std::vector > &lines); private: void getInformations(cv::Mat &originalImage,float gausSigma, int gausHalfSize,float p); bool smartRouting(clusters_list_t &segments,float minDeviation,int minSize); void getMetaLine(clusters_list_t &segments,lines_list_t &metaLines,float thMSE); void getMetaLine(strings_list_t &strings,lines_list_t &metaLines,float thMSE); void metaLineExtending(lines_list_t &metaLines,int *removal); void metaLineMerging(lines_list_t &metaLines,int *removal); void lineValidityCheck(lines_list_t &metaLines,int *removal); // bool next(int &x_seed,int &y_seed); void subDivision(clusters_list_t &clusters, const string_t &string, const size_t first_index, const size_t last_index, const float min_deviation, const size_t min_size); void extendHirozontal(line_t &metaLineCur,lines_list_t &metaLines,int *removal); void extendVertical(line_t &metaLineCur,lines_list_t &metaLines,int *removal); int lineMerging(int IDCur,line_t &metaLineCur,size_list_t &IDHyps,lines_list_t &metaLines,float thAngle); int lineMerging2(int IDCur,line_t &metaLineCur,size_list_t &IDHyps,lines_list_t &metaLines,size_list_t &IDMerged); bool crossingCheck(Point2f pts,Point2f pte,int ID); int crossSearch(Point2i pts,float &angle,int ID); bool leastSquareFitting(string_t &string, float *parameters,float thMSE); bool leastSquareFitting(cluster_t &cluster, float *parameters,float thMSE); bool leastSquareFitting(std::vector &points, float *parameters,float thMSE); bool gradientWeightedLeastSquareFitting(string_t &string,float *parameters,float thMSE); float lineValidityCheckGradientLevel(line_t &metaLines); float lineValidityCheckGradientOrientation(line_t &metaLines); float probability(int N,int k,float p); // public: float p; float sigma; float thAngle; int thMeaningfulLength; float visualMeaningfulGradient; float thGradientLow; float thGradientHigh; cv::Mat cannyEdge; private: int rows,cols; int rows_1,cols_1 ; int thSearchSteps; float N4; float N2; cv::Mat filteredImage; cv::Mat gradientMap; //the gradient value cv::Mat orientationMap; //index for the gradient orientation cv::Mat orientationMapInt;// cv::Mat searchingMap; //index for searching direction cv::Mat maskImage; //index for the position of gradient points std::vector gradientPoints; std::vector gradientValue; std::vector greaterThan; std::vector smallerThan; }; #endif // _META_LINE_H_ ================================================ FILE: thirdparty/CannyLines/src/QuickSort.h ================================================ /* --- --- --- * Copyright (C) 2008--2010 Idiap Research Institute (.....@idiap.ch) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // QuickSort.h: interface for the CQuickSort class. // ////////////////////////////////////////////////////////////////////// #if !defined(_QUICK_SORT_H_) #define _QUICK_SORT_H_ #include "stdio.h" template /* class TD - the type of sorted data, class TI - the type of indices */ class QuickSort { public: /* sort everything inbetween `low' <-> `high' */ static void Sort(TD *pData, long low, long high, bool bAscent=true, TI* pIdxes=NULL) { long i = low; long j = high; TD y = 0; TI idx; /* compare value */ TD z = pData[(low + high) / 2]; /* partition */ do { if ( bAscent ) { /* find member above ... */ while(pData[i] < z) i++; /* find element below ... */ while(pData[j] > z) j--; } else { /* find member below ... */ while(pData[i] > z) i++; /* find element above ... */ while(pData[j] < z) j--; } if(i <= j) { /* swap two elements */ y = pData[i]; pData[i] = pData[j]; pData[j] = y; if ( pIdxes ) { idx = (pIdxes)[i]; (pIdxes)[i] = (pIdxes)[j]; (pIdxes)[j] = idx; } i++; j--; } } while(i <= j); /* recurse */ if(low < j) Sort(pData, low, j, bAscent, pIdxes); if(i < high) Sort(pData, i, high, bAscent, pIdxes); }; /* sort everything inbetween `low' <-> `high' */ static void SortAscent(TD *pData, long low, long high) { long i = low; long j = high; TD y = 0; /* compare value */ TD z = pData[(low + high) / 2]; /* partition */ do { /* find member above ... */ while(pData[i] < z) i++; /* find element below ... */ while(pData[j] > z) j--; if(i <= j) { /* swap two elements */ y = pData[i]; pData[i] = pData[j]; pData[j] = y; i++; j--; } } while(i <= j); /* recurse */ if(low < j) SortAscent(pData, low, j); if(i < high) SortAscent(pData, i, high); }; /* sort everything inbetween `low' <-> `high' */ static void SortDescent(TD *pData, long low, long high) { long i = low; long j = high; TD y = 0; /* compare value */ TD z = pData[(low + high) / 2]; /* partition */ do { /* find member below ... */ while(pData[i] > z) i++; /* find element above ... */ while(pData[j] < z) j--; if(i <= j) { /* swap two elements */ y = pData[i]; pData[i] = pData[j]; pData[j] = y; i++; j--; } } while(i <= j); /* recurse */ if(low < j) SortDescent(pData, low, j); if(i < high) SortDescent(pData, i, high); }; /* sort everything inbetween `low' <-> `high' */ static void SortAscent(TD *pData, long low, long high, TI* pIdxes) { long i = low; long j = high; TD y = 0; TI idx; /* compare value */ TD z = pData[(low + high) / 2]; /* partition */ do { /* find member above ... */ while(pData[i] < z) i++; /* find element below ... */ while(pData[j] > z) j--; if(i <= j) { /* swap two elements */ y = pData[i]; pData[i] = pData[j]; pData[j] = y; idx = (pIdxes)[i]; (pIdxes)[i] = (pIdxes)[j]; (pIdxes)[j] = idx; i++; j--; } } while(i <= j); /* recurse */ if(low < j) SortAscent(pData, low, j, pIdxes); if(i < high) SortAscent(pData, i, high, pIdxes); }; /* sort everything inbetween `low' <-> `high' */ static void SortDescent(TD *pData, long low, long high, TI* pIdxes) { long i = low; long j = high; TD y = 0; TI idx; /* compare value */ TD z = pData[(low + high) / 2]; /* partition */ do { /* find member below ... */ while(pData[i] > z) i++; /* find element above ... */ while(pData[j] < z) j--; if(i <= j) { /* swap two elements */ y = pData[i]; pData[i] = pData[j]; pData[j] = y; idx = (pIdxes)[i]; (pIdxes)[i] = (pIdxes)[j]; (pIdxes)[j] = idx; i++; j--; } } while(i <= j); /* recurse */ if(low < j) SortDescent(pData, low, j, pIdxes); if(i < high) SortDescent(pData, i, high, pIdxes); }; /* sort everything inbetween `low' <-> `high' */ static void SortAscent(TD *pData, long low, long high, TI* pIdxes,TI* pID) { long i = low; long j = high; TD y = 0; TI idx; /* compare value */ TD z = pData[(low + high) / 2]; /* partition */ do { /* find member above ... */ while(pData[i] < z) i++; /* find element below ... */ while(pData[j] > z) j--; if(i <= j) { /* swap two elements */ y = pData[i]; pData[i] = pData[j]; pData[j] = y; idx = (pIdxes)[i]; (pIdxes)[i] = (pIdxes)[j]; (pIdxes)[j] = idx; pID[(pIdxes)[i]]=i; pID[(pIdxes)[j]]=j; i++; j--; } } while(i <= j); /* recurse */ if(low < j) SortAscent(pData, low, j, pIdxes,pID); if(i < high) SortAscent(pData, i, high, pIdxes,pID); }; /* sort everything inbetween `low' <-> `high' */ static void SortDescent(TD *pData, long low, long high, TI* pIdxes,TI* pID) { long i = low; long j = high; TD y = 0; TI idx; /* compare value */ TD z = pData[(low + high) / 2]; /* partition */ do { /* find member below ... */ while(pData[i] > z) i++; /* find element above ... */ while(pData[j] < z) j--; if(i <= j) { /* swap two elements */ y = pData[i]; pData[i] = pData[j]; pData[j] = y; idx = (pIdxes)[i]; (pIdxes)[i] = (pIdxes)[j]; (pIdxes)[j] = idx; pID[(pIdxes)[i]]=i; pID[(pIdxes)[j]]=j; i++; j--; } } while(i <= j); /* recurse */ if(low < j) SortDescent(pData, low, j, pIdxes,pID); if(i < high) SortDescent(pData, i, high, pIdxes,pID); }; }; #endif // !defined(_QUICK_SORT_H_) ================================================ FILE: thirdparty/CannyLines/src/buffer_2d.cpp ================================================ /* * Copyright (C) 2008 Leandro A. F. Fernandes and Manuel M. Oliveira * * author : Fernandes, Leandro A. F. * e-mail : laffernandes@gmail.com * home page: http://www.inf.ufrgs.br/~laffernandes * * * The complete description of the implemented techinique can be found at * * Leandro A. F. Fernandes, Manuel M. Oliveira * Real-time line detection through an improved Hough transform voting scheme * Pattern Recognition (PR), Elsevier, 41:1, 2008, 299-314. * DOI: http://dx.doi.org/10.1016/j.patcog.2007.04.003 * Project Page: http://www.inf.ufrgs.br/~laffernandes/kht.html * * If you use this implementation, please reference the above paper. * * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. */ #include #include #include "buffer_2d.h" // Allocates 2D memory blocks. void* malloc_2d(const size_t size1, const size_t size2, const size_t data_size) { const size_t pointers_size = size1 * sizeof( void* ); const size_t items_size = size1 * size2 * data_size; void *buffer = malloc( pointers_size + items_size ); void **pointers = static_cast( buffer ); char *items = &(static_cast( buffer ))[pointers_size]; for (size_t i=0, j=0, j_inc=size2*data_size; i!=size1; ++i, j+=j_inc) { pointers[i] = &items[j]; } return buffer; } // Sets 2D buffers to a specified character. void* memset_2d(void *dest, const int c, const size_t size1, const size_t size2, const size_t data_size) { if (dest) { const size_t pointers_size = size1 * sizeof( void* ); const size_t items_size = size1 * size2 * data_size; char *buffer = static_cast( dest ); memset( &buffer[pointers_size], c, items_size ); } return dest; } // Reallocate 2D memory blocks. void* realloc_2d(void *memblock, const size_t size1, const size_t size2, const size_t data_size) { const size_t pointers_size = size1 * sizeof( void* ); const size_t items_size = size1 * size2 * data_size; memblock = realloc( memblock, pointers_size + items_size ); void **pointers = static_cast( memblock ); char *items = &(static_cast( memblock ))[pointers_size]; for (size_t i=0, j=0, j_inc=size2*data_size; i!=size1; ++i, j+=j_inc) { pointers[i] = &items[j]; } return memblock; } ================================================ FILE: thirdparty/CannyLines/src/buffer_2d.h ================================================ /* * Copyright (C) 2008 Leandro A. F. Fernandes and Manuel M. Oliveira * * author : Fernandes, Leandro A. F. * e-mail : laffernandes@gmail.com * home page: http://www.inf.ufrgs.br/~laffernandes * * * The complete description of the implemented techinique can be found at * * Leandro A. F. Fernandes, Manuel M. Oliveira * Real-time line detection through an improved Hough transform voting scheme * Pattern Recognition (PR), Elsevier, 41:1, 2008, 299-314. * DOI: http://dx.doi.org/10.1016/j.patcog.2007.04.003 * Project Page: http://www.inf.ufrgs.br/~laffernandes/kht.html * * If you use this implementation, please reference the above paper. * * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. */ #ifndef _BUFFER_2D_ #define _BUFFER_2D_ #include // Allocates 2D memory blocks. void* malloc_2d(const size_t size1, const size_t size2, const size_t data_size); // Sets 2D buffers to a specified character. void* memset_2d(void *dest, const int c, const size_t size1, const size_t size2, const size_t data_size); // Reallocate 2D memory blocks. void* realloc_2d(void *memblock, const size_t size1, const size_t size2, const size_t data_size); #endif // !_BUFFER_2D_ ================================================ FILE: thirdparty/CannyLines/src/main.cpp ================================================ #include #include #include "cv.h" #include "highgui.h" #include "CannyLine.h" using namespace cv; using namespace std; void main() { string fileCur; cv::Mat img = imread( fileCur, 0 ); CannyLine detector; std::vector > lines; detector.cannyLine( img, lines ); // show cv::Mat imgShow( img.rows, img.cols, CV_8UC3, cv::Scalar( 255, 255, 255 ) ); for ( int m=0; m #include #include #include "buffer_2d.h" // A simple list implementation (use it only with aggregate types). template class list { private: // Specifies the size of allocated storage for the container. size_t m_capacity; // Specifies the list of items. item_type *m_items; // Counts the number of elements. size_t m_size; public: // Erases the elements of the list. inline void clear() { m_size = 0; } // Tests if the list is empty. inline bool empty() const { return (m_size == 0); } // Returns a pointer to the list of items. inline item_type* items() { return m_items; } // Returns a pointer to the list of items. inline const item_type* items() const { return m_items; } // Class constructor. list() : m_capacity(0), m_items(0), m_size(0) { } // Class destructor. ~list() { free( m_items ); }; // Deletes the element at the end of the list. inline void pop_back() { m_size--; } // Adds a new last element and returns a reference to it. inline item_type& push_back() { if (m_capacity == m_size) { m_items = (item_type*)realloc( m_items, (m_capacity += capacity_inc) * sizeof( item_type ) ); memset( &m_items[m_size], 0, capacity_inc * sizeof( item_type ) ); } return m_items[m_size++]; } // Specifies a new capacity for a list. inline void reserve(const size_t capacity) { if (m_capacity < capacity) { size_t first = m_capacity; m_items = (item_type*)realloc( m_items, (m_capacity = capacity) * sizeof( item_type ) ); memset( &m_items[first], 0, (capacity - first) * sizeof( item_type ) ); } if (m_size > capacity) { m_size = capacity; } } // Specifies a new size for a list. inline void resize(const size_t size) { if (m_capacity < size) { size_t first = m_capacity; m_items = (item_type*)realloc( m_items, (m_capacity = size) * sizeof( item_type ) ); memset( &m_items[first], 0, (size - first) * sizeof( item_type ) ); } m_size = size; } // Returns the number of elements. inline size_t size() const { return m_size; } // Returns a reference to the list element at a specified position. inline item_type& operator [] (const size_t index) { return m_items[index]; } // Returns a reference to the list element at a specified position. inline const item_type& operator [] (const size_t index) const { return m_items[index]; } }; // A feature pixel. struct pixel_t { float x; float y; }; // A cluster of approximately collinear feature pixels. struct cluster_t { const pixel_t *pixels; size_t size; }; // Specifies a list of approximately collinear feature pixels. typedef list clusters_list_t; // Specifies a string of adjacent feature pixels. typedef list string_t; // Specifies a list of string of feature pixels. typedef list strings_list_t; typedef list size_list_t; struct line_t { int ID; string_t points; float xs,ys; float xe,ye; int dir; //0 for k<1, 1 for k >=1 float k,b; float dev; }; // Specifies a list of line typedef list lines_list_t; #endif // !_TYPES_ ================================================ FILE: thirdparty/LSD/COPYING ================================================ GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU Affero General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Remote Network Interaction; Use with the GNU General Public License. Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . ================================================ FILE: thirdparty/LSD/Makefile ================================================ # ----------------------------------------------------------------------------- # # LSD - Line Segment Detector on digital images # # Copyright 2007-2010 rafael grompone von gioi (grompone@gmail.com) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # # ----------------------------------------------------------------------------- all: lsd lsd_call_example lsd: lsd.c lsd.h lsd_cmd.c cc -O3 -lm -o lsd lsd_cmd.c lsd.c lsd_call_example: lsd.c lsd.h lsd_call_example.c cc -lm -o lsd_call_example lsd_call_example.c lsd.c strict: lsd.c lsd.h lsd_cmd.c cc -fPIC -ansi -Wall -Wextra -Werror -lm -o lsd_strict lsd.c lsd_cmd.c doc: lsd.c lsd.h doxygen.config doxygen doxygen.config clean: rm -f lsd lsd_call_example lsd_strict cleandoc: rm -rf doc # ----------------------------------------------------------------------------- ================================================ FILE: thirdparty/LSD/README.md ================================================ LSD - Line Segment Detector =========================== Version 1.5 - December 3, 2010 by Rafael Grompone von Gioi Introduction ------------ LSD is an implementation of the Line Segment Detector on digital images described in the paper: "LSD: A Fast Line Segment Detector with a False Detection Control" by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel, and Gregory Randall, IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 32, no. 4, pp. 722-732, April, 2010. and in more details in the CMLA Technical Report: "LSD: A Line Segment Detector, Technical Report", by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel, Gregory Randall, CMLA, ENS Cachan, 2010. The version implemented here includes some further improvements described on the LSD page at www.ipol.im. That same page includes more information, including this code and an online demo version: http://www.ipol.im/pub/algo/gjmr_line_segment_detector Files ----- README.txt - This file. COPYING - GNU AFFERO GENERAL PUBLIC LICENSE Version 3. Makefile - Compilation instructions for 'make'. lsd.c - LSD module ANSI C code. lsd.h - LSD module ANSI C header. lsd_cmd.c - LSD command line interface, ANSI C code. lsd_call_example.c - Minimal example of calling LSD from a C language program. chairs.pgm - Test image in PGM format. chairs.lsd.txt - Expected result for 'chairs.pgm' image as an ASCII file. chairs.lsd.eps - Expected result for 'chairs.pgm' image as an EPS file. doc - Html code documentation. doxygen.config - doxygen configuration file for documentation generation. Compiling --------- LSD is an ANSI C Language program and can be used as a module to be called from a C language program or as an independent command. In the distribution is included a Makefile file with instructions to build the command lines program 'lsd', as well as minimal example program on how to call LSD from C code. To build both programs, a C compiler (called with 'cc') must be installed on your system, as well as the program 'make'. LSD only uses the standard C library so it should compile in any ANSI C Language environment. In particular, it should compile in an Unix like system. The compiling instruction is just make from the directory where the source codes and the Makefile are located. To verify a correct compilation you can apply LSD to the test image 'chairs.pgm' and compare the result to the provided ones. An explicit example of how to compile a program using LSD as a module is provided. The compilation line for 'lsd_call_example.c' is just cc -lm -o lsd_call_example lsd_call_example.c lsd.c Running LSD Command ------------------- The simplest LSD command execution is just lsd or ./lsd if the command is not in the path. That should print LSD version and the command line interface, including the available options. The only input image format handled by LSD is PGM, in its two versions, ASCII and Binary. A useful execution would be: lsd chairs.pgm chairs.result.txt That should give the result as an ASCII file 'chairs.result.txt' with the coordinates each line segment detected as a line in the file like the following: 159.232890 134.369601 160.325338 105.613616 2.735466 which means that a line segment starting at point (159.232890,134.369601) and ending at point (160.325338 105.613616) and of width 2.735466 was detected. The unit is the pixel and the origin of coordinates is the center of pixel (0,0). For easier visualization of the result, the LSD command can also give the output in EPS or SVG file formats. For example, lsd -P chairs.result.eps chairs.pgm chairs.result.txt will, in addition to the ASCII output file, produce the EPS file 'chairs.result.eps'. To see the full options, execute LSD command without parameters, as in './lsd'. Optional arguments should always appear before the needed arguments input and output. For example, the following line is wrong: lsd chairs.pgm -s 0.5 chairs.result.txt -> WRONG!! and should be lsd -s 0.5 chairs.pgm chairs.result.txt If the name of an input file is just - (one dash), then that file will be read from the standard input. Analogously, if the name of an output file is just - (one dash), then that file will be written to the standard output. For example, lsd - - will work as a filter, taking the input from standard input and giving the output to standard output. Code Documentation ------------------ There is a HTML documentation of the code on the directory 'doc'. The entry point is the file 'doc/index.html' that should be opened with a web browser. The documentation was automatically generated from the source code files using the Doxygen documentation system, see http://www.stack.nl/~dimitri/doxygen/. Copyright and License --------------------- Copyright 2007-2010 rafael grompone von gioi (grompone@gmail.com) LSD is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. LSD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . Thanks ------ I would be grateful to receive any comment, especially about errors, bugs, or strange results. ================================================ FILE: thirdparty/LSD/chairs.lsd.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 512 512 %%Creator: LSD, Line Segment Detector %%Title: (chairs.lsd.eps) %%EndComments newpath 159.232890 377.630399 moveto 160.325338 406.386384 lineto 1.500000 setlinewidth stroke newpath 66.105373 436.412213 moveto 63.972852 463.940680 lineto 1.500000 setlinewidth stroke newpath 68.757033 345.302576 moveto 63.229592 403.884869 lineto 1.500000 setlinewidth stroke newpath 214.249352 288.880786 moveto 216.035182 327.663671 lineto 1.500000 setlinewidth stroke newpath 146.507379 405.095649 moveto 144.805709 426.409387 lineto 1.500000 setlinewidth stroke newpath 16.923435 91.703293 moveto 101.917593 79.163701 lineto 1.500000 setlinewidth stroke newpath 185.613699 173.799808 moveto 184.450026 212.664673 lineto 1.500000 setlinewidth stroke newpath 185.553747 95.117638 moveto 184.760563 102.794000 lineto 1.500000 setlinewidth stroke newpath 104.420784 82.933415 moveto 14.001093 96.356269 lineto 1.500000 setlinewidth stroke newpath 236.956356 61.906785 moveto 338.133131 46.428147 lineto 1.500000 setlinewidth stroke newpath 440.312266 68.681418 moveto 461.485782 171.197215 lineto 1.500000 setlinewidth stroke newpath 390.175127 68.752265 moveto 386.423926 82.501938 lineto 1.500000 setlinewidth stroke newpath 254.349382 367.377162 moveto 309.534989 361.672777 lineto 1.500000 setlinewidth stroke newpath 395.623625 357.611991 moveto 469.473514 349.807144 lineto 1.500000 setlinewidth stroke newpath 82.100903 313.871348 moveto 82.505242 338.885018 lineto 1.500000 setlinewidth stroke newpath 308.102489 364.883084 moveto 265.621383 368.836134 lineto 1.500000 setlinewidth stroke newpath 318.193027 403.361748 moveto 377.018594 397.930169 lineto 1.500000 setlinewidth stroke newpath 177.234686 340.115222 moveto 178.866472 400.138825 lineto 1.500000 setlinewidth stroke newpath 83.483276 302.582551 moveto 83.002669 312.678681 lineto 1.500000 setlinewidth stroke newpath 470.753079 352.524955 moveto 426.714048 357.429896 lineto 1.500000 setlinewidth stroke newpath 347.054436 46.040231 moveto 390.859403 69.519765 lineto 1.500000 setlinewidth stroke newpath 130.050173 88.785323 moveto 145.520607 96.582136 lineto 1.500000 setlinewidth stroke newpath 359.127942 271.253044 moveto 363.431147 306.641769 lineto 1.500000 setlinewidth stroke newpath 338.937027 50.196876 moveto 329.742966 53.614810 lineto 1.500000 setlinewidth stroke newpath 55.447508 224.112945 moveto 90.891886 217.896771 lineto 1.500000 setlinewidth stroke newpath 220.576199 73.846485 moveto 226.204808 64.213795 lineto 1.500000 setlinewidth stroke newpath 459.356888 398.687832 moveto 509.492223 393.836399 lineto 1.500000 setlinewidth stroke newpath 472.109699 35.342094 moveto 483.528037 22.997805 lineto 1.500000 setlinewidth stroke newpath 28.400012 378.274511 moveto 0.578315 382.302547 lineto 1.500000 setlinewidth stroke newpath 129.429473 406.943925 moveto 65.661795 408.853635 lineto 1.500000 setlinewidth stroke newpath 65.393503 409.002684 moveto 62.249854 434.078699 lineto 1.500000 setlinewidth stroke newpath 209.403932 404.204705 moveto 252.014573 400.465538 lineto 1.500000 setlinewidth stroke newpath 254.544229 210.539515 moveto 349.452808 200.890307 lineto 1.500000 setlinewidth stroke newpath 494.491690 20.821260 moveto 509.489418 18.307701 lineto 1.500000 setlinewidth stroke newpath 418.147191 445.425796 moveto 463.270471 442.096800 lineto 1.500000 setlinewidth stroke newpath 114.550553 84.813610 moveto 109.152211 81.770175 lineto 1.500000 setlinewidth stroke newpath 363.760038 171.885065 moveto 368.999069 152.523278 lineto 1.500000 setlinewidth stroke newpath 112.015348 78.588127 moveto 129.096273 86.944720 lineto 1.500000 setlinewidth stroke newpath 450.611143 459.939084 moveto 489.517674 457.039207 lineto 1.500000 setlinewidth stroke newpath 114.103020 455.036541 moveto 113.370535 467.639271 lineto 1.500000 setlinewidth stroke newpath 166.443487 369.132111 moveto 177.706109 333.278739 lineto 1.500000 setlinewidth stroke newpath 0.568442 379.782537 moveto 29.760859 374.961420 lineto 1.500000 setlinewidth stroke newpath 0.822115 439.176661 moveto 33.431051 435.034186 lineto 1.500000 setlinewidth stroke newpath 335.206776 52.203363 moveto 233.710408 66.732278 lineto 1.500000 setlinewidth stroke newpath 506.939321 397.705002 moveto 430.625997 401.395607 lineto 1.500000 setlinewidth stroke newpath 91.889757 406.545068 moveto 132.021450 403.062750 lineto 1.500000 setlinewidth stroke newpath 490.624116 25.330339 moveto 481.689616 31.633947 lineto 1.500000 setlinewidth stroke newpath 148.343515 467.931628 moveto 171.978709 464.613785 lineto 1.500000 setlinewidth stroke newpath 167.308281 467.628627 moveto 167.161805 485.127401 lineto 1.500000 setlinewidth stroke newpath 370.836320 64.750257 moveto 345.209318 52.225532 lineto 1.500000 setlinewidth stroke newpath 391.906831 427.947381 moveto 432.009557 423.987798 lineto 1.500000 setlinewidth stroke newpath 178.416428 333.174306 moveto 193.827134 289.929762 lineto 1.500000 setlinewidth stroke newpath 133.271812 377.250054 moveto 162.050609 372.421696 lineto 1.500000 setlinewidth stroke newpath 90.277768 284.200800 moveto 83.969749 301.679861 lineto 1.500000 setlinewidth stroke newpath 184.930491 103.852722 moveto 185.794276 173.857488 lineto 1.500000 setlinewidth stroke newpath 459.882600 167.961912 moveto 464.790514 177.409137 lineto 1.500000 setlinewidth stroke newpath 121.173667 440.346765 moveto 136.308673 402.901333 lineto 1.500000 setlinewidth stroke newpath 142.958322 100.873992 moveto 126.173037 90.489190 lineto 1.500000 setlinewidth stroke newpath 373.211533 401.131622 moveto 328.114968 405.008304 lineto 1.500000 setlinewidth stroke newpath 26.897965 492.627292 moveto 25.020860 511.439445 lineto 1.500000 setlinewidth stroke newpath 428.479914 43.042322 moveto 438.882696 65.354530 lineto 1.500000 setlinewidth stroke newpath 359.498486 462.415370 moveto 409.487962 459.720172 lineto 1.500000 setlinewidth stroke newpath 200.759417 98.701775 moveto 191.059982 91.175324 lineto 1.500000 setlinewidth stroke newpath 160.717716 434.737817 moveto 220.711892 432.105099 lineto 1.500000 setlinewidth stroke newpath 224.660034 248.669855 moveto 223.280681 255.158097 lineto 1.500000 setlinewidth stroke newpath 485.638645 460.647267 moveto 440.636706 461.823046 lineto 1.500000 setlinewidth stroke newpath 78.123187 435.098969 moveto 119.520625 432.216279 lineto 1.500000 setlinewidth stroke newpath 303.110387 264.990330 moveto 245.341121 271.258830 lineto 1.500000 setlinewidth stroke newpath 44.214757 461.751230 moveto 38.283969 478.929883 lineto 1.500000 setlinewidth stroke newpath 136.358108 345.985404 moveto 133.914970 364.904170 lineto 1.500000 setlinewidth stroke newpath 290.612784 464.985153 moveto 325.781195 461.913101 lineto 1.500000 setlinewidth stroke newpath 430.928389 73.610954 moveto 443.824367 88.428422 lineto 1.500000 setlinewidth stroke newpath 250.702019 403.335905 moveto 230.666339 405.506570 lineto 1.500000 setlinewidth stroke newpath 401.971668 322.776260 moveto 432.172868 320.692792 lineto 1.500000 setlinewidth stroke newpath 284.417212 430.488894 moveto 322.134685 426.113665 lineto 1.500000 setlinewidth stroke newpath 509.887214 22.546250 moveto 492.055317 26.318579 lineto 1.500000 setlinewidth stroke newpath 35.522946 456.125588 moveto 40.682107 454.014564 lineto 1.500000 setlinewidth stroke newpath 134.291376 399.817391 moveto 142.123736 379.734505 lineto 1.500000 setlinewidth stroke newpath 383.492191 76.060838 moveto 375.382597 66.582396 lineto 1.500000 setlinewidth stroke newpath 108.153220 365.300245 moveto 110.409196 348.845413 lineto 1.500000 setlinewidth stroke newpath 434.003471 321.297586 moveto 433.045129 341.371187 lineto 1.500000 setlinewidth stroke newpath 38.179708 290.715251 moveto 0.309891 294.225283 lineto 1.500000 setlinewidth stroke newpath 426.878110 427.671871 moveto 386.805716 430.330850 lineto 1.500000 setlinewidth stroke newpath 5.548653 290.405969 moveto 38.141785 287.838046 lineto 1.500000 setlinewidth stroke newpath 228.231497 251.607507 moveto 230.003626 241.268495 lineto 1.500000 setlinewidth stroke newpath 125.598417 90.330665 moveto 115.603827 89.038809 lineto 1.500000 setlinewidth stroke newpath 0.618577 412.593471 moveto 24.644698 407.698868 lineto 1.500000 setlinewidth stroke newpath 98.357075 71.679418 moveto 32.948807 81.444875 lineto 1.500000 setlinewidth stroke newpath 400.760375 343.945157 moveto 401.833753 322.749515 lineto 1.500000 setlinewidth stroke newpath 114.391901 436.067978 moveto 68.111960 436.897458 lineto 1.500000 setlinewidth stroke newpath 131.537589 425.110571 moveto 129.878963 463.896551 lineto 1.500000 setlinewidth stroke newpath 455.572123 489.617824 moveto 474.507270 487.643681 lineto 1.500000 setlinewidth stroke newpath 319.431011 429.545754 moveto 284.362402 432.474131 lineto 1.500000 setlinewidth stroke newpath 61.838651 377.730091 moveto 53.981571 375.012465 lineto 1.500000 setlinewidth stroke newpath 106.794317 453.609591 moveto 115.847654 450.857427 lineto 1.500000 setlinewidth stroke newpath 198.098624 478.654066 moveto 217.026545 476.394406 lineto 1.500000 setlinewidth stroke newpath 274.419642 453.085261 moveto 254.365818 455.030329 lineto 1.500000 setlinewidth stroke newpath 110.830519 347.323695 moveto 136.968982 344.880446 lineto 1.500000 setlinewidth stroke newpath 156.904122 452.971452 moveto 194.558357 449.806331 lineto 1.500000 setlinewidth stroke newpath 203.411749 392.793786 moveto 204.813000 380.035815 lineto 1.500000 setlinewidth stroke newpath 277.089886 335.050031 moveto 275.815996 352.638833 lineto 1.500000 setlinewidth stroke newpath 405.685811 462.708039 moveto 361.855954 464.707487 lineto 1.500000 setlinewidth stroke newpath 86.904705 467.833598 moveto 103.180657 465.515839 lineto 1.500000 setlinewidth stroke newpath 224.523552 271.186505 moveto 227.747717 252.346516 lineto 1.500000 setlinewidth stroke newpath 453.820099 386.398501 moveto 454.326662 371.415627 lineto 1.500000 setlinewidth stroke newpath 88.113984 383.638165 moveto 105.634220 382.823208 lineto 1.500000 setlinewidth stroke newpath 225.624005 392.563789 moveto 211.857320 392.787623 lineto 1.500000 setlinewidth stroke newpath 62.346586 404.899777 moveto 49.555360 400.810796 lineto 1.500000 setlinewidth stroke newpath 460.641118 445.570022 moveto 408.119470 447.472307 lineto 1.500000 setlinewidth stroke newpath 32.114157 81.255887 moveto 4.020168 87.197125 lineto 1.500000 setlinewidth stroke newpath 350.302735 36.609514 moveto 256.669285 49.928845 lineto 1.500000 setlinewidth stroke newpath 421.966069 483.511538 moveto 461.946711 481.807376 lineto 1.500000 setlinewidth stroke newpath 129.453086 478.275785 moveto 149.464944 475.874606 lineto 1.500000 setlinewidth stroke newpath 151.960634 280.982370 moveto 112.851686 284.888582 lineto 1.500000 setlinewidth stroke newpath 129.400486 203.257632 moveto 109.353394 203.529021 lineto 1.500000 setlinewidth stroke newpath 455.578760 370.633154 moveto 479.469681 369.144017 lineto 1.500000 setlinewidth stroke newpath 46.205567 339.143549 moveto 64.055075 300.555218 lineto 1.500000 setlinewidth stroke newpath 190.646608 453.308588 moveto 146.861333 454.692642 lineto 1.500000 setlinewidth stroke newpath 204.454163 378.572164 moveto 227.005579 376.687350 lineto 1.500000 setlinewidth stroke newpath 461.866721 484.786020 moveto 423.139823 485.731889 lineto 1.500000 setlinewidth stroke newpath 453.212818 471.741539 moveto 494.476852 469.499876 lineto 1.500000 setlinewidth stroke newpath 477.426352 319.954966 moveto 492.912716 256.323335 lineto 1.500000 setlinewidth stroke newpath 325.794712 391.469623 moveto 326.718149 377.614546 lineto 1.500000 setlinewidth stroke newpath 479.313251 386.457094 moveto 455.497646 387.716265 lineto 1.500000 setlinewidth stroke newpath 227.407290 377.579614 moveto 226.462509 392.519869 lineto 1.500000 setlinewidth stroke newpath 350.883550 375.097838 moveto 350.472920 390.086589 lineto 1.500000 setlinewidth stroke newpath 18.257506 412.516374 moveto 0.560668 414.570856 lineto 1.500000 setlinewidth stroke newpath 206.372770 47.223601 moveto 200.829459 71.421837 lineto 1.500000 setlinewidth stroke newpath 335.694580 449.573404 moveto 369.606124 446.194873 lineto 1.500000 setlinewidth stroke newpath 29.371380 438.834823 moveto 8.180792 440.744195 lineto 1.500000 setlinewidth stroke newpath 45.217461 406.170714 moveto 56.739988 383.183907 lineto 1.500000 setlinewidth stroke newpath 253.340273 452.967003 moveto 278.389335 449.579830 lineto 1.500000 setlinewidth stroke newpath 431.848879 342.161551 moveto 401.733189 343.858942 lineto 1.500000 setlinewidth stroke newpath 43.425276 181.143174 moveto 35.516449 213.543380 lineto 1.500000 setlinewidth stroke newpath 108.044574 382.381890 moveto 105.311392 397.339280 lineto 1.500000 setlinewidth stroke newpath 249.350404 336.109851 moveto 277.190608 333.527333 lineto 1.500000 setlinewidth stroke newpath 328.075196 375.760737 moveto 350.730312 373.923873 lineto 1.500000 setlinewidth stroke newpath 18.525858 511.573816 moveto 24.735488 499.053794 lineto 1.500000 setlinewidth stroke newpath 246.244878 356.614163 moveto 248.802003 336.621469 lineto 1.500000 setlinewidth stroke newpath 427.869552 234.532747 moveto 410.975793 227.971751 lineto 1.500000 setlinewidth stroke newpath 398.134242 497.837133 moveto 429.433750 496.473438 lineto 1.500000 setlinewidth stroke newpath 246.683107 56.928003 moveto 219.201307 64.494107 lineto 1.500000 setlinewidth stroke newpath 176.089103 89.826466 moveto 169.333992 107.609423 lineto 1.500000 setlinewidth stroke newpath 348.324771 295.823580 moveto 350.485679 306.403456 lineto 1.500000 setlinewidth stroke newpath 452.900719 249.213735 moveto 394.006643 255.325359 lineto 1.500000 setlinewidth stroke newpath 365.238056 249.006028 moveto 372.084940 203.906873 lineto 1.500000 setlinewidth stroke newpath 39.495839 373.091246 moveto 46.797720 362.571360 lineto 1.500000 setlinewidth stroke newpath 49.039987 437.651941 moveto 61.520660 408.722134 lineto 1.500000 setlinewidth stroke newpath 121.888190 73.834984 moveto 114.379933 71.360035 lineto 1.500000 setlinewidth stroke newpath 172.835900 108.781820 moveto 177.568496 94.098522 lineto 1.500000 setlinewidth stroke newpath 509.618479 8.570647 moveto 475.552093 17.341835 lineto 1.500000 setlinewidth stroke newpath 84.327486 397.872805 moveto 87.147464 384.188746 lineto 1.500000 setlinewidth stroke newpath 169.405751 487.301562 moveto 201.911433 486.222771 lineto 1.500000 setlinewidth stroke newpath 344.833624 305.215772 moveto 342.819955 287.659989 lineto 1.500000 setlinewidth stroke newpath 442.766424 61.625929 moveto 450.516605 72.700855 lineto 1.500000 setlinewidth stroke newpath 355.565684 196.353809 moveto 364.080400 172.519754 lineto 1.500000 setlinewidth stroke newpath 351.934340 486.244031 moveto 389.410827 485.305310 lineto 1.500000 setlinewidth stroke newpath 496.897016 471.641476 moveto 479.413083 473.085954 lineto 1.500000 setlinewidth stroke newpath 0.633644 457.020121 moveto 34.411079 456.567512 lineto 1.500000 setlinewidth stroke newpath 2.996378 184.109044 moveto 42.069625 179.162297 lineto 1.500000 setlinewidth stroke newpath 169.371594 88.864141 moveto 156.496274 92.902703 lineto 1.500000 setlinewidth stroke newpath 310.586433 245.220095 moveto 294.455011 238.677717 lineto 1.500000 setlinewidth stroke newpath 349.301186 390.404290 moveto 326.741529 392.119755 lineto 1.500000 setlinewidth stroke newpath 133.136094 363.997108 moveto 109.017347 366.188348 lineto 1.500000 setlinewidth stroke newpath 254.109359 50.188348 moveto 222.751823 57.207974 lineto 1.500000 setlinewidth stroke newpath 321.406759 320.364156 moveto 333.316419 281.433559 lineto 1.500000 setlinewidth stroke newpath 284.366747 260.829888 moveto 256.873049 261.246134 lineto 1.500000 setlinewidth stroke newpath 106.764309 194.292743 moveto 174.234571 185.319146 lineto 1.500000 setlinewidth stroke newpath 339.395916 288.871768 moveto 342.719927 310.380776 lineto 1.500000 setlinewidth stroke newpath 41.911574 451.954699 moveto 48.327150 437.716084 lineto 1.500000 setlinewidth stroke newpath 283.365831 257.604286 moveto 282.075951 242.607716 lineto 1.500000 setlinewidth stroke newpath 274.352037 353.582898 moveto 246.630292 355.762194 lineto 1.500000 setlinewidth stroke newpath 362.659723 306.989077 moveto 366.774935 320.156274 lineto 1.500000 setlinewidth stroke newpath 428.134504 499.101032 moveto 399.382780 500.310018 lineto 1.500000 setlinewidth stroke newpath 189.109111 17.682152 moveto 178.306095 15.484706 lineto 1.500000 setlinewidth stroke newpath 104.359670 397.336686 moveto 84.283501 398.404159 lineto 1.500000 setlinewidth stroke newpath 505.126517 247.670462 moveto 505.894641 213.852732 lineto 1.500000 setlinewidth stroke newpath 154.999632 93.814789 moveto 129.233747 80.271917 lineto 1.500000 setlinewidth stroke newpath 363.171642 450.185499 moveto 315.642871 451.877109 lineto 1.500000 setlinewidth stroke newpath 369.258623 160.451274 moveto 403.256407 156.168030 lineto 1.500000 setlinewidth stroke newpath 453.182331 496.471301 moveto 486.924373 495.034438 lineto 1.500000 setlinewidth stroke newpath 260.627491 368.941456 moveto 221.885083 370.393940 lineto 1.500000 setlinewidth stroke newpath 371.707029 141.696856 moveto 388.261380 86.043747 lineto 1.500000 setlinewidth stroke newpath 91.135701 220.378308 moveto 105.541817 191.333741 lineto 1.500000 setlinewidth stroke newpath 330.678520 493.081171 moveto 351.929315 490.587945 lineto 1.500000 setlinewidth stroke newpath 480.302377 370.114812 moveto 480.205104 385.130378 lineto 1.500000 setlinewidth stroke newpath 14.421376 488.185990 moveto 0.559439 489.331938 lineto 1.500000 setlinewidth stroke newpath 111.601542 175.545259 moveto 123.994127 146.749033 lineto 1.500000 setlinewidth stroke newpath 294.514109 500.091709 moveto 320.707543 497.096960 lineto 1.500000 setlinewidth stroke newpath 355.890985 40.873036 moveto 348.942537 37.191140 lineto 1.500000 setlinewidth stroke newpath 353.104281 252.621493 moveto 356.705833 231.346363 lineto 1.500000 setlinewidth stroke newpath 28.151838 274.968945 moveto 9.105274 271.693390 lineto 1.500000 setlinewidth stroke newpath 229.410862 494.092763 moveto 244.415633 491.621735 lineto 1.500000 setlinewidth stroke newpath 0.529073 229.266887 moveto 32.083426 225.739469 lineto 1.500000 setlinewidth stroke newpath 31.876890 17.061774 moveto 5.878110 74.675141 lineto 1.500000 setlinewidth stroke newpath 53.538549 375.706604 moveto 47.685556 372.085250 lineto 1.500000 setlinewidth stroke newpath 194.205052 80.191093 moveto 199.506846 93.823724 lineto 1.500000 setlinewidth stroke newpath 379.315714 172.742470 moveto 367.835549 166.948520 lineto 1.500000 setlinewidth stroke newpath 476.264587 19.358183 moveto 448.383295 56.264460 lineto 1.500000 setlinewidth stroke newpath 113.153085 281.713723 moveto 163.120503 277.570764 lineto 1.500000 setlinewidth stroke newpath 350.648351 44.423420 moveto 333.126157 43.840231 lineto 1.500000 setlinewidth stroke newpath 391.843385 491.144340 moveto 413.374216 488.193252 lineto 1.500000 setlinewidth stroke newpath 186.933246 246.931189 moveto 196.824766 245.895315 lineto 1.500000 setlinewidth stroke newpath 289.491922 487.200911 moveto 325.697471 485.161700 lineto 1.500000 setlinewidth stroke newpath 35.637980 207.754140 moveto 0.366122 211.299482 lineto 1.500000 setlinewidth stroke newpath 109.015978 494.979121 moveto 115.568756 478.852147 lineto 1.500000 setlinewidth stroke newpath 310.756543 477.364754 moveto 353.256773 474.868666 lineto 1.500000 setlinewidth stroke newpath 0.498982 266.632486 moveto 48.182540 260.578183 lineto 1.500000 setlinewidth stroke newpath 293.317471 237.385609 moveto 318.137550 235.272398 lineto 1.500000 setlinewidth stroke newpath 404.168898 156.086759 moveto 447.071086 150.338482 lineto 1.500000 setlinewidth stroke newpath 48.198019 256.210030 moveto 33.804745 249.839271 lineto 1.500000 setlinewidth stroke newpath 350.687175 493.390433 moveto 323.165693 495.625973 lineto 1.500000 setlinewidth stroke newpath 425.678600 357.660754 moveto 373.165640 359.849876 lineto 1.500000 setlinewidth stroke newpath 457.111719 58.518955 moveto 451.342462 74.937878 lineto 1.500000 setlinewidth stroke newpath 104.793695 190.870832 moveto 111.581106 175.684948 lineto 1.500000 setlinewidth stroke newpath 231.812366 243.451438 moveto 250.703798 240.657867 lineto 1.500000 setlinewidth stroke newpath 380.808612 476.262835 moveto 424.492554 472.903760 lineto 1.500000 setlinewidth stroke newpath 174.720731 76.019737 moveto 170.056191 87.892622 lineto 1.500000 setlinewidth stroke newpath 217.866308 66.243596 moveto 212.290311 77.220906 lineto 1.500000 setlinewidth stroke newpath 230.388600 244.866362 moveto 233.206521 228.671681 lineto 1.500000 setlinewidth stroke newpath 369.077836 203.834460 moveto 366.186141 225.031024 lineto 1.500000 setlinewidth stroke newpath 464.384146 178.965963 moveto 498.542915 175.531353 lineto 1.500000 setlinewidth stroke newpath 365.660804 502.993653 moveto 396.895522 502.302755 lineto 1.500000 setlinewidth stroke newpath 410.680304 226.870013 moveto 490.797513 217.919117 lineto 1.500000 setlinewidth stroke newpath 54.298768 391.031389 moveto 60.940456 385.504055 lineto 1.500000 setlinewidth stroke newpath 76.806900 321.360859 moveto 78.900908 311.276555 lineto 1.500000 setlinewidth stroke newpath 100.729051 468.628310 moveto 84.267199 470.335535 lineto 1.500000 setlinewidth stroke newpath 405.286079 55.793187 moveto 394.168044 62.269726 lineto 1.500000 setlinewidth stroke newpath 498.938042 216.253391 moveto 500.497341 242.706208 lineto 1.500000 setlinewidth stroke newpath 246.936403 465.747215 moveto 225.647021 467.848150 lineto 1.500000 setlinewidth stroke newpath 106.834003 254.695592 moveto 143.111350 251.232030 lineto 1.500000 setlinewidth stroke newpath 145.702630 153.582554 moveto 134.573226 150.628247 lineto 1.500000 setlinewidth stroke newpath 176.051898 179.895368 moveto 162.689009 169.115904 lineto 1.500000 setlinewidth stroke newpath 214.112891 250.069835 moveto 212.495319 257.755555 lineto 1.500000 setlinewidth stroke newpath 279.230909 230.119728 moveto 279.126898 257.624062 lineto 1.500000 setlinewidth stroke newpath 31.413079 460.544347 moveto 16.180654 489.170670 lineto 1.500000 setlinewidth stroke newpath 195.775680 246.157109 moveto 203.160950 245.669484 lineto 1.500000 setlinewidth stroke newpath 214.361376 466.240747 moveto 249.506845 462.674240 lineto 1.500000 setlinewidth stroke newpath 343.205783 206.095424 moveto 249.377596 213.906187 lineto 1.500000 setlinewidth stroke newpath 143.365348 245.965333 moveto 132.813805 239.774832 lineto 1.500000 setlinewidth stroke newpath 191.006334 44.356556 moveto 181.919833 75.138234 lineto 1.500000 setlinewidth stroke newpath 201.961217 254.896000 moveto 185.667701 248.761583 lineto 1.500000 setlinewidth stroke newpath 354.051180 256.267671 moveto 348.952971 271.649427 lineto 1.500000 setlinewidth stroke newpath 408.444666 28.826396 moveto 407.066795 55.200325 lineto 1.500000 setlinewidth stroke newpath 173.116727 162.697408 moveto 156.794171 160.832424 lineto 1.500000 setlinewidth stroke newpath 165.628222 165.116892 moveto 183.315601 172.145345 lineto 1.500000 setlinewidth stroke newpath 331.936485 44.273503 moveto 248.061683 57.214626 lineto 1.500000 setlinewidth stroke newpath 388.125273 487.630085 moveto 375.594290 488.303804 lineto 1.500000 setlinewidth stroke newpath 225.653682 486.290527 moveto 261.912485 485.398241 lineto 1.500000 setlinewidth stroke newpath 492.988107 213.389217 moveto 481.094611 191.805016 lineto 1.500000 setlinewidth stroke newpath 261.918245 479.246897 moveto 282.081662 476.902240 lineto 1.500000 setlinewidth stroke newpath 203.089889 75.113545 moveto 227.114248 1.479557 lineto 1.500000 setlinewidth stroke newpath 371.597054 216.889364 moveto 395.730266 229.930197 lineto 1.500000 setlinewidth stroke newpath 401.294654 246.295891 moveto 399.821100 233.822300 lineto 1.500000 setlinewidth stroke newpath 413.190261 231.239538 moveto 424.764846 236.815800 lineto 1.500000 setlinewidth stroke newpath 108.388710 70.790650 moveto 99.294816 72.042523 lineto 1.500000 setlinewidth stroke newpath 180.002423 58.955067 moveto 178.664124 27.655395 lineto 1.500000 setlinewidth stroke newpath 32.901339 225.637393 moveto 54.857931 223.166669 lineto 1.500000 setlinewidth stroke newpath 59.207593 340.687768 moveto 48.530556 337.511655 lineto 1.500000 setlinewidth stroke newpath 124.548783 146.458058 moveto 139.285399 115.624451 lineto 1.500000 setlinewidth stroke newpath 218.883099 11.217194 moveto 210.314543 37.926414 lineto 1.500000 setlinewidth stroke newpath 36.822152 501.901100 moveto 64.448679 499.884248 lineto 1.500000 setlinewidth stroke newpath 170.495828 270.135234 moveto 168.905550 250.063158 lineto 1.500000 setlinewidth stroke newpath 443.645673 118.447665 moveto 428.962451 105.430374 lineto 1.500000 setlinewidth stroke newpath 384.232856 59.106642 moveto 355.897007 41.718770 lineto 1.500000 setlinewidth stroke newpath 149.159805 242.090842 moveto 164.295102 246.640781 lineto 1.500000 setlinewidth stroke newpath 453.651684 142.364910 moveto 447.218659 129.338010 lineto 1.500000 setlinewidth stroke newpath 63.964265 275.172559 moveto 61.931657 257.618440 lineto 1.500000 setlinewidth stroke newpath 318.206578 235.095247 moveto 335.628712 233.930520 lineto 1.500000 setlinewidth stroke newpath 267.343844 234.062660 moveto 276.637094 238.164065 lineto 1.500000 setlinewidth stroke newpath 349.428930 498.177005 moveto 373.317285 495.843143 lineto 1.500000 setlinewidth stroke newpath 441.516447 50.765331 moveto 433.884283 39.605719 lineto 1.500000 setlinewidth stroke newpath 418.151797 502.435252 moveto 448.164219 501.676700 lineto 1.500000 setlinewidth stroke newpath 463.127329 510.624434 moveto 440.621989 510.729376 lineto 1.500000 setlinewidth stroke newpath 146.897513 479.205967 moveto 128.149236 480.481288 lineto 1.500000 setlinewidth stroke newpath 118.941685 218.385850 moveto 143.325568 232.272826 lineto 1.500000 setlinewidth stroke newpath 170.651802 2.552705 moveto 174.912861 77.806878 lineto 1.500000 setlinewidth stroke newpath 140.671704 378.782745 moveto 84.362063 381.054305 lineto 1.500000 setlinewidth stroke newpath 211.079091 484.980193 moveto 203.344104 488.158267 lineto 1.500000 setlinewidth stroke newpath 209.392900 435.803317 moveto 163.142120 437.023790 lineto 1.500000 setlinewidth stroke newpath 404.585196 2.459216 moveto 407.559390 28.655378 lineto 1.500000 setlinewidth stroke newpath 62.368900 313.966723 moveto 64.628628 332.594232 lineto 1.500000 setlinewidth stroke newpath 215.721371 77.420057 moveto 209.498834 87.699958 lineto 1.500000 setlinewidth stroke newpath 410.644966 491.822301 moveto 378.153907 493.272595 lineto 1.500000 setlinewidth stroke newpath 177.860484 278.822269 moveto 160.648302 275.019527 lineto 1.500000 setlinewidth stroke newpath 190.420268 216.455630 moveto 254.452186 211.037122 lineto 1.500000 setlinewidth stroke newpath 498.168996 16.524297 moveto 480.372643 21.768642 lineto 1.500000 setlinewidth stroke newpath 266.930447 493.816611 moveto 298.170971 492.362967 lineto 1.500000 setlinewidth stroke newpath 316.213806 351.760965 moveto 308.228518 363.942857 lineto 1.500000 setlinewidth stroke newpath 12.817908 230.823020 moveto 40.005127 242.783970 lineto 1.500000 setlinewidth stroke newpath 70.728690 490.169328 moveto 78.857900 471.153936 lineto 1.500000 setlinewidth stroke newpath 97.442107 282.753687 moveto 100.924050 267.409212 lineto 1.500000 setlinewidth stroke newpath 165.880858 483.435710 moveto 153.291019 481.528866 lineto 1.500000 setlinewidth stroke newpath 63.205654 456.388068 moveto 49.193511 457.282822 lineto 1.500000 setlinewidth stroke newpath 101.788326 267.290402 moveto 104.806543 255.233024 lineto 1.500000 setlinewidth stroke newpath 315.637928 503.099476 moveto 344.400633 502.315791 lineto 1.500000 setlinewidth stroke newpath 228.141109 405.670018 moveto 181.857650 407.037971 lineto 1.500000 setlinewidth stroke newpath 291.477010 256.406827 moveto 290.666502 246.271718 lineto 1.500000 setlinewidth stroke newpath 324.369299 487.544946 moveto 311.843805 488.436963 lineto 1.500000 setlinewidth stroke newpath 485.630433 497.833440 moveto 455.618242 498.615714 lineto 1.500000 setlinewidth stroke newpath 509.605902 280.612321 moveto 489.582630 278.315173 lineto 1.500000 setlinewidth stroke newpath 177.374015 246.772856 moveto 188.566004 249.673280 lineto 1.500000 setlinewidth stroke newpath 258.110982 429.580967 moveto 284.350636 430.101991 lineto 1.500000 setlinewidth stroke newpath 325.652519 404.818225 moveto 303.098778 405.476237 lineto 1.500000 setlinewidth stroke newpath 193.533012 58.870650 moveto 193.719718 76.381987 lineto 1.500000 setlinewidth stroke newpath 436.025527 37.643935 moveto 436.918346 18.758858 lineto 1.500000 setlinewidth stroke newpath 446.878057 504.291244 moveto 419.370360 504.493294 lineto 1.500000 setlinewidth stroke newpath 245.190088 214.459073 moveto 268.851598 232.077911 lineto 1.500000 setlinewidth stroke newpath 299.319077 402.058972 moveto 316.876687 402.566669 lineto 1.500000 setlinewidth stroke newpath 369.046130 152.142723 moveto 372.053369 142.297663 lineto 1.500000 setlinewidth stroke newpath 40.206787 248.000159 moveto 8.216876 239.767976 lineto 1.500000 setlinewidth stroke newpath 132.355040 238.055417 moveto 117.756181 229.504693 lineto 1.500000 setlinewidth stroke newpath 156.484047 164.078631 moveto 146.832148 156.154624 lineto 1.500000 setlinewidth stroke newpath 157.316073 146.123449 moveto 174.606623 160.131970 lineto 1.500000 setlinewidth stroke newpath 375.842982 253.017123 moveto 365.852756 250.478659 lineto 1.500000 setlinewidth stroke newpath 396.604513 218.873415 moveto 396.450694 245.129837 lineto 1.500000 setlinewidth stroke newpath 0.642291 486.567259 moveto 16.984944 485.097506 lineto 1.500000 setlinewidth stroke newpath 64.372230 406.062504 moveto 90.642325 405.829659 lineto 1.500000 setlinewidth stroke newpath 133.684762 401.087445 moveto 121.445276 430.466729 lineto 1.500000 setlinewidth stroke newpath 395.400452 61.633352 moveto 383.353525 59.839930 lineto 1.500000 setlinewidth stroke newpath 425.540448 397.294422 moveto 458.137088 398.564852 lineto 1.500000 setlinewidth stroke newpath 41.899709 246.310493 moveto 55.815547 251.640875 lineto 1.500000 setlinewidth stroke newpath 356.056772 231.336262 moveto 353.932967 207.664659 lineto 1.500000 setlinewidth stroke newpath 504.293748 248.853002 moveto 501.685848 258.485359 lineto 1.500000 setlinewidth stroke newpath 313.114186 448.499626 moveto 338.110365 448.808672 lineto 1.500000 setlinewidth stroke newpath 143.382025 233.091529 moveto 157.477006 241.245170 lineto 1.500000 setlinewidth stroke newpath 418.588857 19.149730 moveto 419.464219 13.688928 lineto 1.500000 setlinewidth stroke newpath 478.861252 190.380571 moveto 420.265876 171.159207 lineto 1.500000 setlinewidth stroke newpath 179.328823 403.391228 moveto 196.915613 404.451105 lineto 1.500000 setlinewidth stroke newpath 291.552933 239.575830 moveto 306.783146 246.574879 lineto 1.500000 setlinewidth stroke newpath 350.689819 477.683997 moveto 313.096307 479.545546 lineto 1.500000 setlinewidth stroke newpath 220.852517 260.097877 moveto 222.797642 276.414026 lineto 1.500000 setlinewidth stroke newpath 252.721943 236.866690 moveto 243.676709 229.451969 lineto 1.500000 setlinewidth stroke newpath 496.897039 503.081761 moveto 468.153644 504.468655 lineto 1.500000 setlinewidth stroke newpath 0.603673 493.558426 moveto 21.925325 492.122000 lineto 1.500000 setlinewidth stroke newpath 160.488509 97.275855 moveto 173.026956 92.374203 lineto 1.500000 setlinewidth stroke newpath 191.736754 256.336666 moveto 186.962945 273.552777 lineto 1.500000 setlinewidth stroke newpath 394.375509 505.221858 moveto 366.876270 505.366497 lineto 1.500000 setlinewidth stroke newpath 474.352938 492.203506 moveto 468.104026 492.285986 lineto 1.500000 setlinewidth stroke newpath 497.324137 244.417470 moveto 464.542267 236.895978 lineto 1.500000 setlinewidth stroke newpath 63.136909 448.678260 moveto 49.437102 447.849021 lineto 1.500000 setlinewidth stroke newpath 170.673457 81.707842 moveto 144.255466 85.553946 lineto 1.500000 setlinewidth stroke newpath 171.890684 201.236979 moveto 130.596007 201.819426 lineto 1.500000 setlinewidth stroke newpath 244.343039 494.721458 moveto 226.755361 496.114422 lineto 1.500000 setlinewidth stroke newpath 404.251084 443.959473 moveto 416.874383 445.131643 lineto 1.500000 setlinewidth stroke newpath 194.221054 300.103838 moveto 211.960221 299.020659 lineto 1.500000 setlinewidth stroke newpath 45.699621 364.161597 moveto 53.413071 344.742905 lineto 1.500000 setlinewidth stroke newpath 73.381698 277.590069 moveto 70.998202 260.074216 lineto 1.500000 setlinewidth stroke newpath 249.212802 226.752358 moveto 266.704842 234.270878 lineto 1.500000 setlinewidth stroke newpath 492.479027 255.292628 moveto 468.004187 244.140131 lineto 1.500000 setlinewidth stroke newpath 199.805568 71.339596 moveto 194.148442 2.540845 lineto 1.500000 setlinewidth stroke newpath 216.883346 367.185936 moveto 256.882690 367.023953 lineto 1.500000 setlinewidth stroke newpath 287.456984 228.870222 moveto 287.260252 256.377755 lineto 1.500000 setlinewidth stroke newpath 421.914200 171.207441 moveto 380.582602 172.704230 lineto 1.500000 setlinewidth stroke newpath 509.588612 15.222684 moveto 499.253867 16.860770 lineto 1.500000 setlinewidth stroke newpath 183.988456 88.470159 moveto 190.104550 63.746253 lineto 1.500000 setlinewidth stroke newpath 270.632849 500.721677 moveto 243.137606 501.083351 lineto 1.500000 setlinewidth stroke newpath 475.514310 422.411456 moveto 490.609137 424.023538 lineto 1.500000 setlinewidth stroke newpath 104.477450 225.955857 moveto 90.637697 222.573052 lineto 1.500000 setlinewidth stroke newpath 179.041478 275.028866 moveto 176.679817 252.514355 lineto 1.500000 setlinewidth stroke newpath 187.496702 2.514230 moveto 190.240894 17.916152 lineto 1.500000 setlinewidth stroke newpath 210.029141 257.598507 moveto 209.622752 247.564340 lineto 1.500000 setlinewidth stroke newpath 69.345239 250.121841 moveto 67.742726 265.217118 lineto 1.500000 setlinewidth stroke newpath 459.318666 243.342481 moveto 389.308745 250.748706 lineto 1.500000 setlinewidth stroke newpath 1.712044 94.377018 moveto 37.547416 16.780986 lineto 1.500000 setlinewidth stroke newpath 108.734153 216.138878 moveto 105.447311 225.059530 lineto 1.500000 setlinewidth stroke newpath 469.396151 501.812971 moveto 499.446799 500.361751 lineto 1.500000 setlinewidth stroke newpath 8.200544 499.411057 moveto 24.479558 497.116939 lineto 1.500000 setlinewidth stroke newpath 212.970213 275.433397 moveto 222.465228 280.199035 lineto 1.500000 setlinewidth stroke newpath 335.670448 233.415209 moveto 345.637479 232.841970 lineto 1.500000 setlinewidth stroke newpath 340.712938 305.919910 moveto 329.402188 303.734299 lineto 1.500000 setlinewidth stroke newpath 417.957444 103.380125 moveto 403.763303 72.333179 lineto 1.500000 setlinewidth stroke newpath 369.375516 498.881239 moveto 350.650317 500.430910 lineto 1.500000 setlinewidth stroke newpath 464.433130 237.270453 moveto 428.173643 239.624309 lineto 1.500000 setlinewidth stroke newpath 177.717277 17.603796 moveto 177.339108 2.581848 lineto 1.500000 setlinewidth stroke newpath 259.385357 487.817950 moveto 246.854365 488.490580 lineto 1.500000 setlinewidth stroke newpath 245.656558 267.906795 moveto 279.403275 264.127475 lineto 1.500000 setlinewidth stroke newpath 426.048239 13.751602 moveto 427.810557 37.648189 lineto 1.500000 setlinewidth stroke newpath 148.284290 87.591424 moveto 169.336971 84.834587 lineto 1.500000 setlinewidth stroke newpath 182.192929 205.231808 moveto 171.942808 202.381179 lineto 1.500000 setlinewidth stroke newpath 344.385814 247.787676 moveto 311.780612 249.955101 lineto 1.500000 setlinewidth stroke newpath 359.787326 212.969616 moveto 362.871845 198.090792 lineto 1.500000 setlinewidth stroke newpath 146.883274 266.644933 moveto 124.369671 266.561402 lineto 1.500000 setlinewidth stroke newpath 388.951881 85.992311 moveto 391.187592 76.217771 lineto 1.500000 setlinewidth stroke newpath 190.893366 27.611989 moveto 191.742724 45.131413 lineto 1.500000 setlinewidth stroke newpath 422.874357 239.495164 moveto 412.523768 243.614176 lineto 1.500000 setlinewidth stroke newpath 364.357656 427.034490 moveto 390.628196 427.273106 lineto 1.500000 setlinewidth stroke newpath 494.364547 426.534157 moveto 478.102594 425.466160 lineto 1.500000 setlinewidth stroke newpath 78.430220 227.594400 moveto 81.308799 256.306445 lineto 1.500000 setlinewidth stroke newpath 85.008580 273.805163 moveto 83.632294 261.319083 lineto 1.500000 setlinewidth stroke newpath 203.306343 279.487717 moveto 198.022776 277.984239 lineto 1.500000 setlinewidth stroke newpath 281.907316 504.213553 moveto 296.890121 502.783415 lineto 1.500000 setlinewidth stroke newpath 312.922246 263.088601 moveto 333.972673 272.294927 lineto 1.500000 setlinewidth stroke newpath 370.090047 201.539851 moveto 376.551673 173.512277 lineto 1.500000 setlinewidth stroke newpath 499.133034 174.689873 moveto 509.634463 173.181982 lineto 1.500000 setlinewidth stroke newpath 55.642851 274.044041 moveto 29.358734 273.609981 lineto 1.500000 setlinewidth stroke newpath 69.185803 306.593924 moveto 80.727335 308.080467 lineto 1.500000 setlinewidth stroke newpath 204.774440 2.381307 moveto 197.255167 28.625785 lineto 1.500000 setlinewidth stroke newpath 427.713383 106.260662 moveto 418.073618 102.766763 lineto 1.500000 setlinewidth stroke newpath 438.077344 458.183529 moveto 449.457802 459.154564 lineto 1.500000 setlinewidth stroke newpath 123.302102 266.590413 moveto 102.845546 269.062683 lineto 1.500000 setlinewidth stroke newpath 167.238904 270.513137 moveto 150.411581 267.613546 lineto 1.500000 setlinewidth stroke newpath 258.169773 262.491199 moveto 245.800027 258.351949 lineto 1.500000 setlinewidth stroke newpath 456.945869 54.161963 moveto 471.021505 36.927921 lineto 1.500000 setlinewidth stroke newpath 56.844474 350.328411 moveto 65.643100 350.513207 lineto 1.500000 setlinewidth stroke newpath 159.436757 275.829162 moveto 109.383243 280.218991 lineto 1.500000 setlinewidth stroke newpath 425.637193 248.994426 moveto 454.343206 246.063591 lineto 1.500000 setlinewidth stroke newpath 385.668650 430.584809 moveto 365.591813 429.475775 lineto 1.500000 setlinewidth stroke newpath 417.230416 40.283794 moveto 416.084912 24.813280 lineto 1.500000 setlinewidth stroke newpath 490.527963 423.385469 moveto 504.366390 424.053391 lineto 1.500000 setlinewidth stroke newpath 493.134436 180.123594 moveto 495.794452 197.972324 lineto 1.500000 setlinewidth stroke newpath 211.898992 307.313993 moveto 191.848205 307.826297 lineto 1.500000 setlinewidth stroke newpath 246.622792 258.989598 moveto 229.284125 257.317084 lineto 1.500000 setlinewidth stroke newpath 347.599592 202.079236 moveto 354.590617 195.348971 lineto 1.500000 setlinewidth stroke newpath 53.123525 438.921151 moveto 63.153233 439.241756 lineto 1.500000 setlinewidth stroke newpath 61.499662 312.051653 moveto 69.343177 306.916951 lineto 1.500000 setlinewidth stroke newpath 416.875000 511.375000 moveto 394.375000 511.375000 lineto 1.500000 setlinewidth stroke newpath 19.426941 495.008433 moveto 3.096670 495.756783 lineto 1.500000 setlinewidth stroke newpath 29.855908 471.615577 moveto 34.857954 461.616600 lineto 1.500000 setlinewidth stroke newpath 171.453769 112.863025 moveto 164.820107 101.123483 lineto 1.500000 setlinewidth stroke newpath 496.943482 303.458804 moveto 484.323284 304.495323 lineto 1.500000 setlinewidth stroke newpath 54.722254 289.737220 moveto 44.645206 287.600610 lineto 1.500000 setlinewidth stroke newpath 79.051400 256.409225 moveto 76.002901 227.585032 lineto 1.500000 setlinewidth stroke newpath 437.492592 17.685435 moveto 437.982716 2.539496 lineto 1.500000 setlinewidth stroke newpath 172.804972 251.277442 moveto 174.791335 270.212455 lineto 1.500000 setlinewidth stroke newpath 242.030241 268.996670 moveto 231.073519 282.976527 lineto 1.500000 setlinewidth stroke newpath 110.625719 76.349323 moveto 100.598579 76.068551 lineto 1.500000 setlinewidth stroke newpath 116.890199 510.629510 moveto 96.870711 511.232627 lineto 1.500000 setlinewidth stroke newpath 369.318245 356.419819 moveto 394.389408 356.978960 lineto 1.500000 setlinewidth stroke newpath 79.610425 280.025869 moveto 74.334818 279.105269 lineto 1.500000 setlinewidth stroke newpath 80.616631 377.905970 moveto 105.631670 378.651083 lineto 1.500000 setlinewidth stroke newpath 104.639413 253.956704 moveto 109.658834 237.712705 lineto 1.500000 setlinewidth stroke newpath 199.320274 267.724377 moveto 207.618770 272.294267 lineto 1.500000 setlinewidth stroke newpath 58.622719 250.163723 moveto 59.848591 273.979306 lineto 1.500000 setlinewidth stroke newpath 232.751653 269.327457 moveto 226.342556 281.745344 lineto 1.500000 setlinewidth stroke newpath 432.407320 17.689379 moveto 431.052533 2.586648 lineto 1.500000 setlinewidth stroke newpath 295.627701 495.189309 moveto 271.867110 496.187113 lineto 1.500000 setlinewidth stroke newpath 323.690080 321.531958 moveto 315.739168 350.156712 lineto 1.500000 setlinewidth stroke newpath 217.916823 247.651761 moveto 219.517891 260.106631 lineto 1.500000 setlinewidth stroke newpath 253.437435 396.474529 moveto 261.950504 369.750854 lineto 1.500000 setlinewidth stroke newpath 461.859077 33.774766 moveto 438.112621 37.547077 lineto 1.500000 setlinewidth stroke newpath 166.063226 240.129765 moveto 166.232038 268.886112 lineto 1.500000 setlinewidth stroke newpath 426.966803 2.578917 moveto 427.314256 12.695774 lineto 1.500000 setlinewidth stroke newpath 385.671197 85.067623 moveto 376.698994 77.843598 lineto 1.500000 setlinewidth stroke newpath 416.949825 476.532897 moveto 383.096147 478.332098 lineto 1.500000 setlinewidth stroke newpath 506.875205 510.655385 moveto 489.374850 510.650397 lineto 1.500000 setlinewidth stroke newpath 138.167688 114.555552 moveto 146.521022 98.688644 lineto 1.500000 setlinewidth stroke newpath 167.039436 278.203663 moveto 152.673456 282.285985 lineto 1.500000 setlinewidth stroke newpath 177.826016 252.220027 moveto 188.285695 255.920824 lineto 1.500000 setlinewidth stroke newpath 249.606370 264.813188 moveto 235.482304 268.296377 lineto 1.500000 setlinewidth stroke newpath 175.035574 90.418188 moveto 180.493365 78.121372 lineto 1.500000 setlinewidth stroke newpath 197.982750 404.062905 moveto 208.299929 402.681087 lineto 1.500000 setlinewidth stroke newpath 255.627550 224.563598 moveto 243.122130 224.506796 lineto 1.500000 setlinewidth stroke newpath 17.596374 21.109543 moveto 0.035885 56.079167 lineto 1.500000 setlinewidth stroke newpath 214.270946 324.683654 moveto 203.054972 327.327976 lineto 1.500000 setlinewidth stroke newpath 243.129840 499.039200 moveto 269.393866 498.265074 lineto 1.500000 setlinewidth stroke newpath 6.640064 231.073849 moveto 1.717464 255.346556 lineto 1.500000 setlinewidth stroke newpath 119.473090 428.917258 moveto 128.760061 407.360080 lineto 1.500000 setlinewidth stroke newpath 135.706954 237.363529 moveto 148.159036 241.266410 lineto 1.500000 setlinewidth stroke newpath 195.619813 267.290286 moveto 193.503648 275.225972 lineto 1.500000 setlinewidth stroke newpath 29.452973 511.045966 moveto 48.174606 509.460907 lineto 1.500000 setlinewidth stroke newpath 74.458131 312.613017 moveto 76.450668 326.436165 lineto 1.500000 setlinewidth stroke newpath 106.904335 455.791276 moveto 73.109775 457.279212 lineto 1.500000 setlinewidth stroke newpath 283.126253 432.496986 moveto 260.616176 432.276698 lineto 1.500000 setlinewidth stroke newpath 391.342230 75.805526 moveto 394.950323 64.510196 lineto 1.500000 setlinewidth stroke newpath 394.391355 510.449842 moveto 416.897240 509.316741 lineto 1.500000 setlinewidth stroke newpath -0.248520 68.453830 moveto 23.809101 18.557532 lineto 1.500000 setlinewidth stroke newpath 378.759178 175.016859 moveto 373.248742 206.396730 lineto 1.500000 setlinewidth stroke newpath 412.871578 23.902590 moveto 410.541294 2.498027 lineto 1.500000 setlinewidth stroke newpath 201.474836 489.948532 moveto 191.797914 511.892242 lineto 1.500000 setlinewidth stroke newpath 204.483029 226.357420 moveto 206.990027 241.763111 lineto 1.500000 setlinewidth stroke newpath 345.693276 230.136857 moveto 345.856182 246.372680 lineto 1.500000 setlinewidth stroke newpath 465.697913 246.239095 moveto 483.973291 256.043844 lineto 1.500000 setlinewidth stroke newpath 46.921997 342.649468 moveto 28.075583 378.849272 lineto 1.500000 setlinewidth stroke newpath 179.521575 76.381511 moveto 180.246940 60.052678 lineto 1.500000 setlinewidth stroke newpath 330.738863 276.186912 moveto 320.098128 269.745330 lineto 1.500000 setlinewidth stroke newpath 509.383651 484.798993 moveto 490.613698 484.300909 lineto 1.500000 setlinewidth stroke newpath 42.331436 374.741147 moveto 26.273530 407.938699 lineto 1.500000 setlinewidth stroke newpath 77.786746 326.414167 moveto 78.803047 335.191227 lineto 1.500000 setlinewidth stroke newpath -1.017931 19.178092 moveto 55.054891 6.377623 lineto 1.500000 setlinewidth stroke newpath 204.870715 248.780768 moveto 207.065469 260.326410 lineto 1.500000 setlinewidth stroke newpath 363.247960 317.708129 moveto 323.910270 321.336402 lineto 1.500000 setlinewidth stroke newpath 415.214637 5.119290 moveto 414.970917 22.633293 lineto 1.500000 setlinewidth stroke newpath 150.624834 469.117989 moveto 131.874843 469.105198 lineto 1.500000 setlinewidth stroke newpath 196.891135 489.434572 moveto 164.379678 488.674805 lineto 1.500000 setlinewidth stroke newpath 216.948461 235.113935 moveto 218.633148 246.298459 lineto 1.500000 setlinewidth stroke newpath 43.139919 494.147224 moveto 70.694170 492.637133 lineto 1.500000 setlinewidth stroke newpath 54.500439 7.100052 moveto 92.007923 4.717886 lineto 1.500000 setlinewidth stroke newpath 439.390016 508.576744 moveto 464.383794 508.182417 lineto 1.500000 setlinewidth stroke newpath 125.659163 504.607463 moveto 143.179351 503.790296 lineto 1.500000 setlinewidth stroke newpath 225.621919 452.237882 moveto 253.126032 452.336091 lineto 1.500000 setlinewidth stroke newpath 197.996882 285.486545 moveto 182.309119 279.927392 lineto 1.500000 setlinewidth stroke newpath 143.149516 235.659072 moveto 130.578648 235.228600 lineto 1.500000 setlinewidth stroke newpath 232.400961 221.504400 moveto 227.547257 241.232861 lineto 1.500000 setlinewidth stroke newpath 34.444759 253.263073 moveto 0.553211 256.968362 lineto 1.500000 setlinewidth stroke newpath 49.311032 362.865584 moveto 64.251858 366.838138 lineto 1.500000 setlinewidth stroke newpath 190.617635 274.169499 moveto 192.433523 266.507367 lineto 1.500000 setlinewidth stroke newpath 88.443410 255.204414 moveto 85.877427 225.103482 lineto 1.500000 setlinewidth stroke newpath 78.121460 502.687185 moveto 101.874659 502.751273 lineto 1.500000 setlinewidth stroke newpath 131.764034 145.314975 moveto 151.935545 143.203364 lineto 1.500000 setlinewidth stroke newpath 218.102409 468.054805 moveto 205.571327 467.396158 lineto 1.500000 setlinewidth stroke newpath 240.986370 32.387699 moveto 229.944108 15.572120 lineto 1.500000 setlinewidth stroke newpath 314.310736 346.358564 moveto 320.918982 320.519873 lineto 1.500000 setlinewidth stroke newpath 20.697483 87.858630 moveto 5.245725 92.652511 lineto 1.500000 setlinewidth stroke newpath 278.052957 463.177725 moveto 289.435435 464.661328 lineto 1.500000 setlinewidth stroke newpath 17.287331 482.828621 moveto 28.670788 459.777239 lineto 1.500000 setlinewidth stroke newpath 358.692989 230.119042 moveto 358.876824 247.643339 lineto 1.500000 setlinewidth stroke newpath 376.749297 257.783779 moveto 369.718519 266.647483 lineto 1.500000 setlinewidth stroke newpath 490.615544 481.975720 moveto 509.380571 482.271100 lineto 1.500000 setlinewidth stroke newpath 71.932595 455.019037 moveto 105.722813 453.317922 lineto 1.500000 setlinewidth stroke newpath 226.745906 216.350284 moveto 222.457824 238.747264 lineto 1.500000 setlinewidth stroke newpath 316.819659 511.009531 moveto 329.594580 509.075085 lineto 1.500000 setlinewidth stroke newpath 410.987995 59.840873 moveto 414.125776 50.045168 lineto 1.500000 setlinewidth stroke newpath 66.893967 495.566878 moveto 44.381789 496.533158 lineto 1.500000 setlinewidth stroke newpath 106.850590 378.548894 moveto 131.897388 376.674102 lineto 1.500000 setlinewidth stroke newpath 433.926168 2.597891 moveto 434.519060 20.120126 lineto 1.500000 setlinewidth stroke newpath 26.870479 459.306568 moveto 0.610265 459.031443 lineto 1.500000 setlinewidth stroke newpath 81.974765 340.078169 moveto 80.545919 375.172673 lineto 1.500000 setlinewidth stroke newpath 344.446768 207.615931 moveto 347.129112 228.842889 lineto 1.500000 setlinewidth stroke newpath 351.491639 239.995757 moveto 350.387079 253.955083 lineto 1.500000 setlinewidth stroke newpath 437.184643 66.759676 moveto 430.949735 71.778426 lineto 1.500000 setlinewidth stroke newpath 88.162071 225.121680 moveto 91.523977 262.656440 lineto 1.500000 setlinewidth stroke newpath 249.364557 455.401768 moveto 228.097670 454.599335 lineto 1.500000 setlinewidth stroke newpath 81.457615 255.073485 moveto 79.596517 270.152341 lineto 1.500000 setlinewidth stroke newpath 464.377050 491.567023 moveto 439.366557 491.833965 lineto 1.500000 setlinewidth stroke newpath 68.015436 266.166912 moveto 69.902107 276.506902 lineto 1.500000 setlinewidth stroke newpath 99.401555 76.554838 moveto 21.748923 88.021176 lineto 1.500000 setlinewidth stroke newpath 81.882830 498.359348 moveto 108.143172 498.079363 lineto 1.500000 setlinewidth stroke newpath 349.403585 510.554241 moveto 370.725512 509.134340 lineto 1.500000 setlinewidth stroke newpath 24.922470 405.371612 moveto 39.412226 373.204840 lineto 1.500000 setlinewidth stroke newpath 113.923185 227.827352 moveto 107.590600 252.806416 lineto 1.500000 setlinewidth stroke newpath 203.108476 480.587563 moveto 178.095742 479.694048 lineto 1.500000 setlinewidth stroke newpath 314.397133 466.140291 moveto 279.386521 466.903514 lineto 1.500000 setlinewidth stroke newpath 33.049730 431.898817 moveto 44.421636 406.395795 lineto 1.500000 setlinewidth stroke newpath 200.495338 32.583806 moveto 210.298553 1.727036 lineto 1.500000 setlinewidth stroke newpath 476.599453 254.773100 moveto 467.109278 251.861410 lineto 1.500000 setlinewidth stroke newpath 61.890042 510.368064 moveto 81.967861 509.125567 lineto 1.500000 setlinewidth stroke newpath 100.483780 4.841632 moveto 128.094948 2.298696 lineto 1.500000 setlinewidth stroke newpath 191.725361 290.391818 moveto 178.598829 283.030123 lineto 1.500000 setlinewidth stroke newpath 478.390870 34.072970 moveto 463.460196 54.124591 lineto 1.500000 setlinewidth stroke newpath 98.128854 509.015354 moveto 116.899024 508.500003 lineto 1.500000 setlinewidth stroke newpath 135.599710 465.151390 moveto 136.489318 423.866689 lineto 1.500000 setlinewidth stroke newpath 15.642237 504.080810 moveto 0.642758 505.337033 lineto 1.500000 setlinewidth stroke newpath 438.063859 489.027180 moveto 454.391825 489.739149 lineto 1.500000 setlinewidth stroke newpath 251.512312 44.145725 moveto 243.435976 33.325925 lineto 1.500000 setlinewidth stroke newpath 354.359373 313.690213 moveto 325.603602 316.121960 lineto 1.500000 setlinewidth stroke newpath 146.851175 381.523870 moveto 156.991555 383.146689 lineto 1.500000 setlinewidth stroke newpath 215.181070 242.669939 moveto 212.901126 220.147663 lineto 1.500000 setlinewidth stroke newpath 49.145863 403.108711 moveto 33.819750 435.454190 lineto 1.500000 setlinewidth stroke newpath 73.802769 293.921216 moveto 54.884582 289.669587 lineto 1.500000 setlinewidth stroke newpath 92.880535 5.458703 moveto 99.469806 4.715108 lineto 1.500000 setlinewidth stroke newpath 195.843903 116.607355 moveto 186.975019 103.805708 lineto 1.500000 setlinewidth stroke newpath 208.110989 90.312295 moveto 206.999992 97.643941 lineto 1.500000 setlinewidth stroke newpath 215.081436 218.782224 moveto 217.060373 233.850655 lineto 1.500000 setlinewidth stroke newpath 238.645445 34.571847 moveto 250.890490 46.092825 lineto 1.500000 setlinewidth stroke newpath 125.886292 82.012629 moveto 111.998036 76.086651 lineto 1.500000 setlinewidth stroke newpath 156.250987 112.337115 moveto 182.408485 129.302462 lineto 1.500000 setlinewidth stroke newpath 213.358454 266.435357 moveto 217.228499 251.466393 lineto 1.500000 setlinewidth stroke newpath 335.633936 268.853391 moveto 320.617411 262.643351 lineto 1.500000 setlinewidth stroke newpath 509.646196 205.110532 moveto 508.246265 178.868531 lineto 1.500000 setlinewidth stroke newpath 379.609699 392.678014 moveto 386.689884 361.333186 lineto 1.500000 setlinewidth stroke newpath 130.616060 466.579965 moveto 149.384874 467.398631 lineto 1.500000 setlinewidth stroke newpath 75.669187 225.700454 moveto 31.889371 229.062155 lineto 1.500000 setlinewidth stroke newpath 104.375755 500.436659 moveto 81.875887 500.491169 lineto 1.500000 setlinewidth stroke newpath 126.788004 151.921693 moveto 108.220995 191.420125 lineto 1.500000 setlinewidth stroke newpath 504.795826 178.857204 moveto 505.958888 206.360881 lineto 1.500000 setlinewidth stroke newpath 389.483639 361.403329 moveto 380.301301 396.616546 lineto 1.500000 setlinewidth stroke newpath 478.151673 473.385197 moveto 456.883997 474.131423 lineto 1.500000 setlinewidth stroke newpath 204.169062 243.897846 moveto 202.647020 230.178026 lineto 1.500000 setlinewidth stroke newpath 374.379554 488.758236 moveto 355.609353 488.026235 lineto 1.500000 setlinewidth stroke newpath 487.734453 266.892262 moveto 477.353966 254.716651 lineto 1.500000 setlinewidth stroke newpath 355.514487 198.885336 moveto 357.622289 221.422017 lineto 1.500000 setlinewidth stroke newpath 197.200289 275.495352 moveto 198.723651 269.015743 lineto 1.500000 setlinewidth stroke newpath 244.348775 478.315737 moveto 264.362011 478.586179 lineto 1.500000 setlinewidth stroke newpath 218.280509 233.920370 moveto 223.377914 216.448789 lineto 1.500000 setlinewidth stroke newpath 445.615410 38.816738 moveto 459.403344 36.547196 lineto 1.500000 setlinewidth stroke newpath 230.665479 406.386424 moveto 224.741854 427.375758 lineto 1.500000 setlinewidth stroke newpath 222.111645 427.693729 moveto 227.954631 407.575519 lineto 1.500000 setlinewidth stroke newpath 376.870531 490.213768 moveto 390.648540 490.907460 lineto 1.500000 setlinewidth stroke newpath 385.960425 259.057761 moveto 378.125984 266.376054 lineto 1.500000 setlinewidth stroke newpath 21.845994 490.112309 moveto 29.477701 472.669935 lineto 1.500000 setlinewidth stroke newpath 406.917985 246.767564 moveto 453.161029 241.704039 lineto 1.500000 setlinewidth stroke newpath 29.751528 371.550149 moveto 44.848539 339.095276 lineto 1.500000 setlinewidth stroke newpath 116.053806 484.076668 moveto 107.955800 501.295425 lineto 1.500000 setlinewidth stroke newpath 175.273688 460.129827 moveto 175.411296 470.145111 lineto 1.500000 setlinewidth stroke newpath 344.329038 231.490412 moveto 342.311559 208.836122 lineto 1.500000 setlinewidth stroke newpath 243.136021 488.549219 moveto 226.904595 488.000139 lineto 1.500000 setlinewidth stroke newpath 271.875366 480.780737 moveto 244.374606 480.763776 lineto 1.500000 setlinewidth stroke newpath 218.119733 493.781661 moveto 231.896399 493.004193 lineto 1.500000 setlinewidth stroke newpath 429.437199 327.531663 moveto 405.621630 328.812330 lineto 1.500000 setlinewidth stroke newpath 145.427530 498.802800 moveto 150.304233 485.464749 lineto 1.500000 setlinewidth stroke newpath 175.597522 476.742610 moveto 196.915285 478.336058 lineto 1.500000 setlinewidth stroke newpath 339.001021 282.017786 moveto 348.645421 287.628984 lineto 1.500000 setlinewidth stroke newpath 141.771478 118.744745 moveto 149.412366 112.672015 lineto 1.500000 setlinewidth stroke newpath 193.014210 505.082497 moveto 198.832256 489.916786 lineto 1.500000 setlinewidth stroke newpath 280.703476 506.688648 moveto 269.323882 505.734924 lineto 1.500000 setlinewidth stroke newpath 405.622508 116.275995 moveto 381.856103 116.874098 lineto 1.500000 setlinewidth stroke newpath 494.459293 309.146687 moveto 483.078379 308.166094 lineto 1.500000 setlinewidth stroke newpath 254.506291 53.486858 moveto 335.588474 41.135226 lineto 1.500000 setlinewidth stroke newpath 44.356550 291.454709 moveto 65.899047 296.441030 lineto 1.500000 setlinewidth stroke newpath 271.882878 340.353172 moveto 260.603166 340.742641 lineto 1.500000 setlinewidth stroke newpath 499.506555 262.536219 moveto 505.128391 270.866565 lineto 1.500000 setlinewidth stroke newpath 346.922747 58.105622 moveto 333.184158 59.470479 lineto 1.500000 setlinewidth stroke newpath 221.533595 61.674267 moveto 234.196227 57.127158 lineto 1.500000 setlinewidth stroke newpath 464.546398 437.658489 moveto 470.657479 406.381346 lineto 1.500000 setlinewidth stroke newpath 63.079694 299.008414 moveto 44.745998 292.782507 lineto 1.500000 setlinewidth stroke newpath 72.985402 437.613582 moveto 71.859897 451.373765 lineto 1.500000 setlinewidth stroke newpath 150.526733 450.172224 moveto 152.323880 406.342152 lineto 1.500000 setlinewidth stroke newpath 183.135132 140.330825 moveto 154.393250 141.745728 lineto 1.500000 setlinewidth stroke newpath 472.121948 410.096897 moveto 473.120947 418.875461 lineto 1.500000 setlinewidth stroke newpath 55.649919 379.917821 moveto 42.095993 378.287613 lineto 1.500000 setlinewidth stroke newpath 150.568268 154.690730 moveto 163.179633 153.043199 lineto 1.500000 setlinewidth stroke newpath 182.522431 134.146577 moveto 155.343194 116.161829 lineto 1.500000 setlinewidth stroke newpath 207.751870 462.649496 moveto 208.450701 437.634099 lineto 1.500000 setlinewidth stroke newpath 268.793362 491.283017 moveto 270.173864 482.553655 lineto 1.500000 setlinewidth stroke newpath 475.649150 374.394329 moveto 456.881606 375.267065 lineto 1.500000 setlinewidth stroke newpath 131.971927 101.223144 moveto 120.255824 93.745002 lineto 1.500000 setlinewidth stroke newpath 412.722670 114.162661 moveto 393.960486 87.921372 lineto 1.500000 setlinewidth stroke newpath 111.804929 278.066318 moveto 136.833635 275.897615 lineto 1.500000 setlinewidth stroke newpath 425.522384 466.355541 moveto 428.855941 448.776569 lineto 1.500000 setlinewidth stroke newpath 18.253278 199.921141 moveto 8.099398 201.166207 lineto 1.500000 setlinewidth stroke newpath 216.799712 327.622556 moveto 216.872540 362.625005 lineto 1.500000 setlinewidth stroke newpath 403.973322 93.705008 moveto 415.556680 111.419674 lineto 1.500000 setlinewidth stroke newpath 149.382313 272.697045 moveto 110.650752 276.628691 lineto 1.500000 setlinewidth stroke newpath 96.167759 246.590412 moveto 103.188670 228.900270 lineto 1.500000 setlinewidth stroke newpath 117.482784 475.345485 moveto 119.273006 460.261247 lineto 1.500000 setlinewidth stroke newpath 322.862184 420.054314 moveto 326.563824 406.291307 lineto 1.500000 setlinewidth stroke newpath 180.250278 475.185940 moveto 181.561488 456.353172 lineto 1.500000 setlinewidth stroke newpath 493.153764 15.288138 moveto 509.555077 12.396339 lineto 1.500000 setlinewidth stroke newpath 441.870766 213.800501 moveto 414.317683 215.366578 lineto 1.500000 setlinewidth stroke newpath 224.801459 468.873266 moveto 224.862454 483.873018 lineto 1.500000 setlinewidth stroke newpath 277.507984 446.602379 moveto 282.056461 433.940184 lineto 1.500000 setlinewidth stroke newpath 492.744526 443.805967 moveto 495.459041 428.844889 lineto 1.500000 setlinewidth stroke newpath 30.611571 228.762231 moveto 16.907058 230.394208 lineto 1.500000 setlinewidth stroke newpath 73.839870 392.641688 moveto 74.598802 360.130224 lineto 1.500000 setlinewidth stroke newpath 145.513832 427.618603 moveto 144.286818 448.941855 lineto 1.500000 setlinewidth stroke newpath 216.981275 491.533296 moveto 218.310259 480.146622 lineto 1.500000 setlinewidth stroke newpath 31.953778 198.553249 moveto 19.437840 199.615449 lineto 1.500000 setlinewidth stroke newpath 151.772195 487.587775 moveto 147.191146 500.239473 lineto 1.500000 setlinewidth stroke newpath 329.144267 406.304761 moveto 325.343730 418.789377 lineto 1.500000 setlinewidth stroke newpath 500.253667 462.558605 moveto 503.579794 443.956318 lineto 1.500000 setlinewidth stroke newpath 76.140426 453.112282 moveto 80.109393 438.732685 lineto 1.500000 setlinewidth stroke newpath 224.247919 498.839290 moveto 220.718025 511.401140 lineto 1.500000 setlinewidth stroke newpath 31.900434 282.897521 moveto 18.153512 284.180500 lineto 1.500000 setlinewidth stroke newpath 69.442058 431.385005 moveto 72.625028 410.050408 lineto 1.500000 setlinewidth stroke newpath 119.084192 483.856904 moveto 117.994595 501.366885 lineto 1.500000 setlinewidth stroke newpath 348.145999 384.354160 moveto 333.120077 385.012661 lineto 1.500000 setlinewidth stroke newpath 110.548286 288.724165 moveto 99.589891 294.297521 lineto 1.500000 setlinewidth stroke newpath 429.400356 334.232299 moveto 408.080312 335.745290 lineto 1.500000 setlinewidth stroke newpath 478.115372 379.939294 moveto 456.793071 381.044802 lineto 1.500000 setlinewidth stroke newpath 480.739645 320.152003 moveto 474.487585 346.695938 lineto 1.500000 setlinewidth stroke newpath 4.409934 205.359695 moveto 13.152302 204.058425 lineto 1.500000 setlinewidth stroke newpath 211.894676 317.872645 moveto 195.549228 319.171308 lineto 1.500000 setlinewidth stroke newpath 271.891380 346.830998 moveto 255.617477 347.415560 lineto 1.500000 setlinewidth stroke newpath 366.247951 321.328361 moveto 368.495420 351.347267 lineto 1.500000 setlinewidth stroke newpath 469.429091 210.790721 moveto 445.633060 212.724200 lineto 1.500000 setlinewidth stroke newpath 1.602069 455.745289 moveto 8.281317 445.224237 lineto 1.500000 setlinewidth stroke newpath 70.390036 403.796528 moveto 74.146531 392.548697 lineto 1.500000 setlinewidth stroke newpath 231.366519 450.124667 moveto 231.347967 408.875237 lineto 1.500000 setlinewidth stroke newpath 369.374379 75.636368 moveto 363.922446 66.414551 lineto 1.500000 setlinewidth stroke newpath 224.393459 386.657740 moveto 210.620555 387.556908 lineto 1.500000 setlinewidth stroke newpath 473.285143 343.906707 moveto 477.951555 320.338151 lineto 1.500000 setlinewidth stroke newpath 141.890153 275.335377 moveto 166.850691 273.537504 lineto 1.500000 setlinewidth stroke newpath 468.666007 256.601586 moveto 461.254722 252.683764 lineto 1.500000 setlinewidth stroke newpath 130.698192 357.106773 moveto 115.599192 358.616970 lineto 1.500000 setlinewidth stroke newpath 158.961018 407.531670 moveto 159.661838 432.582005 lineto 1.500000 setlinewidth stroke newpath 210.276462 93.417118 moveto 206.683129 105.961993 lineto 1.500000 setlinewidth stroke newpath 438.125000 200.125000 moveto 413.125000 200.125000 lineto 1.500000 setlinewidth stroke newpath 69.444049 448.879316 moveto 70.071524 438.840405 lineto 1.500000 setlinewidth stroke newpath 166.982640 431.381664 moveto 167.228130 381.370598 lineto 1.500000 setlinewidth stroke newpath 228.649420 483.894814 moveto 229.171751 470.070093 lineto 1.500000 setlinewidth stroke newpath 30.380280 508.928487 moveto 31.448456 488.852305 lineto 1.500000 setlinewidth stroke newpath 291.405380 483.881230 moveto 291.206201 468.867290 lineto 1.500000 setlinewidth stroke newpath 191.879497 237.686352 moveto 176.777388 238.793396 lineto 1.500000 setlinewidth stroke newpath 172.429308 500.133780 moveto 172.587984 490.116494 lineto 1.500000 setlinewidth stroke newpath 235.485522 56.741082 moveto 254.357357 53.763188 lineto 1.500000 setlinewidth stroke newpath 256.728403 397.630408 moveto 257.741534 425.093032 lineto 1.500000 setlinewidth stroke newpath 219.877532 363.871212 moveto 219.500630 313.874053 lineto 1.500000 setlinewidth stroke newpath 187.291479 398.857146 moveto 186.836193 356.362023 lineto 1.500000 setlinewidth stroke newpath 318.692874 446.363495 moveto 318.414422 432.619136 lineto 1.500000 setlinewidth stroke newpath 36.287081 487.585950 moveto 35.366815 501.440878 lineto 1.500000 setlinewidth stroke newpath 83.375141 375.147631 moveto 87.331590 331.416308 lineto 1.500000 setlinewidth stroke newpath 225.628900 335.125458 moveto 228.591872 309.886319 lineto 1.500000 setlinewidth stroke newpath 371.816999 79.883789 moveto 357.947644 155.092293 lineto 1.500000 setlinewidth stroke newpath 84.565941 496.384410 moveto 85.739608 472.569046 lineto 1.500000 setlinewidth stroke newpath 221.893187 321.374730 moveto 222.486208 361.365937 lineto 1.500000 setlinewidth stroke newpath 197.246527 135.130336 moveto 196.151458 211.382561 lineto 1.500000 setlinewidth stroke newpath 213.443352 437.736186 moveto 211.761799 461.455592 lineto 1.500000 setlinewidth stroke newpath 466.262593 402.550003 moveto 463.341674 426.401534 lineto 1.500000 setlinewidth stroke newpath 91.488082 365.187817 moveto 94.319894 326.280011 lineto 1.500000 setlinewidth stroke newpath 180.632441 302.951873 moveto 171.330952 338.733574 lineto 1.500000 setlinewidth stroke newpath 428.115051 198.304606 moveto 438.133806 198.129855 lineto 1.500000 setlinewidth stroke newpath 74.592940 359.972918 moveto 76.268617 348.601447 lineto 1.500000 setlinewidth stroke newpath 297.104687 368.861848 moveto 298.749664 397.589231 lineto 1.500000 setlinewidth stroke newpath 388.539228 97.051116 moveto 401.924025 113.596555 lineto 1.500000 setlinewidth stroke newpath 421.931288 362.618408 moveto 425.592386 393.878820 lineto 1.500000 setlinewidth stroke newpath 88.700756 345.175742 moveto 86.167239 373.922788 lineto 1.500000 setlinewidth stroke newpath 319.314049 302.610726 moveto 313.161486 328.883544 lineto 1.500000 setlinewidth stroke newpath 500.187726 440.186209 moveto 499.057349 455.195218 lineto 1.500000 setlinewidth stroke newpath 121.931328 502.626255 moveto 122.377393 482.608341 lineto 1.500000 setlinewidth stroke newpath 226.015459 360.172507 moveto 227.832104 345.241450 lineto 1.500000 setlinewidth stroke newpath 355.084869 180.600103 moveto 343.128783 198.464135 lineto 1.500000 setlinewidth stroke newpath 491.616231 428.831149 moveto 489.075489 443.824245 lineto 1.500000 setlinewidth stroke newpath 45.413561 491.371927 moveto 45.777149 466.359042 lineto 1.500000 setlinewidth stroke newpath 282.972269 460.127962 moveto 282.632966 442.634544 lineto 1.500000 setlinewidth stroke newpath 51.643669 311.288828 moveto 40.868229 340.215604 lineto 1.500000 setlinewidth stroke newpath 361.048778 405.073265 moveto 363.340887 423.848644 lineto 1.500000 setlinewidth stroke newpath 156.884664 121.360658 moveto 179.310046 136.471396 lineto 1.500000 setlinewidth stroke newpath 103.055209 496.364045 moveto 105.413178 481.341751 lineto 1.500000 setlinewidth stroke newpath 191.516858 210.165117 moveto 195.115637 130.158315 lineto 1.500000 setlinewidth stroke newpath 210.285291 205.334735 moveto 217.227063 175.206117 lineto 1.500000 setlinewidth stroke newpath 289.073204 277.053896 moveto 297.001444 272.864277 lineto 1.500000 setlinewidth stroke newpath 336.839650 61.329619 moveto 327.757983 68.403834 lineto 1.500000 setlinewidth stroke newpath 217.725166 173.800165 moveto 211.681623 105.142022 lineto 1.500000 setlinewidth stroke newpath 255.742512 284.629705 moveto 283.351677 280.330810 lineto 1.500000 setlinewidth stroke newpath 202.842126 445.131229 moveto 203.227281 462.622748 lineto 1.500000 setlinewidth stroke newpath 214.505890 100.104104 moveto 219.300547 130.136886 lineto 1.500000 setlinewidth stroke newpath 371.267082 351.415418 moveto 369.187544 320.137463 lineto 1.500000 setlinewidth stroke newpath 13.186861 305.412524 moveto 30.940785 301.592731 lineto 1.500000 setlinewidth stroke newpath 122.468853 128.654213 moveto 110.240335 164.995564 lineto 1.500000 setlinewidth stroke newpath 230.562913 308.632413 moveto 227.767312 294.942778 lineto 1.500000 setlinewidth stroke newpath 262.990764 402.623423 moveto 263.269915 378.862017 lineto 1.500000 setlinewidth stroke newpath 96.075888 360.204639 moveto 98.506669 346.442413 lineto 1.500000 setlinewidth stroke newpath 186.393053 462.591443 moveto 185.514828 475.204365 lineto 1.500000 setlinewidth stroke newpath 93.348249 325.127291 moveto 93.340701 317.624783 lineto 1.500000 setlinewidth stroke newpath 156.104923 433.737614 moveto 155.247196 446.349305 lineto 1.500000 setlinewidth stroke newpath 232.253199 362.654436 moveto 233.324489 348.890527 lineto 1.500000 setlinewidth stroke newpath 77.634320 411.179996 moveto 75.928257 426.408973 lineto 1.500000 setlinewidth stroke newpath 119.478633 297.189033 moveto 150.700022 293.214295 lineto 1.500000 setlinewidth stroke newpath 381.161055 362.479363 moveto 378.857980 373.769534 lineto 1.500000 setlinewidth stroke newpath 377.491610 335.051017 moveto 374.499120 310.110108 lineto 1.500000 setlinewidth stroke newpath 476.442492 288.801419 moveto 474.098735 302.578000 lineto 1.500000 setlinewidth stroke showpage %%EOF ================================================ FILE: thirdparty/LSD/chairs.lsd.txt ================================================ 159.232890 134.369601 160.325338 105.613616 2.735466 66.105373 75.587787 63.972852 48.059320 4.028428 68.757033 166.697424 63.229592 108.115131 5.142462 214.249352 223.119214 216.035182 184.336329 4.550998 146.507379 106.904351 144.805709 85.590613 4.785176 16.923435 420.296707 101.917593 432.836299 3.506918 185.613699 338.200192 184.450026 299.335327 5.745963 185.553747 416.882362 184.760563 409.206000 3.588424 104.420784 429.066585 14.001093 415.643731 7.071789 236.956356 450.093215 338.133131 465.571853 3.854458 440.312266 443.318582 461.485782 340.802785 6.986705 390.175127 443.247735 386.423926 429.498062 3.617778 254.349382 144.622838 309.534989 150.327223 3.688258 395.623625 154.388009 469.473514 162.192856 4.011921 82.100903 198.128652 82.505242 173.114982 5.403412 308.102489 147.116916 265.621383 143.163866 3.733869 318.193027 108.638252 377.018594 114.069831 3.714611 177.234686 171.884778 178.866472 111.861175 3.952433 83.483276 209.417449 83.002669 199.321319 2.913228 470.753079 159.475045 426.714048 154.570104 4.692542 347.054436 465.959769 390.859403 442.480235 5.156050 130.050173 423.214677 145.520607 415.417864 3.929099 359.127942 240.746956 363.431147 205.358231 5.148095 338.937027 461.803124 329.742966 458.385190 3.514971 55.447508 287.887055 90.891886 294.103229 7.515963 220.576199 438.153515 226.204808 447.786205 3.686397 459.356888 113.312168 509.492223 118.163601 4.013585 472.109699 476.657906 483.528037 489.002195 3.808180 28.400012 133.725489 0.578315 129.697453 4.590190 129.429473 105.056075 65.661795 103.146365 3.875215 65.393503 102.997316 62.249854 77.921301 3.717255 209.403932 107.795295 252.014573 111.534462 3.758426 254.544229 301.460485 349.452808 311.109693 4.995106 494.491690 491.178740 509.489418 493.692299 3.292066 418.147191 66.574204 463.270471 69.903200 4.148676 114.550553 427.186390 109.152211 430.229825 3.544391 363.760038 340.114935 368.999069 359.476722 4.727075 112.015348 433.411873 129.096273 425.055280 3.441002 450.611143 52.060916 489.517674 54.960793 3.460896 114.103020 56.963459 113.370535 44.360729 2.711269 166.443487 142.867889 177.706109 178.721261 4.601673 0.568442 132.217463 29.760859 137.038580 4.129691 0.822115 72.823339 33.431051 76.965814 4.152311 335.206776 459.796637 233.710408 445.267722 8.472018 506.939321 114.294998 430.625997 110.604393 4.250133 91.889757 105.454932 132.021450 108.937250 4.054862 490.624116 486.669661 481.689616 480.366053 9.010730 148.343515 44.068372 171.978709 47.386215 4.061125 167.308281 44.371373 167.161805 26.872599 2.594079 370.836320 447.249743 345.209318 459.774468 10.107451 391.906831 84.052619 432.009557 88.012202 3.501932 178.416428 178.825694 193.827134 222.070238 7.471541 133.271812 134.749946 162.050609 139.578304 4.095573 90.277768 227.799200 83.969749 210.320139 3.200202 184.930491 408.147278 185.794276 338.142512 6.619664 459.882600 344.038088 464.790514 334.590863 6.165761 121.173667 71.653235 136.308673 109.098667 4.191508 142.958322 411.126008 126.173037 421.510810 4.405030 373.211533 110.868378 328.114968 106.991696 3.843281 26.897965 19.372708 25.020860 0.560555 2.859979 428.479914 468.957678 438.882696 446.645470 5.588076 359.498486 49.584630 409.487962 52.279828 4.619415 200.759417 413.298225 191.059982 420.824676 5.482846 160.717716 77.262183 220.711892 79.894901 4.404005 224.660034 263.330145 223.280681 256.841903 2.705283 485.638645 51.352733 440.636706 50.176954 3.781369 78.123187 76.901031 119.520625 79.783721 3.945927 303.110387 247.009670 245.341121 240.741170 5.991382 44.214757 50.248770 38.283969 33.070117 4.487182 136.358108 166.014596 133.914970 147.095830 5.077874 290.612784 47.014847 325.781195 50.086899 3.578281 430.928389 438.389046 443.824367 423.571578 5.499863 250.702019 108.664095 230.666339 106.493430 3.831827 401.971668 189.223740 432.172868 191.307208 7.352799 284.417212 81.511106 322.134685 85.886335 3.670388 509.887214 489.453750 492.055317 485.681421 8.560541 35.522946 55.874412 40.682107 57.985436 3.319072 134.291376 112.182609 142.123736 132.265495 4.658270 383.492191 435.939162 375.382597 445.417604 4.474677 108.153220 146.699755 110.409196 163.154587 4.174711 434.003471 190.702414 433.045129 170.628813 4.162996 38.179708 221.284749 0.309891 217.774717 5.968258 426.878110 84.328129 386.805716 81.669150 3.824533 5.548653 221.594031 38.141785 224.161954 2.363897 228.231497 260.392493 230.003626 270.731505 6.371339 125.598417 421.669335 115.603827 422.961191 6.679145 0.618577 99.406529 24.644698 104.301132 4.627060 98.357075 440.320582 32.948807 430.555125 5.035560 400.760375 168.054843 401.833753 189.250485 4.377409 114.391901 75.932022 68.111960 75.102542 2.656401 131.537589 86.889429 129.878963 48.103449 2.978368 455.572123 22.382176 474.507270 24.356319 2.616143 319.431011 82.454246 284.362402 79.525869 2.704474 61.838651 134.269909 53.981571 136.987535 4.292530 106.794317 58.390409 115.847654 61.142573 4.678575 198.098624 33.345934 217.026545 35.605594 4.520218 274.419642 58.914739 254.365818 56.969671 3.054274 110.830519 164.676305 136.968982 167.119554 5.711412 156.904122 59.028548 194.558357 62.193669 3.725997 203.411749 119.206214 204.813000 131.964185 3.303882 277.089886 176.949969 275.815996 159.361167 5.619011 405.685811 49.291961 361.855954 47.292513 3.746104 86.904705 44.166402 103.180657 46.484161 2.651258 224.523552 240.813495 227.747717 259.653484 4.150995 453.820099 125.601499 454.326662 140.584373 3.663383 88.113984 128.361835 105.634220 129.176792 2.845787 225.624005 119.436211 211.857320 119.212377 3.790147 62.346586 107.100223 49.555360 111.189204 9.095736 460.641118 66.429978 408.119470 64.527693 3.775131 32.114157 430.744113 4.020168 424.802875 4.585097 350.302735 475.390486 256.669285 462.071155 4.758341 421.966069 28.488462 461.946711 30.192624 3.562382 129.453086 33.724215 149.464944 36.125394 2.680877 151.960634 231.017630 112.851686 227.111418 5.973570 129.400486 308.742368 109.353394 308.470979 6.503234 455.578760 141.366846 479.469681 142.855983 4.368216 46.205567 172.856451 64.055075 211.444782 8.026495 190.646608 58.691412 146.861333 57.307358 2.617230 204.454163 133.427836 227.005579 135.312650 4.253856 461.866721 27.213980 423.139823 26.268111 2.590818 453.212818 40.258461 494.476852 42.500124 3.337642 477.426352 192.045034 492.912716 255.676665 5.578110 325.794712 120.530377 326.718149 134.385454 3.991082 479.313251 125.542906 455.497646 124.283735 4.663039 227.407290 134.420386 226.462509 119.480131 3.283906 350.883550 136.902162 350.472920 121.913411 2.875615 18.257506 99.483626 0.560668 97.429144 2.860092 206.372770 464.776399 200.829459 440.578163 4.417480 335.694580 62.426596 369.606124 65.805127 3.860078 29.371380 73.165177 8.180792 71.255805 3.622693 45.217461 105.829286 56.739988 128.816093 6.155979 253.340273 59.032997 278.389335 62.420170 3.447383 431.848879 169.838449 401.733189 168.141058 6.732485 43.425276 330.856826 35.516449 298.456620 5.211139 108.044574 129.618110 105.311392 114.660720 3.807439 249.350404 175.890149 277.190608 178.472667 6.941395 328.075196 136.239263 350.730312 138.076127 4.141806 18.525858 0.426184 24.735488 12.946206 2.109492 246.244878 155.385837 248.802003 175.378531 4.613629 427.869552 277.467253 410.975793 284.028249 2.850720 398.134242 14.162867 429.433750 15.526562 3.311167 246.683107 455.071997 219.201307 447.505893 3.161658 176.089103 422.173534 169.333992 404.390577 3.061713 348.324771 216.176420 350.485679 205.596544 4.023717 452.900719 262.786265 394.006643 256.674641 6.345640 365.238056 262.993972 372.084940 308.093127 4.568109 39.495839 138.908754 46.797720 149.428640 6.245781 49.039987 74.348059 61.520660 103.277866 6.030799 121.888190 438.165016 114.379933 440.639965 3.574687 172.835900 403.218180 177.568496 417.901478 3.608527 509.618479 503.429353 475.552093 494.658165 5.117568 84.327486 114.127195 87.147464 127.811254 3.710026 169.405751 24.698438 201.911433 25.777229 3.410785 344.833624 206.784228 342.819955 224.340011 3.013360 442.766424 450.374071 450.516605 439.299145 2.764964 355.565684 315.646191 364.080400 339.480246 7.400663 351.934340 25.755969 389.410827 26.694690 3.313029 496.897016 40.358524 479.413083 38.914046 3.211959 0.633644 54.979879 34.411079 55.432488 3.732915 2.996378 327.890956 42.069625 332.837703 5.242619 169.371594 423.135859 156.496274 419.097297 5.004187 310.586433 266.779905 294.455011 273.322283 3.005284 349.301186 121.595710 326.741529 119.880245 4.416939 133.136094 148.002892 109.017347 145.811652 6.225144 254.109359 461.811652 222.751823 454.792026 4.042093 321.406759 191.635844 333.316419 230.566441 6.102425 284.366747 251.170112 256.873049 250.753866 5.188652 106.764309 317.707257 174.234571 326.680854 6.268572 339.395916 223.128232 342.719927 201.619224 3.795886 41.911574 60.045301 48.327150 74.283916 3.819817 283.365831 254.395714 282.075951 269.392284 3.133518 274.352037 158.417102 246.630292 156.237806 6.230776 362.659723 205.010923 366.774935 191.843726 3.270234 428.134504 12.898968 399.382780 11.689982 2.404228 189.109111 494.317848 178.306095 496.515294 3.548069 104.359670 114.663314 84.283501 113.595841 5.656649 505.126517 264.329538 505.894641 298.147268 4.231573 154.999632 418.185211 129.233747 431.728083 8.383531 363.171642 61.814501 315.642871 60.122891 3.387637 369.258623 351.548726 403.256407 355.831970 4.970567 453.182331 15.528699 486.924373 16.965562 2.497736 260.627491 143.058544 221.885083 141.606060 3.294365 371.707029 370.303144 388.261380 425.956253 8.447790 91.135701 291.621692 105.541817 320.666259 7.901443 330.678520 18.918829 351.929315 21.412055 3.141831 480.302377 141.885188 480.205104 126.869622 3.830896 14.421376 23.814010 0.559439 22.668062 3.109408 111.601542 336.454741 123.994127 365.250967 5.435410 294.514109 11.908291 320.707543 14.903040 2.803800 355.890985 471.126964 348.942537 474.808860 3.445598 353.104281 259.378507 356.705833 280.653637 3.090843 28.151838 237.031055 9.105274 240.306610 5.139521 229.410862 17.907237 244.415633 20.378265 2.873009 0.529073 282.733113 32.083426 286.260531 5.246790 31.876890 494.938226 5.878110 437.324859 4.376474 53.538549 136.293396 47.685556 139.914750 6.882713 194.205052 431.808907 199.506846 418.176276 3.494999 379.315714 339.257530 367.835549 345.051480 2.629580 476.264587 492.641817 448.383295 455.735540 8.667141 113.153085 230.286277 163.120503 234.429236 1.774722 350.648351 467.576580 333.126157 468.159769 2.789681 391.843385 20.855660 413.374216 23.806748 2.866553 186.933246 265.068811 196.824766 266.104685 3.859797 289.491922 24.799089 325.697471 26.838300 3.480139 35.637980 304.245860 0.366122 300.700518 5.218557 109.015978 17.020879 115.568756 33.147853 1.510761 310.756543 34.635246 353.256773 37.131334 4.111947 0.498982 245.367514 48.182540 251.421817 6.534643 293.317471 274.614391 318.137550 276.727602 4.584824 404.168898 355.913241 447.071086 361.661518 4.955715 48.198019 255.789970 33.804745 262.160729 5.190490 350.687175 18.609567 323.165693 16.374027 2.694199 425.678600 154.339246 373.165640 152.150124 3.642618 457.111719 453.481045 451.342462 437.062122 6.024261 104.793695 321.129168 111.581106 336.315052 5.342785 231.812366 268.548562 250.703798 271.342133 5.129068 380.808612 35.737165 424.492554 39.096240 3.930178 174.720731 435.980263 170.056191 424.107378 4.363006 217.866308 445.756404 212.290311 434.779094 6.173892 230.388600 267.133638 233.206521 283.328319 3.320128 369.077836 308.165540 366.186141 286.968976 3.377657 464.384146 333.034037 498.542915 336.468647 11.325434 365.660804 9.006347 396.895522 9.697245 2.969314 410.680304 285.129987 490.797513 294.080883 5.517407 54.298768 120.968611 60.940456 126.495945 5.119999 76.806900 190.639141 78.900908 200.723445 2.585209 100.729051 43.371690 84.267199 41.664465 3.002437 405.286079 456.206813 394.168044 449.730274 4.226042 498.938042 295.746609 500.497341 269.293792 6.827612 246.936403 46.252785 225.647021 44.151850 2.717071 106.834003 257.304408 143.111350 260.767970 5.039857 145.702630 358.417446 134.573226 361.371753 6.361500 176.051898 332.104632 162.689009 342.884096 4.897013 214.112891 261.930165 212.495319 254.244445 3.218727 279.230909 281.880272 279.126898 254.375938 3.806697 31.413079 51.455653 16.180654 22.829330 3.077676 195.775680 265.842891 203.160950 266.330516 3.363915 214.361376 45.759253 249.506845 49.325760 4.343453 343.205783 305.904576 249.377596 298.093813 4.256879 143.365348 266.034667 132.813805 272.225168 5.060305 191.006334 467.643444 181.919833 436.861766 4.521074 201.961217 257.104000 185.667701 263.238417 2.642619 354.051180 255.732329 348.952971 240.350573 4.346109 408.444666 483.173604 407.066795 456.799675 5.458901 173.116727 349.302592 156.794171 351.167576 4.009558 165.628222 346.883108 183.315601 339.854655 3.277040 331.936485 467.726497 248.061683 454.785374 2.661372 388.125273 24.369915 375.594290 23.696196 2.496395 225.653682 25.709473 261.912485 26.601759 2.499243 492.988107 298.610783 481.094611 320.194984 4.379177 261.918245 32.753103 282.081662 35.097760 3.291759 203.089889 436.886455 227.114248 510.520443 7.079713 371.597054 295.110636 395.730266 282.069803 4.337326 401.294654 265.704109 399.821100 278.177700 2.297679 413.190261 280.760462 424.764846 275.184200 2.794783 108.388710 441.209350 99.294816 439.957477 4.055902 180.002423 453.044933 178.664124 484.344605 6.724879 32.901339 286.362607 54.857931 288.833331 8.990514 59.207593 171.312232 48.530556 174.488345 3.723241 124.548783 365.541942 139.285399 396.375549 10.200036 218.883099 500.782806 210.314543 474.073586 4.423880 36.822152 10.098900 64.448679 12.115752 3.403495 170.495828 241.864766 168.905550 261.936842 2.751025 443.645673 393.552335 428.962451 406.569626 5.930475 384.232856 452.893358 355.897007 470.281230 8.329501 149.159805 269.909158 164.295102 265.359219 3.951101 453.651684 369.635090 447.218659 382.661990 3.929678 63.964265 236.827441 61.931657 254.381560 2.770963 318.206578 276.904753 335.628712 278.069480 5.739288 267.343844 277.937340 276.637094 273.835935 6.490976 349.428930 13.822995 373.317285 16.156857 3.517771 441.516447 461.234669 433.884283 472.394281 4.506623 418.151797 9.564748 448.164219 10.323300 2.562368 463.127329 1.375566 440.621989 1.270624 1.354902 146.897513 32.794033 128.149236 31.518712 3.088068 118.941685 293.614150 143.325568 279.727174 4.977953 170.651802 509.447295 174.912861 434.193122 5.557321 140.671704 133.217255 84.362063 130.945695 3.243106 211.079091 27.019807 203.344104 23.841733 5.574951 209.392900 76.196683 163.142120 74.976210 2.663999 404.585196 509.540784 407.559390 483.344622 5.418223 62.368900 198.033277 64.628628 179.405768 2.030198 215.721371 434.579943 209.498834 424.300042 8.780049 410.644966 20.177699 378.153907 18.727405 2.441773 177.860484 233.177731 160.648302 236.980473 4.598440 190.420268 295.544370 254.452186 300.962878 6.285525 498.168996 495.475703 480.372643 490.231358 2.751380 266.930447 18.183389 298.170971 19.637033 2.555399 316.213806 160.239035 308.228518 148.057143 3.856534 12.817908 281.176980 40.005127 269.216030 4.026984 70.728690 21.830672 78.857900 40.846064 1.673748 97.442107 229.246313 100.924050 244.590788 4.486875 165.880858 28.564290 153.291019 30.471134 5.505185 63.205654 55.611932 49.193511 54.717178 7.245784 101.788326 244.709598 104.806543 256.766976 5.759396 315.637928 8.900524 344.400633 9.684209 2.465027 228.141109 106.329982 181.857650 104.962029 2.572766 291.477010 255.593173 290.666502 265.728282 3.140197 324.369299 24.455054 311.843805 23.563037 2.404889 485.630433 14.166560 455.618242 13.384286 2.531722 509.605902 231.387679 489.582630 233.684827 4.397536 177.374015 265.227144 188.566004 262.326720 6.363719 258.110982 82.419033 284.350636 81.898009 2.474692 325.652519 107.181775 303.098778 106.523763 2.644751 193.533012 453.129350 193.719718 435.618013 1.409850 436.025527 474.356065 436.918346 493.241142 7.010412 446.878057 7.708756 419.370360 7.506706 1.451954 245.190088 297.540927 268.851598 279.922089 4.223222 299.319077 109.941028 316.876687 109.433331 3.531654 369.046130 359.857277 372.053369 369.702337 3.751628 40.206787 263.999841 8.216876 272.232024 6.506427 132.355040 273.944583 117.756181 282.495307 6.579474 156.484047 347.921369 146.832148 355.845376 4.484692 157.316073 365.876551 174.606623 351.868030 5.040571 375.842982 258.982877 365.852756 261.521341 6.057509 396.604513 293.126585 396.450694 266.870163 3.830486 0.642291 25.432741 16.984944 26.902494 2.601916 64.372230 105.937496 90.642325 106.170341 3.794169 133.684762 110.912555 121.445276 81.533271 2.019499 395.400452 450.366648 383.353525 452.160070 7.286226 425.540448 114.705578 458.137088 113.435148 3.601112 41.899709 265.689507 55.815547 260.359125 7.450898 356.056772 280.663738 353.932967 304.335341 3.064793 504.293748 263.146998 501.685848 253.514641 4.599686 313.114186 63.500374 338.110365 63.191328 3.842434 143.382025 278.908471 157.477006 270.754830 3.702096 418.588857 492.850270 419.464219 498.311072 5.332669 478.861252 321.619429 420.265876 340.840793 5.787624 179.328823 108.608772 196.915613 107.548895 2.721059 291.552933 272.424170 306.783146 265.425121 2.455386 350.689819 34.316003 313.096307 32.454454 3.250839 220.852517 251.902123 222.797642 235.585974 5.499280 252.721943 275.133310 243.676709 282.548031 5.103210 496.897039 8.918239 468.153644 7.531345 3.400748 0.603673 18.441574 21.925325 19.878000 2.494346 160.488509 414.724145 173.026956 419.625797 5.365886 191.736754 255.663334 186.962945 238.447223 3.613649 394.375509 6.778142 366.876270 6.633503 2.493391 474.352938 19.796494 468.104026 19.714014 3.799166 497.324137 267.582530 464.542267 275.104022 5.991520 63.136909 63.321740 49.437102 64.150979 3.894196 170.673457 430.292158 144.255466 426.446054 2.677638 171.890684 310.763021 130.596007 310.180574 5.369713 244.343039 17.278542 226.755361 15.885578 2.553985 404.251084 68.040527 416.874383 66.868357 2.489291 194.221054 211.896162 211.960221 212.979341 8.324091 45.699621 147.838403 53.413071 167.257095 7.447854 73.381698 234.409931 70.998202 251.925784 3.151340 249.212802 285.247642 266.704842 277.729122 3.284049 492.479027 256.707372 468.004187 267.859869 3.815802 199.805568 440.660404 194.148442 509.459155 4.897281 216.883346 144.814064 256.882690 144.976047 2.646778 287.456984 283.129778 287.260252 255.622245 3.866120 421.914200 340.792559 380.582602 339.295770 5.657811 509.588612 496.777316 499.253867 495.139230 2.529650 183.988456 423.529841 190.104550 448.253747 6.380027 270.632849 11.278323 243.137606 10.916649 1.595156 475.514310 89.588544 490.609137 87.976462 2.437605 104.477450 286.044143 90.637697 289.426948 3.939557 179.041478 236.971134 176.679817 259.485645 3.338328 187.496702 509.485770 190.240894 494.083848 5.799526 210.029141 254.401493 209.622752 264.435660 2.497952 69.345239 261.878159 67.742726 246.782882 4.256879 459.318666 268.657519 389.308745 261.251294 2.952583 1.712044 417.622982 37.547416 495.219014 6.998872 108.734153 295.861122 105.447311 286.940470 3.518750 469.396151 10.187029 499.446799 11.638249 3.263272 8.200544 12.588943 24.479558 14.883061 2.475539 212.970213 236.566603 222.465228 231.800965 3.920794 335.670448 278.584791 345.637479 279.158030 5.135297 340.712938 206.080090 329.402188 208.265701 5.899330 417.957444 408.619875 403.763303 439.666821 5.164391 369.375516 13.118761 350.650317 11.569090 1.864316 464.433130 274.729547 428.173643 272.375691 5.912969 177.717277 494.396204 177.339108 509.418152 3.937560 259.385357 24.182050 246.854365 23.509420 1.851205 245.656558 244.093205 279.403275 247.872525 2.216065 426.048239 498.248398 427.810557 474.351811 5.354198 148.284290 424.408576 169.336971 427.165413 3.334662 182.192929 306.768192 171.942808 309.618821 3.277963 344.385814 264.212324 311.780612 262.044899 5.569363 359.787326 299.030384 362.871845 313.909208 4.477882 146.883274 245.355067 124.369671 245.438598 3.754612 388.951881 426.007689 391.187592 435.782229 4.491732 190.893366 484.388011 191.742724 466.868587 6.182138 422.874357 272.504836 412.523768 268.385824 5.570030 364.357656 84.965510 390.628196 84.726894 3.942851 494.364547 85.465843 478.102594 86.533840 3.149960 78.430220 284.405600 81.308799 255.693555 1.988746 85.008580 238.194837 83.632294 250.680917 2.758855 203.306343 232.512283 198.022776 234.015761 3.901202 281.907316 7.786447 296.890121 9.216585 2.132363 312.922246 248.911399 333.972673 239.705073 2.721052 370.090047 310.460149 376.551673 338.487723 3.931416 499.133034 337.310127 509.634463 338.818018 5.659896 55.642851 237.955959 29.358734 238.390019 2.912457 69.185803 205.406076 80.727335 203.919533 3.240236 204.774440 509.618693 197.255167 483.374215 3.598275 427.713383 405.739338 418.073618 409.233237 4.803401 438.077344 53.816471 449.457802 52.845436 2.278409 123.302102 245.409587 102.845546 242.937317 5.072704 167.238904 241.486863 150.411581 244.386454 7.815603 258.169773 249.508801 245.800027 253.648051 9.492347 456.945869 457.838037 471.021505 475.072079 3.614101 56.844474 161.671589 65.643100 161.486793 3.801669 159.436757 236.170838 109.383243 231.781009 2.053604 425.637193 263.005574 454.343206 265.936409 1.878350 385.668650 81.415191 365.591813 82.524225 2.634083 417.230416 471.716206 416.084912 487.186720 7.479525 490.527963 88.614531 504.366390 87.946609 2.557355 493.134436 331.876406 495.794452 314.027676 5.682398 211.898992 204.686007 191.848205 204.173703 3.844559 246.622792 253.010402 229.284125 254.682916 6.821223 347.599592 309.920764 354.590617 316.651029 7.069791 53.123525 73.078849 63.153233 72.758244 2.618533 61.499662 199.948347 69.343177 205.083049 4.469057 416.875000 0.625000 394.375000 0.625000 1.250000 19.426941 16.991567 3.096670 16.243217 2.382934 29.855908 40.384423 34.857954 50.383400 2.729331 171.453769 399.136975 164.820107 410.876517 2.468039 496.943482 208.541196 484.323284 207.504677 2.286970 54.722254 222.262780 44.645206 224.399390 7.410432 79.051400 255.590775 76.002901 284.414968 2.808918 437.492592 494.314565 437.982716 509.460504 5.401673 172.804972 260.722558 174.791335 241.787545 3.729535 242.030241 243.003330 231.073519 229.023473 3.429902 110.625719 435.650677 100.598579 435.931449 3.818506 116.890199 1.370490 96.870711 0.767373 1.776408 369.318245 155.580181 394.389408 155.021040 3.665456 79.610425 231.974131 74.334818 232.894731 4.338815 80.616631 134.094030 105.631670 133.348917 3.636687 104.639413 258.043296 109.658834 274.287295 1.476142 199.320274 244.275623 207.618770 239.705733 3.776827 58.622719 261.836277 59.848591 238.020694 4.543591 232.751653 242.672543 226.342556 230.254656 2.727252 432.407320 494.310621 431.052533 509.413352 2.378319 295.627701 16.810691 271.867110 15.812887 3.022262 323.690080 190.468042 315.739168 161.843288 2.408804 217.916823 264.348239 219.517891 251.893369 1.558549 253.437435 115.525471 261.950504 142.249146 3.246459 461.859077 478.225234 438.112621 474.452923 2.607312 166.063226 271.870235 166.232038 243.113888 5.051279 426.966803 509.421083 427.314256 499.304226 3.962313 385.671197 426.932377 376.698994 434.156402 2.945998 416.949825 35.467103 383.096147 33.667902 3.014982 506.875205 1.344615 489.374850 1.349603 3.752494 138.167688 397.444448 146.521022 413.311356 5.065173 167.039436 233.796337 152.673456 229.714015 5.847654 177.826016 259.779973 188.285695 256.079176 2.429238 249.606370 247.186812 235.482304 243.703623 2.127978 175.035574 421.581812 180.493365 433.878628 2.535471 197.982750 107.937095 208.299929 109.318913 5.121684 255.627550 287.436402 243.122130 287.493204 3.761317 17.596374 490.890457 0.035885 455.920833 4.473096 214.270946 187.316346 203.054972 184.672024 4.510454 243.129840 12.960800 269.393866 13.734926 1.949179 6.640064 280.926151 1.717464 256.653444 3.957979 119.473090 83.082742 128.760061 104.639920 2.649659 135.706954 274.636471 148.159036 270.733590 2.456780 195.619813 244.709714 193.503648 236.774028 2.737665 29.452973 0.954034 48.174606 2.539093 2.174727 74.458131 199.386983 76.450668 185.563835 1.783380 106.904335 56.208724 73.109775 54.720788 2.552563 283.126253 79.503014 260.616176 79.723302 2.695595 391.342230 436.194474 394.950323 447.489804 4.382549 394.391355 1.550158 416.897240 2.683259 1.436981 -0.248520 443.546170 23.809101 493.442468 6.092284 378.759178 336.983141 373.248742 305.603270 3.495422 412.871578 488.097410 410.541294 509.501973 3.998545 201.474836 22.051468 191.797914 0.107758 3.061796 204.483029 285.642580 206.990027 270.236889 3.500538 345.693276 281.863143 345.856182 265.627320 4.987207 465.697913 265.760905 483.973291 255.956156 3.224058 46.921997 169.350532 28.075583 133.150728 3.583348 179.521575 435.618489 180.246940 451.947322 5.327913 330.738863 235.813088 320.098128 242.254670 4.080660 509.383651 27.201007 490.613698 27.699091 1.746940 42.331436 137.258853 26.273530 104.061301 2.684844 77.786746 185.585833 78.803047 176.808773 3.868889 -1.017931 492.821908 55.054891 505.622377 15.113714 204.870715 263.219232 207.065469 251.673590 4.851213 363.247960 194.291871 323.910270 190.663598 7.564965 415.214637 506.880710 414.970917 489.366707 1.475987 150.624834 42.882011 131.874843 42.894802 1.261938 196.891135 22.565428 164.379678 23.325195 2.324097 216.948461 276.886065 218.633148 265.701541 4.080536 43.139919 17.852776 70.694170 19.362867 2.479376 54.500439 504.899948 92.007923 507.282114 10.217582 439.390016 3.423256 464.383794 3.817583 1.624502 125.659163 7.392537 143.179351 8.209704 2.613762 225.621919 59.762118 253.126032 59.663909 2.575861 197.996882 226.513455 182.309119 232.072608 4.369662 143.149516 276.340928 130.578648 276.771400 4.004480 232.400961 290.495600 227.547257 270.767139 2.167577 34.444759 258.736927 0.553211 255.031638 2.057698 49.311032 149.134416 64.251858 145.161862 5.474508 190.617635 237.830501 192.433523 245.492633 2.495888 88.443410 256.795586 85.877427 286.896518 2.384793 78.121460 9.312815 101.874659 9.248727 1.861500 131.764034 366.685025 151.935545 368.796636 3.267268 218.102409 43.945195 205.571327 44.603842 2.562165 240.986370 479.612301 229.944108 496.427880 2.479791 314.310736 165.641436 320.918982 191.480127 3.914931 20.697483 424.141370 5.245725 419.347489 2.553088 278.052957 48.822275 289.435435 47.338672 2.317471 17.287331 29.171379 28.670788 52.222761 1.798745 358.692989 281.880958 358.876824 264.356661 3.789130 376.749297 254.216221 369.718519 245.352517 4.694093 490.615544 30.024280 509.380571 29.728900 2.657081 71.932595 56.980963 105.722813 58.682078 3.116760 226.745906 295.649716 222.457824 273.252736 2.455402 316.819659 0.990469 329.594580 2.924915 2.397695 410.987995 452.159127 414.125776 461.954832 7.477364 66.893967 16.433122 44.381789 15.466842 2.980135 106.850590 133.451106 131.897388 135.325898 2.399722 433.926168 509.402109 434.519060 491.879874 1.502914 26.870479 52.693432 0.610265 52.968557 2.499863 81.974765 171.921831 80.545919 136.827327 4.357104 344.446768 304.384069 347.129112 283.157111 2.023688 351.491639 272.004243 350.387079 258.044917 3.146712 437.184643 445.240324 430.949735 440.221574 4.868667 88.162071 286.878320 91.523977 249.343560 2.731428 249.364557 56.598232 228.097670 57.400665 2.356829 81.457615 256.926515 79.596517 241.847659 4.334234 464.377050 20.432977 439.366557 20.166035 2.486517 68.015436 245.833088 69.902107 235.493098 3.689092 99.401555 435.445162 21.748923 423.978824 2.597955 81.882830 13.640652 108.143172 13.920637 2.486531 349.403585 1.445759 370.725512 2.865660 2.328359 24.922470 106.628388 39.412226 138.795160 3.080335 113.923185 284.172648 107.590600 259.193584 3.344870 203.108476 31.412437 178.095742 32.305952 2.453782 314.397133 45.859709 279.386521 45.096486 2.444920 33.049730 80.101183 44.421636 105.604205 2.668838 200.495338 479.416194 210.298553 510.272964 6.657711 476.599453 257.226900 467.109278 260.138590 6.436826 61.890042 1.631936 81.967861 2.874433 1.793019 100.483780 507.158368 128.094948 509.701304 3.291927 191.725361 221.608182 178.598829 228.969877 3.270746 478.390870 477.927030 463.460196 457.875409 7.295767 98.128854 2.984646 116.899024 3.499997 1.352450 135.599710 46.848610 136.489318 88.133311 4.233850 15.642237 7.919190 0.642758 6.662967 1.871581 438.063859 22.972820 454.391825 22.260851 2.443173 251.512312 467.854275 243.435976 478.674075 2.497141 354.359373 198.309787 325.603602 195.878040 1.895957 146.851175 130.476130 156.991555 128.853311 2.041119 215.181070 269.330061 212.901126 291.852337 2.739078 49.145863 108.891289 33.819750 76.545810 2.735325 73.802769 218.078784 54.884582 222.330413 6.248751 92.880535 506.541297 99.469806 507.284892 4.968463 195.843903 395.392645 186.975019 408.194292 5.484932 208.110989 421.687705 206.999992 414.356059 6.366734 215.081436 293.217776 217.060373 278.149345 2.215947 238.645445 477.428153 250.890490 465.907175 2.677337 125.886292 429.987371 111.998036 435.913349 1.962284 156.250987 399.662885 182.408485 382.697538 5.213971 213.358454 245.564643 217.228499 260.533607 3.004855 335.633936 243.146609 320.617411 249.356649 4.820213 509.646196 306.889468 508.246265 333.131469 1.780937 379.609699 119.321986 386.689884 150.666814 2.871754 130.616060 45.420035 149.384874 44.601369 2.443154 75.669187 286.299546 31.889371 282.937845 3.451889 104.375755 11.563341 81.875887 11.508831 1.292393 126.788004 360.078307 108.220995 320.579875 3.857796 504.795826 333.142796 505.958888 305.639119 2.656204 389.483639 150.596671 380.301301 115.383454 2.207854 478.151673 38.614803 456.883997 37.868577 3.068281 204.169062 268.102154 202.647020 281.821974 2.898236 374.379554 23.241764 355.609353 23.973765 2.790364 487.734453 245.107738 477.353966 257.283349 5.176830 355.514487 313.114664 357.622289 290.577983 2.838342 197.200289 236.504648 198.723651 242.984257 3.364395 244.348775 33.684263 264.362011 33.413821 2.482882 218.280509 278.079630 223.377914 295.551211 2.899722 445.615410 473.183262 459.403344 475.452804 2.888118 230.665479 105.613576 224.741854 84.624242 1.940876 222.111645 84.306271 227.954631 104.424481 2.246301 376.870531 21.786232 390.648540 21.092540 1.751259 385.960425 252.942239 378.125984 245.623946 5.240046 21.845994 21.887691 29.477701 39.330065 2.075420 406.917985 265.232436 453.161029 270.295961 1.496653 29.751528 140.449851 44.848539 172.904724 2.847466 116.053806 27.923332 107.955800 10.704575 2.127923 175.273688 51.870173 175.411296 41.854889 5.068221 344.329038 280.509588 342.311559 303.163878 3.095330 243.136021 23.450781 226.904595 23.999861 1.798679 271.875366 31.219263 244.374606 31.236224 1.266960 218.119733 18.218339 231.896399 18.995807 1.741025 429.437199 184.468337 405.621630 183.187670 2.630635 145.427530 13.197200 150.304233 26.535251 2.032468 175.597522 35.257390 196.915285 33.663942 3.087347 339.001021 229.982214 348.645421 224.371016 3.696759 141.771478 393.255255 149.412366 399.327985 5.268964 193.014210 6.917503 198.832256 22.083214 0.989790 280.703476 5.311352 269.323882 6.265076 2.075059 405.622508 395.724005 381.856103 395.125902 3.717366 494.459293 202.853313 483.078379 203.833906 3.134595 254.506291 458.513142 335.588474 470.864774 2.119275 44.356550 220.545291 65.899047 215.558970 2.334310 271.882878 171.646828 260.603166 171.257359 1.637468 499.506555 249.463781 505.128391 241.133435 3.807624 346.922747 453.894378 333.184158 452.529521 4.357644 221.533595 450.325733 234.196227 454.872842 1.930437 464.546398 74.341511 470.657479 105.618654 2.481914 63.079694 212.991586 44.745998 219.217493 3.148902 72.985402 74.386418 71.859897 60.626235 1.959158 150.526733 61.827776 152.323880 105.657848 4.463795 183.135132 371.669175 154.393250 370.254272 4.114227 472.121948 101.903103 473.120947 93.124539 1.807334 55.649919 132.082179 42.095993 133.712387 4.021704 150.568268 357.309270 163.179633 358.956801 1.853936 182.522431 377.853423 155.343194 395.838171 3.433463 207.751870 49.350504 208.450701 74.365901 2.987715 268.793362 20.716983 270.173864 29.446345 2.664566 475.649150 137.605671 456.881606 136.732935 1.655107 131.971927 410.776856 120.255824 418.254998 5.559707 412.722670 397.837339 393.960486 424.078628 6.253370 111.804929 233.933682 136.833635 236.102385 1.411603 425.522384 45.644459 428.855941 63.223431 2.223335 18.253278 312.078859 8.099398 310.833793 2.633550 216.799712 184.377444 216.872540 149.374995 1.304614 403.973322 418.294992 415.556680 400.580326 3.420452 149.382313 239.302955 110.650752 235.371309 2.398539 96.167759 265.409588 103.188670 283.099730 1.880676 117.482784 36.654515 119.273006 51.738753 4.081245 322.862184 91.945686 326.563824 105.708693 2.089549 180.250278 36.814060 181.561488 55.646828 3.046387 493.153764 496.711862 509.555077 499.603661 2.027932 441.870766 298.199499 414.317683 296.633422 2.425038 224.801459 43.126734 224.862454 28.126982 1.305901 277.507984 65.397621 282.056461 78.059816 2.444154 492.744526 68.194033 495.459041 83.155111 2.236684 30.611571 283.237769 16.907058 281.605792 1.389040 73.839870 119.358312 74.598802 151.869776 4.478264 145.513832 84.381397 144.286818 63.058145 2.280440 216.981275 20.466704 218.310259 31.853378 3.434899 31.953778 313.446751 19.437840 312.384551 2.596750 151.772195 24.412225 147.191146 11.760527 1.722288 329.144267 105.695239 325.343730 93.210623 1.923876 500.253667 49.441395 503.579794 68.043682 2.240957 76.140426 58.887718 80.109393 73.267315 3.947413 224.247919 13.160710 220.718025 0.598860 2.028927 31.900434 229.102479 18.153512 227.819500 1.360747 69.442058 80.614995 72.625028 101.949592 3.394881 119.084192 28.143096 117.994595 10.633115 1.791024 348.145999 127.645840 333.120077 126.987339 1.686625 110.548286 223.275835 99.589891 217.702479 3.323388 429.400356 177.767701 408.080312 176.254710 2.405244 478.115372 132.060706 456.793071 130.955198 2.496647 480.739645 191.847997 474.487585 165.304062 2.574196 4.409934 306.640305 13.152302 307.941575 2.104697 211.894676 194.127355 195.549228 192.828692 2.038088 271.891380 165.169002 255.617477 164.584440 1.742779 366.247951 190.671639 368.495420 160.652733 2.119725 469.429091 301.209279 445.633060 299.275800 2.086862 1.602069 56.254711 8.281317 66.775763 4.891161 70.390036 108.203472 74.146531 119.451303 3.163190 231.366519 61.875333 231.347967 103.124763 2.502811 369.374379 436.363632 363.922446 445.585449 5.332759 224.393459 125.342260 210.620555 124.443092 1.817377 473.285143 168.093293 477.951555 191.661849 1.954532 141.890153 236.664623 166.850691 238.462496 1.250000 468.666007 255.398414 461.254722 259.316236 3.962737 130.698192 154.893227 115.599192 153.383030 1.989973 158.961018 104.468330 159.661838 79.417995 5.172829 210.276462 418.582882 206.683129 406.038007 3.429876 438.125000 311.875000 413.125000 311.875000 1.250000 69.444049 63.120684 70.071524 73.159595 2.417153 166.982640 80.618336 167.228130 130.629402 3.737683 228.649420 28.105186 229.171751 41.929907 2.545412 30.380280 3.071513 31.448456 23.147695 3.094193 291.405380 28.118770 291.206201 43.132710 1.448867 191.879497 274.313648 176.777388 273.206604 1.773580 172.429308 11.866220 172.587984 21.883506 1.388428 235.485522 455.258918 254.357357 458.236812 2.014058 256.728403 114.369592 257.741534 86.906968 1.756060 219.877532 148.128788 219.500630 198.125947 1.476112 187.291479 113.142854 186.836193 155.637977 3.897092 318.692874 65.636505 318.414422 79.380864 2.550125 36.287081 24.414050 35.366815 10.559122 3.074414 83.375141 136.852369 87.331590 180.583692 2.151942 225.628900 176.874542 228.591872 202.113681 5.548874 371.816999 432.116211 357.947644 356.907707 3.374729 84.565941 15.615590 85.739608 39.430954 2.250859 221.893187 190.625270 222.486208 150.634063 1.564939 197.246527 376.869664 196.151458 300.617439 1.303720 213.443352 74.263814 211.761799 50.544408 3.740612 466.262593 109.449997 463.341674 85.598466 3.241177 91.488082 146.812183 94.319894 185.719989 4.738228 180.632441 209.048127 171.330952 173.266426 3.170427 428.115051 313.695394 438.133806 313.870145 1.424207 74.592940 152.027082 76.268617 163.398553 5.857730 297.104687 143.138152 298.749664 114.410769 2.138611 388.539228 414.948884 401.924025 398.403445 6.889920 421.931288 149.381592 425.592386 118.121180 2.113923 88.700756 166.824258 86.167239 138.077212 1.941653 319.314049 209.389274 313.161486 183.116456 2.796178 500.187726 71.813791 499.057349 56.804782 1.929686 121.931328 9.373745 122.377393 29.391659 1.500315 226.015459 151.827493 227.832104 166.758550 4.477412 355.084869 331.399897 343.128783 313.535865 2.764717 491.616231 83.168851 489.075489 68.175755 2.067823 45.413561 20.628073 45.777149 45.640958 2.463400 282.972269 51.872038 282.632966 69.365456 1.443689 51.643669 200.711172 40.868229 171.784396 2.342737 361.048778 106.926735 363.340887 88.151356 1.695216 156.884664 390.639342 179.310046 375.528604 2.455887 103.055209 15.635955 105.413178 30.658249 2.397875 191.516858 301.834883 195.115637 381.841685 2.117301 210.285291 306.665265 217.227063 336.793883 2.907776 289.073204 234.946104 297.001444 239.135723 2.731510 336.839650 450.670381 327.757983 443.596166 2.958382 217.725166 338.199835 211.681623 406.857978 2.310680 255.742512 227.370295 283.351677 231.669190 2.825011 202.842126 66.868771 203.227281 49.377252 1.304732 214.505890 411.895896 219.300547 381.863114 2.074610 371.267082 160.584582 369.187544 191.862537 1.416480 13.186861 206.587476 30.940785 210.407269 2.784755 122.468853 383.345787 110.240335 347.004436 2.335792 230.562913 203.367587 227.767312 217.057222 3.173962 262.990764 109.376577 263.269915 133.137983 2.631984 96.075888 151.795361 98.506669 165.557587 1.809638 186.393053 49.408557 185.514828 36.795635 2.841266 93.348249 186.872709 93.340701 194.375217 4.996224 156.104923 78.262386 155.247196 65.650695 4.564391 232.253199 149.345564 233.324489 163.109473 1.634224 77.634320 100.820004 75.928257 85.591027 3.855607 119.478633 214.810967 150.700022 218.785705 2.299226 381.161055 149.520637 378.857980 138.230466 1.949871 377.491610 176.948983 374.499120 201.889892 2.333286 476.442492 223.198581 474.098735 209.422000 1.651585 ================================================ FILE: thirdparty/LSD/chairs.pgm ================================================ P2 512 512 255 45 45 42 41 42 41 40 40 50 56 67 105 160 88 39 34 34 34 34 67 75 69 72 74 63 45 29 33 52 67 73 79 80 81 80 80 75 73 74 73 73 71 58 59 80 96 75 74 67 103 99 132 228 227 88 25 32 32 28 31 41 48 47 43 44 48 47 47 47 47 50 48 46 45 42 37 59 82 59 38 34 33 31 27 29 46 31 27 27 25 26 39 31 28 34 42 40 38 35 37 36 36 38 37 37 35 36 36 38 37 30 36 65 72 53 46 33 33 44 51 29 29 31 41 36 28 26 35 40 43 44 38 38 41 53 59 61 62 65 68 70 78 97 145 128 89 74 72 78 79 83 80 71 70 60 48 41 36 35 32 30 36 44 45 42 39 39 37 38 38 40 41 43 47 53 57 53 56 72 105 101 69 59 58 58 57 53 61 61 56 46 39 35 33 34 35 34 34 38 41 39 38 38 39 44 44 46 46 47 47 45 43 43 47 53 54 51 49 55 55 45 43 35 35 36 36 39 38 38 36 35 36 37 35 40 45 47 47 53 70 31 33 29 33 30 40 39 37 36 37 39 40 41 39 40 41 41 47 51 53 54 54 50 45 39 50 53 35 34 36 36 35 35 36 35 37 46 48 42 37 29 50 62 35 36 34 32 33 32 30 32 34 37 41 49 47 39 33 29 89 47 37 37 37 37 37 46 56 66 74 81 79 76 69 88 84 70 72 76 72 78 78 72 71 68 66 64 52 47 53 62 59 59 55 54 53 49 43 37 35 34 32 34 32 32 32 34 33 34 37 33 43 72 68 62 60 57 53 55 53 48 45 44 43 44 41 36 35 35 33 37 48 51 44 34 30 30 29 29 29 31 29 27 29 30 29 30 29 27 26 21 25 52 75 72 43 44 45 47 47 48 53 52 56 57 55 54 50 47 51 50 45 41 43 42 41 38 38 39 35 33 30 30 30 29 29 30 29 29 26 22 22 32 55 81 78 37 33 31 32 31 33 33 34 34 31 32 30 29 32 36 34 38 42 41 35 34 34 33 34 34 35 36 35 35 33 31 28 28 29 29 29 28 24 26 51 90 103 97 62 32 28 31 32 34 33 31 33 35 35 35 38 35 32 35 37 37 34 34 37 33 34 32 31 29 29 31 30 29 31 33 33 77 78 78 78 75 74 74 73 73 73 75 73 75 78 56 39 34 35 32 45 91 74 75 77 73 51 30 32 63 72 71 71 67 66 65 63 63 65 67 76 80 84 89 100 113 122 146 145 84 91 129 185 213 213 96 27 32 27 27 29 44 49 58 78 88 88 84 81 77 76 80 81 78 79 84 89 97 112 120 101 90 81 39 26 33 43 31 28 28 25 24 40 34 28 33 40 40 40 38 41 43 45 52 53 52 54 53 52 49 47 48 45 45 57 54 45 39 40 49 53 29 27 33 41 30 25 25 34 43 42 38 35 36 48 76 67 64 63 59 57 56 59 58 57 58 60 63 66 70 75 81 91 101 147 161 90 40 36 32 30 33 38 44 43 38 38 37 39 39 43 77 96 100 98 95 88 79 76 79 81 85 80 81 87 93 101 108 116 125 128 152 113 41 35 34 35 35 32 35 42 39 37 39 41 45 49 50 52 54 55 53 46 43 46 53 53 51 50 50 56 49 44 37 35 36 36 37 37 38 37 36 37 38 36 39 44 47 47 44 73 40 33 32 31 30 38 38 37 36 36 40 40 42 42 42 43 42 47 52 55 54 53 50 46 39 42 63 36 36 36 36 33 35 37 36 38 45 47 41 37 30 37 77 40 37 36 34 32 34 32 33 34 35 40 49 46 40 37 26 69 71 39 38 36 39 49 90 104 100 96 91 87 83 78 76 73 65 65 69 69 78 85 94 108 117 127 141 137 140 92 63 62 59 57 55 55 48 46 38 36 35 32 33 32 34 34 35 46 74 89 96 98 95 94 89 89 89 84 84 88 83 85 92 98 105 108 106 104 97 88 75 56 53 43 36 30 30 30 29 30 30 29 27 28 29 29 29 28 27 27 29 32 31 56 92 100 104 104 98 94 93 93 85 88 90 91 95 93 96 103 105 110 110 111 111 109 101 85 47 37 32 29 30 29 27 28 29 29 29 29 29 30 31 27 27 33 37 33 30 32 34 37 40 36 37 35 36 36 32 36 39 39 34 34 35 34 37 38 37 37 37 39 41 42 43 38 33 31 29 29 29 29 30 30 30 31 26 27 32 42 33 31 30 32 34 33 36 38 38 40 42 47 49 48 53 52 51 54 54 52 52 52 48 45 43 43 42 40 38 41 43 45 64 63 64 62 68 71 69 71 81 92 106 115 136 185 121 50 35 33 33 30 88 86 82 89 87 66 29 34 31 33 42 50 59 57 55 53 51 53 53 53 52 50 50 50 51 54 81 125 118 88 128 185 207 205 90 26 34 31 28 29 41 48 50 46 44 47 53 53 54 53 51 52 50 52 52 54 55 60 67 78 101 159 141 63 28 39 32 28 30 25 25 42 35 29 33 42 41 58 95 101 103 99 88 85 85 83 87 87 90 94 103 108 109 114 121 121 110 131 96 56 27 27 33 42 35 27 26 34 42 40 33 34 34 31 26 31 44 53 54 54 54 54 57 57 58 54 51 49 50 51 50 48 45 45 58 85 57 40 36 31 31 38 45 42 38 36 40 43 44 52 67 55 46 47 51 54 58 58 58 59 61 61 56 55 55 54 52 52 52 56 102 115 89 47 35 33 34 30 35 45 42 40 37 88 166 167 169 171 177 185 160 57 45 47 54 55 52 51 50 51 59 44 38 38 34 35 36 37 35 36 39 38 38 38 39 44 49 48 41 63 58 32 32 29 29 37 38 38 36 37 38 39 40 41 43 45 45 48 51 55 54 53 50 47 36 32 69 43 36 35 35 35 35 36 36 38 43 46 44 39 29 26 77 49 37 37 38 35 34 35 36 36 36 41 50 48 43 40 27 39 93 44 38 38 41 46 48 54 63 62 60 61 59 58 59 57 55 57 53 53 52 51 50 49 48 49 55 71 125 135 108 63 60 56 56 54 50 45 41 38 36 33 33 32 33 35 40 60 70 68 59 53 49 47 50 52 51 49 49 48 49 46 47 49 53 54 61 78 97 118 165 144 79 44 34 29 31 30 29 31 27 28 28 29 26 26 27 27 28 27 28 29 45 64 62 58 53 51 50 50 47 47 49 47 45 44 44 46 47 51 53 56 60 71 88 107 142 175 125 65 35 31 30 30 29 29 29 29 30 29 29 31 31 29 28 28 34 35 35 44 59 70 78 81 85 89 91 88 86 90 89 86 92 93 89 92 97 94 91 92 92 94 101 113 93 59 39 32 30 28 28 29 30 29 29 30 30 28 29 30 33 30 31 34 32 39 63 80 93 93 97 97 93 89 85 82 79 76 76 73 82 84 90 96 101 105 111 117 128 137 146 126 56 56 55 54 54 56 55 55 52 52 57 57 62 88 97 78 37 35 31 33 67 105 94 123 144 114 25 31 33 34 41 52 61 57 54 52 50 49 50 51 50 50 50 51 50 47 43 47 70 84 110 154 202 206 105 26 35 34 28 29 38 44 30 32 40 51 58 59 55 54 52 52 51 52 50 50 50 50 48 46 45 52 72 83 44 41 33 27 30 25 24 41 36 30 32 42 43 50 52 53 54 54 54 55 53 54 53 53 54 53 54 57 61 62 66 73 87 170 158 97 26 30 35 44 35 28 27 32 43 41 33 34 32 29 31 32 48 54 54 52 54 56 72 79 74 64 47 45 45 44 43 39 42 45 49 51 62 46 37 33 32 36 46 44 40 40 45 50 55 47 46 40 48 53 56 59 59 58 59 58 58 58 59 59 56 56 53 54 54 56 53 57 69 62 35 37 35 31 36 45 43 41 37 95 179 173 173 176 180 191 185 66 45 45 53 55 54 53 50 48 63 48 38 35 34 34 35 36 36 37 40 39 39 40 41 44 50 47 42 49 73 39 30 29 33 39 40 39 38 40 41 42 41 41 44 45 46 48 53 55 56 54 50 46 37 31 62 55 35 37 35 37 37 36 35 37 43 43 44 40 33 23 66 64 33 36 37 36 35 35 38 37 37 41 49 52 47 42 31 25 95 56 42 41 39 33 39 47 64 64 59 58 58 57 54 55 55 54 53 53 52 51 51 51 50 50 50 47 47 48 79 70 58 56 57 54 51 48 44 41 38 36 35 34 34 35 35 33 39 56 60 58 57 58 57 56 54 54 51 50 51 50 50 50 51 52 50 48 45 46 55 63 84 51 31 30 32 31 31 30 29 29 29 29 29 28 28 28 28 30 27 31 33 35 39 47 49 52 54 52 49 51 49 50 49 49 48 49 49 51 51 48 48 45 42 42 45 50 61 73 37 32 29 30 29 28 29 27 30 31 31 32 29 29 29 29 33 37 49 85 104 96 91 85 80 73 66 61 62 58 58 58 60 62 64 70 72 75 77 82 91 105 148 200 179 117 45 33 33 30 29 28 29 29 29 31 29 29 29 27 31 31 34 36 37 49 67 65 58 55 56 54 50 48 49 51 50 49 52 51 53 53 50 50 54 55 61 65 78 94 139 150 58 53 52 53 53 52 51 52 52 51 51 53 52 53 54 73 58 39 38 35 45 115 182 193 179 120 28 32 33 35 41 55 58 58 56 55 50 46 48 47 50 48 49 49 47 44 45 47 53 64 98 125 175 195 130 32 36 36 29 29 36 44 31 33 39 51 56 56 51 51 51 49 49 49 47 46 45 46 47 45 46 48 51 59 62 49 37 28 31 23 27 38 33 29 32 41 41 35 38 41 53 56 58 57 54 53 54 54 54 52 53 53 53 54 53 56 50 45 53 78 52 31 38 46 37 27 26 30 43 42 36 36 35 32 32 31 53 57 56 54 50 54 85 97 70 55 44 40 38 38 37 35 36 42 47 49 55 52 35 32 30 33 45 46 42 39 82 163 154 68 44 38 46 51 58 60 60 59 61 60 60 60 61 60 57 55 55 53 54 55 57 55 55 65 47 37 34 34 35 43 42 43 38 74 184 186 187 191 201 201 198 91 46 48 52 53 53 51 50 48 62 55 39 37 35 34 35 36 37 37 37 38 39 40 43 44 48 49 43 41 76 52 34 28 29 39 41 40 40 44 43 44 41 43 45 45 48 48 51 54 55 55 49 45 41 33 48 66 36 39 38 37 38 37 38 39 43 46 43 41 35 26 46 80 35 37 36 36 37 39 39 39 40 43 50 54 51 46 37 23 74 88 43 42 40 33 36 38 61 61 57 55 57 54 56 56 54 52 51 52 51 48 50 47 47 46 46 47 49 48 47 59 59 58 58 55 50 48 43 42 40 37 36 35 34 35 32 29 35 55 61 58 59 59 58 57 54 51 49 48 47 49 49 51 50 50 48 47 49 48 49 50 48 52 36 33 33 32 30 30 30 30 30 30 29 28 28 30 32 29 29 31 31 36 44 51 54 55 55 52 50 49 47 48 47 47 48 48 48 50 50 50 49 49 46 48 48 46 43 38 40 33 31 31 31 30 30 31 33 33 30 31 30 29 29 27 32 36 41 42 37 40 44 46 51 50 49 50 50 50 50 49 48 50 50 50 49 48 48 47 43 40 36 39 48 61 55 37 29 28 28 29 31 31 30 29 30 30 28 27 32 32 34 33 35 33 32 33 39 42 46 46 44 44 43 45 47 54 83 89 77 54 46 44 46 47 47 47 44 41 37 35 58 53 53 52 51 51 50 49 51 51 51 52 52 51 50 54 73 42 38 35 35 86 179 180 171 129 32 28 32 34 39 53 59 59 54 51 50 47 45 45 46 47 47 47 46 46 48 50 51 54 91 114 158 189 155 41 35 39 29 31 35 45 32 31 35 51 58 56 51 51 51 50 49 48 47 44 43 43 45 43 46 45 50 51 65 56 37 30 31 25 26 39 33 29 30 40 43 36 37 40 52 58 55 56 52 55 56 61 59 55 53 53 53 54 54 54 54 54 53 53 66 39 38 48 42 31 31 31 46 44 39 38 40 36 37 31 53 61 60 56 55 58 65 64 48 41 41 37 35 36 35 34 35 41 47 51 51 57 37 31 30 32 44 44 40 38 73 158 139 70 43 37 44 54 61 61 62 63 63 62 65 67 63 61 57 56 55 55 55 56 56 56 54 64 59 38 32 32 35 44 44 45 41 61 176 184 188 193 200 203 203 107 42 48 50 55 54 52 48 45 58 60 39 37 35 35 35 39 40 38 36 37 39 40 43 44 48 48 42 37 69 62 30 29 31 40 42 41 41 43 42 44 43 43 44 45 48 48 50 53 55 57 49 47 43 33 40 74 39 39 39 42 40 40 40 41 45 50 44 42 40 33 33 83 42 39 41 41 41 40 42 42 44 49 53 55 55 51 44 29 51 116 49 43 41 35 36 35 52 60 56 55 55 55 57 56 52 51 50 51 50 48 48 48 46 47 46 47 48 46 47 54 64 60 58 56 52 48 44 44 42 38 37 34 35 36 34 33 33 52 64 58 58 57 57 57 54 50 49 47 46 46 48 48 47 47 46 45 46 49 48 51 49 54 43 33 36 35 34 31 33 31 29 32 31 31 31 33 34 32 31 34 34 37 48 54 57 57 55 52 50 49 49 47 44 45 45 46 46 48 49 49 48 46 47 47 47 46 44 43 43 34 31 31 31 30 29 33 34 35 34 34 31 30 30 28 31 35 31 34 42 50 53 52 54 53 51 51 50 49 49 46 47 48 49 48 48 50 47 49 47 48 48 46 44 42 39 39 29 29 30 30 30 32 32 32 31 29 26 27 31 33 37 36 33 30 33 36 44 46 46 46 46 46 44 42 42 61 150 148 116 52 45 44 44 44 46 46 44 44 45 45 59 56 54 52 54 53 49 48 49 50 52 53 51 52 50 48 72 59 36 36 34 44 146 179 179 167 33 29 31 34 38 49 62 59 54 51 47 45 44 44 44 44 44 44 47 45 48 48 48 47 78 106 117 159 170 48 35 44 28 31 36 48 34 34 33 48 57 56 53 52 50 47 47 48 47 42 39 40 45 44 43 45 45 48 63 69 42 30 33 26 29 38 35 28 33 42 47 40 43 44 55 60 61 56 56 61 66 66 61 56 54 53 53 53 54 55 57 55 52 50 64 59 57 66 67 63 64 67 72 76 72 73 76 75 76 73 87 91 87 83 77 72 68 55 45 45 43 36 32 34 35 33 35 42 46 48 50 57 42 29 30 31 43 44 41 40 54 159 142 84 38 36 42 53 60 62 63 75 111 122 134 148 164 145 69 54 56 56 56 56 54 55 53 55 68 42 31 32 35 44 43 46 43 43 176 195 197 198 200 202 199 125 38 49 53 54 53 53 48 45 51 69 40 38 36 34 35 36 38 38 39 37 38 40 41 43 47 47 42 36 48 82 29 30 33 40 42 42 42 42 42 43 43 44 43 45 49 50 51 54 55 55 52 48 44 38 31 66 48 42 42 43 49 53 53 55 60 65 64 63 59 57 49 85 80 57 53 50 49 49 45 44 48 50 56 62 61 58 52 35 34 119 109 73 55 38 39 35 51 59 57 54 55 55 54 54 54 52 53 52 49 48 46 48 48 47 49 47 48 47 45 51 68 60 57 55 53 51 46 44 44 43 40 38 39 39 34 35 32 44 61 59 58 57 55 54 51 48 48 46 45 44 44 45 45 46 45 44 45 47 47 49 50 53 51 37 36 36 35 33 32 31 30 31 32 35 35 37 40 38 36 39 40 41 49 58 59 57 55 55 53 49 48 46 45 47 46 44 42 43 46 47 47 46 47 48 48 47 44 43 44 39 35 33 31 32 33 33 34 34 34 34 32 30 29 30 28 35 35 41 43 51 55 57 55 55 53 53 50 48 46 45 47 47 48 48 49 50 48 49 48 50 48 48 47 44 37 37 30 29 30 31 33 33 33 33 32 32 29 27 32 35 38 37 33 33 36 40 46 47 47 47 47 46 45 43 40 55 161 149 119 46 45 42 43 45 45 45 44 47 46 44 60 56 56 56 56 55 53 52 51 54 53 54 55 54 51 51 65 75 38 34 35 32 107 175 183 172 29 28 30 32 35 48 62 59 54 50 48 47 45 44 44 45 44 45 45 46 47 47 48 48 65 100 109 115 111 42 39 46 32 32 37 52 37 34 33 48 57 57 53 52 49 48 46 46 46 42 38 39 42 44 44 43 43 47 55 78 53 40 44 40 41 49 45 43 46 52 51 45 48 46 53 61 61 59 55 57 59 56 54 52 53 53 54 53 53 55 55 55 55 60 98 100 93 88 77 71 67 67 70 68 67 65 65 68 75 76 86 91 100 113 125 129 173 139 58 43 43 35 33 35 37 34 36 41 47 47 48 55 49 30 30 32 42 46 42 41 47 147 152 92 37 36 43 56 62 63 63 139 200 200 211 212 209 206 130 52 55 54 55 55 56 56 51 52 70 50 32 31 37 46 46 46 44 41 116 137 136 132 125 118 107 80 41 49 53 53 53 53 50 44 47 73 48 39 37 35 37 37 38 39 39 39 40 41 41 42 47 49 43 38 38 81 40 29 36 43 42 43 43 43 43 45 46 45 46 45 47 48 51 54 54 56 54 49 46 41 28 49 65 56 91 103 112 111 106 105 106 103 101 98 88 90 95 103 108 106 105 111 116 117 115 114 109 102 89 73 60 60 60 54 45 91 150 156 109 36 37 35 50 59 58 54 55 55 55 55 56 54 55 54 51 50 48 46 47 47 57 57 60 58 55 56 77 69 59 56 53 49 43 42 45 48 47 44 42 41 35 36 32 41 60 60 58 57 55 53 50 50 50 49 46 44 42 40 44 45 46 43 44 47 49 46 50 54 62 54 52 55 55 56 60 57 56 53 53 52 44 43 42 39 40 43 43 43 57 64 61 58 55 54 51 49 47 45 46 47 46 44 44 43 43 45 49 48 47 46 49 48 45 44 45 42 35 34 36 34 35 38 38 38 36 35 34 34 34 31 33 38 39 44 49 55 58 59 58 59 54 55 51 49 46 45 44 46 48 47 46 47 47 49 48 48 48 48 45 45 41 39 29 28 32 34 35 35 33 33 34 34 32 28 32 38 39 39 36 34 37 43 49 51 48 47 46 45 45 44 42 48 104 101 81 43 44 43 41 41 42 43 42 44 46 44 77 76 76 73 74 75 75 75 74 75 76 75 78 76 70 68 72 90 52 38 34 33 59 152 177 171 43 27 30 30 34 46 61 57 55 51 49 53 54 56 60 64 65 65 66 66 64 65 64 64 71 101 110 103 136 66 45 52 39 38 40 55 38 33 31 45 56 56 52 52 50 49 47 45 43 41 40 41 53 65 70 77 85 91 90 95 89 83 75 71 78 83 87 93 99 108 114 116 125 135 135 155 126 73 54 55 56 56 53 52 52 53 52 51 52 52 50 52 48 48 39 33 37 42 43 42 41 42 43 41 39 38 39 37 37 42 42 47 48 47 45 46 79 95 105 60 42 39 36 35 37 35 36 41 48 48 49 49 60 31 29 30 43 45 40 39 41 110 140 80 37 37 41 54 62 63 70 168 184 194 201 200 211 207 178 66 57 54 55 55 54 55 51 50 63 67 29 32 39 45 46 46 43 41 36 37 39 39 39 41 44 46 47 49 51 54 55 53 52 46 40 61 64 40 37 38 40 42 42 40 39 38 39 40 42 43 47 49 45 40 31 66 62 29 38 44 43 41 41 43 45 44 44 45 43 44 47 49 52 53 54 58 57 52 48 46 31 35 75 76 76 68 66 62 56 58 58 56 54 53 49 45 40 38 35 35 38 40 49 53 64 81 107 134 182 183 111 72 67 66 74 102 131 154 114 34 38 34 50 59 58 54 54 56 56 55 59 72 87 95 100 104 107 106 102 99 93 92 87 86 91 93 97 101 106 106 110 113 113 116 120 122 115 111 73 46 36 34 32 38 57 61 58 58 56 54 52 51 48 49 46 43 41 40 41 40 52 69 87 95 104 109 112 110 111 107 102 103 99 95 95 100 103 109 117 122 128 129 136 143 153 157 168 158 128 92 67 60 53 50 48 46 44 44 44 43 44 44 46 44 43 44 47 48 49 48 48 46 47 49 58 66 59 60 67 69 73 72 74 75 78 78 79 77 79 77 71 74 76 73 77 81 80 80 78 82 75 65 57 51 46 44 44 45 46 45 45 45 48 47 47 48 47 48 47 44 41 40 34 34 35 38 40 37 38 40 41 42 40 39 40 47 46 48 46 43 44 51 53 52 53 50 47 48 50 49 47 45 42 44 42 40 39 42 39 39 41 41 41 44 44 44 85 79 74 71 71 73 74 77 74 76 85 90 99 109 118 126 138 169 92 37 33 32 41 106 151 165 46 25 31 29 32 43 61 58 53 51 53 71 101 101 101 99 93 87 85 83 79 82 85 89 98 111 126 127 187 140 117 120 107 98 59 53 39 33 33 43 56 56 53 52 50 48 46 44 41 41 41 43 72 81 71 66 57 50 49 51 47 46 45 41 39 40 41 43 46 48 48 50 57 61 67 87 111 101 63 59 56 56 53 52 52 53 51 49 51 52 50 51 41 34 30 32 43 47 42 37 36 37 36 36 36 37 36 35 38 37 38 42 46 50 55 56 51 53 68 74 41 38 36 35 37 36 39 44 46 48 49 46 61 38 30 31 43 45 40 40 38 44 49 44 40 37 41 54 62 63 62 153 202 206 188 186 206 211 200 84 54 56 56 54 56 55 51 48 55 76 33 32 39 45 47 46 43 39 41 43 47 45 44 43 44 46 47 48 50 55 55 55 55 48 38 50 74 43 37 39 41 43 41 41 41 39 40 41 41 43 46 47 46 41 32 46 83 35 37 44 44 43 43 44 45 44 43 42 42 42 46 49 53 55 57 61 59 55 51 50 38 31 46 44 48 52 57 58 57 56 57 57 53 55 50 43 39 35 36 35 34 34 35 36 33 34 35 38 53 70 101 100 68 78 115 133 113 124 88 32 36 33 51 59 59 56 55 55 56 54 70 93 94 85 74 69 63 56 52 49 45 45 43 40 41 41 42 44 47 48 54 56 63 69 84 110 147 187 164 100 30 31 30 36 52 60 59 58 55 55 52 51 48 50 47 46 44 43 39 41 72 83 77 69 60 57 54 51 43 41 41 40 41 41 41 44 41 40 42 45 49 51 56 58 69 82 110 136 153 139 91 58 55 54 49 47 45 45 45 44 43 43 45 45 46 45 45 45 48 46 45 47 65 93 108 112 110 108 102 99 89 87 80 78 79 79 79 79 86 89 90 98 104 114 130 136 147 162 170 183 181 136 76 54 48 44 44 45 42 42 43 44 46 46 46 46 47 47 46 45 41 39 40 49 69 80 86 89 91 96 98 96 89 88 90 89 89 94 92 88 93 98 100 93 84 76 68 59 55 58 56 56 48 44 40 41 38 39 36 38 38 38 39 41 44 44 53 51 48 48 46 44 40 39 39 36 35 35 36 37 38 44 61 122 118 87 38 35 33 68 122 120 45 27 30 27 33 42 58 57 54 50 47 45 40 46 52 58 65 69 72 71 72 74 77 76 75 77 76 77 80 87 103 112 132 179 181 120 51 40 35 45 58 57 53 51 49 47 46 43 39 40 39 39 31 31 39 43 40 38 37 34 32 33 37 38 34 34 35 37 38 37 36 37 37 40 46 51 50 58 66 60 57 56 55 55 54 53 51 51 49 49 48 46 42 33 32 30 41 45 40 36 36 36 37 35 35 37 36 35 37 39 38 39 41 46 53 55 57 56 52 66 54 37 37 35 38 37 40 46 46 47 49 48 55 53 30 30 42 45 41 41 40 41 43 41 39 37 42 54 62 62 57 125 201 208 197 183 201 213 211 110 49 56 56 57 56 56 53 50 47 73 50 34 41 46 45 45 43 41 41 44 44 44 42 42 43 45 48 49 50 54 54 56 55 50 39 37 75 52 42 41 42 42 40 42 41 40 40 40 42 42 43 47 46 43 33 31 83 55 37 47 44 43 45 44 45 45 43 42 41 41 46 48 55 55 59 63 61 61 57 53 46 37 37 38 42 50 54 56 57 57 56 54 53 50 47 41 36 36 33 33 31 31 31 31 34 33 35 34 38 39 43 69 106 116 117 126 141 189 136 30 35 36 50 62 59 55 54 54 56 56 45 36 40 49 55 51 43 42 40 39 38 37 39 36 36 35 37 36 36 37 37 37 35 37 37 36 33 34 43 84 57 32 29 39 53 59 58 57 58 57 54 52 49 49 47 47 45 42 40 42 38 35 39 40 38 36 35 36 36 35 34 34 47 88 96 79 35 36 34 32 33 35 37 37 38 38 35 33 31 35 70 64 52 52 49 47 46 46 45 47 45 44 45 43 43 42 43 44 46 43 44 48 59 58 48 44 39 38 40 41 38 40 40 39 40 39 40 40 41 40 41 37 36 34 36 36 38 45 68 95 137 127 126 85 47 45 44 45 41 41 42 42 44 45 45 45 47 48 45 43 36 43 77 94 94 87 81 76 69 68 65 65 57 56 54 54 51 52 58 59 69 82 95 105 123 126 132 146 162 172 153 113 71 51 42 39 38 39 35 36 37 37 37 40 41 43 57 54 51 51 54 53 51 49 44 45 43 41 37 36 35 38 36 34 58 84 60 41 35 40 114 130 53 25 29 26 34 43 58 58 53 50 37 27 30 49 86 92 82 78 70 64 60 59 60 61 64 63 64 69 73 75 82 88 104 120 140 159 136 138 71 44 61 58 54 52 49 47 48 45 42 42 40 34 31 30 43 46 37 33 35 33 36 37 38 40 37 37 37 38 37 38 39 40 38 42 48 51 54 50 62 63 61 58 57 54 54 54 52 49 49 49 47 47 41 33 33 30 42 47 41 35 34 34 36 36 35 35 37 36 37 38 37 38 40 44 53 56 55 53 53 58 61 39 35 35 38 38 43 46 45 48 51 47 50 63 31 32 43 45 41 41 41 43 44 42 38 38 40 52 64 61 56 93 207 214 205 195 206 198 186 108 50 56 57 58 57 55 51 49 45 60 75 36 40 47 46 46 45 42 42 43 43 44 43 44 44 44 47 49 52 54 56 56 55 51 44 33 66 62 40 41 43 42 42 41 40 40 41 41 43 42 46 48 49 46 38 27 77 80 38 47 47 45 51 53 56 57 58 59 58 56 56 53 53 59 62 62 60 59 58 57 51 47 42 41 42 49 54 55 55 55 56 55 52 51 48 43 37 36 35 33 32 32 31 32 32 34 33 35 33 32 40 54 118 151 186 198 187 201 126 35 37 36 53 61 58 55 53 55 56 56 39 37 43 55 57 53 45 40 38 38 36 36 35 36 37 35 39 37 36 35 37 37 35 36 37 38 39 38 39 41 54 40 30 38 56 60 57 58 58 56 56 52 50 49 46 45 44 43 40 36 32 37 42 42 38 35 35 36 34 35 33 34 52 129 132 118 32 34 33 33 32 32 33 34 33 35 35 36 39 39 40 58 55 53 48 47 45 45 44 45 45 45 47 45 42 43 43 43 45 42 41 41 39 41 44 42 41 39 37 38 38 41 41 38 38 38 37 37 37 38 37 37 37 38 39 39 41 40 39 40 41 41 48 75 53 45 43 44 43 44 41 41 43 44 45 41 44 45 45 43 35 40 42 40 40 40 41 41 40 42 46 46 43 40 41 39 36 34 36 37 36 39 41 43 45 48 51 57 69 94 130 135 121 63 45 41 38 37 37 37 36 37 35 39 38 43 87 92 89 89 87 86 79 75 78 83 87 86 86 88 91 86 85 89 80 85 95 73 53 30 85 134 65 23 28 25 32 42 57 57 51 50 37 26 28 35 32 32 38 41 42 42 40 37 37 35 35 37 36 33 34 33 32 33 35 36 38 42 75 148 140 97 66 59 55 52 50 47 46 44 41 40 41 35 31 28 41 49 43 40 43 49 61 64 71 72 70 72 79 85 90 89 88 78 82 85 87 91 94 92 86 92 87 73 53 53 52 53 52 50 49 46 45 46 42 32 32 27 40 50 40 36 35 35 36 37 35 36 38 38 38 38 38 39 41 44 52 56 53 52 53 48 66 47 37 36 39 40 43 44 44 46 46 41 35 58 43 31 43 44 41 40 40 43 43 41 38 37 39 54 61 59 58 63 112 109 121 144 122 67 52 51 52 55 58 56 56 55 54 48 44 43 93 47 41 47 47 47 44 44 45 43 43 44 46 47 47 44 45 47 50 52 56 57 56 54 46 33 48 82 39 42 43 43 41 42 42 41 40 41 43 45 47 48 49 46 45 45 87 119 99 108 111 111 110 105 105 101 95 92 91 93 97 106 112 115 118 121 125 129 130 132 124 109 104 64 42 50 53 54 53 54 57 55 50 49 47 43 37 35 35 33 31 29 29 30 33 34 64 98 110 112 111 111 118 132 135 142 141 148 110 87 94 92 99 94 93 92 87 80 74 67 53 47 48 61 61 54 50 42 37 37 36 36 36 36 36 35 36 36 35 36 37 35 36 35 35 36 36 37 38 41 47 46 31 40 59 60 59 58 57 58 56 52 48 49 45 45 47 46 41 36 34 37 45 46 40 38 35 35 34 35 35 35 46 120 130 120 34 33 34 33 34 34 32 34 35 34 34 34 36 37 35 52 57 52 48 49 47 50 49 50 50 52 51 53 55 53 50 52 49 46 44 38 42 43 45 45 40 42 40 41 44 44 41 40 38 35 35 35 36 36 36 35 36 35 35 34 34 34 35 38 40 43 44 39 48 43 44 43 42 41 42 40 43 43 42 43 46 46 47 45 37 31 31 32 36 40 41 40 36 36 35 35 33 34 36 35 37 35 32 32 30 31 35 33 29 31 33 31 35 34 30 29 53 69 47 40 37 36 38 38 37 35 34 36 38 43 42 43 47 49 51 51 47 44 42 42 43 44 47 48 56 59 71 82 93 109 137 164 164 71 54 125 72 21 31 26 32 43 56 56 50 50 39 29 25 25 30 33 40 46 44 39 35 34 34 35 36 34 33 34 34 33 32 33 31 34 34 34 33 39 56 87 75 59 54 53 50 48 47 44 42 42 41 36 30 29 39 55 76 99 98 96 90 75 70 66 64 66 66 64 64 63 62 62 68 73 80 87 95 105 128 141 181 169 85 54 54 52 50 50 50 48 46 47 43 33 33 26 38 53 39 37 37 35 37 36 36 37 38 40 41 39 40 39 41 43 51 55 55 53 54 49 66 60 39 35 39 42 43 45 45 46 43 40 30 47 58 35 43 44 41 42 41 41 43 42 37 38 38 52 60 59 59 60 58 59 58 63 60 59 57 56 54 56 57 56 56 56 54 50 45 36 87 64 40 46 47 47 45 47 47 45 44 45 47 47 47 46 47 49 50 51 54 57 56 54 49 38 35 86 49 40 44 41 38 40 42 42 41 41 44 45 48 50 51 49 55 78 92 88 83 78 71 67 65 62 60 59 56 53 50 49 49 46 47 46 48 54 59 62 72 78 97 131 194 158 81 47 53 53 53 55 58 55 52 51 49 44 38 36 36 33 32 31 30 31 33 40 58 60 65 65 62 55 51 46 47 45 48 50 50 52 53 54 56 64 71 81 93 105 120 133 140 141 128 121 84 60 51 42 39 37 36 37 38 37 37 36 36 36 35 36 36 38 39 37 38 38 40 42 49 54 68 80 75 85 92 91 89 88 90 93 98 97 91 88 85 81 76 69 62 50 39 37 48 46 45 45 39 36 33 35 34 34 39 69 79 72 37 34 33 34 36 36 36 36 35 34 33 33 34 33 33 47 68 80 93 97 104 107 113 115 110 110 107 107 108 108 108 109 111 109 102 97 93 92 86 75 60 54 48 49 54 51 50 45 40 38 36 35 37 36 37 34 35 34 34 35 33 33 33 35 39 43 46 38 45 44 44 44 43 45 45 43 44 44 48 46 47 49 52 47 40 32 38 35 41 44 42 39 35 37 36 36 34 35 37 38 37 36 37 36 33 35 35 31 29 29 29 28 31 31 32 35 37 41 50 40 40 39 38 37 38 36 35 35 38 43 27 33 45 50 47 45 37 37 33 33 32 32 34 32 30 32 30 30 34 36 34 74 128 123 71 101 77 21 30 26 31 38 59 56 48 47 40 28 27 27 30 32 38 47 44 37 35 33 34 32 34 32 33 35 33 32 32 34 32 33 35 35 34 37 38 42 68 64 54 52 50 49 48 45 43 41 42 35 32 28 36 56 56 41 35 35 38 39 36 39 40 40 38 39 38 35 36 36 35 38 41 45 48 47 46 45 74 85 116 88 52 52 51 49 48 48 49 45 42 31 35 29 34 50 43 38 37 36 34 35 37 38 38 40 40 38 38 38 38 42 51 54 55 52 51 47 56 68 42 37 40 43 41 41 44 44 42 37 29 31 72 44 45 45 44 43 42 42 45 43 35 37 38 51 59 59 61 60 59 59 61 60 60 59 55 55 55 55 57 57 57 57 56 51 45 37 62 91 37 45 47 47 46 47 48 50 49 48 47 47 47 48 49 50 51 51 55 56 56 56 49 41 28 75 77 42 42 41 39 38 41 43 42 41 44 46 49 52 53 52 50 41 45 57 61 62 58 58 58 57 57 57 54 52 50 47 44 40 40 39 38 37 39 41 40 40 37 35 37 53 100 69 53 51 54 55 57 55 52 51 51 45 35 35 38 35 33 31 31 32 35 34 25 33 50 59 58 57 52 50 45 42 37 35 36 36 36 35 33 33 29 30 30 31 30 32 54 77 113 178 177 115 56 44 39 38 36 38 38 36 35 37 37 36 36 36 35 37 37 37 39 46 84 109 110 104 91 87 76 67 60 58 52 49 48 44 47 51 55 61 72 82 92 99 117 123 131 139 145 139 145 99 50 39 34 35 35 34 34 35 34 34 34 35 35 34 35 35 36 36 35 34 33 33 34 33 32 54 114 106 90 84 73 64 54 55 53 51 48 46 46 46 47 46 49 49 56 63 81 87 96 109 126 137 158 179 195 181 138 83 44 38 36 34 35 35 35 35 35 34 35 35 35 31 31 35 37 39 42 42 43 45 43 42 48 56 66 71 74 75 78 83 84 87 88 87 78 75 75 73 77 82 76 68 62 60 60 57 49 47 46 44 48 47 48 46 41 39 36 33 30 29 32 31 29 27 28 31 36 34 43 40 40 37 38 36 36 36 35 35 38 42 30 30 45 54 47 40 37 33 33 32 33 33 34 33 33 33 31 31 32 33 32 31 32 58 80 90 75 21 30 26 31 41 58 57 49 47 40 26 28 26 30 29 38 49 46 38 36 35 33 34 35 34 37 36 35 34 34 34 35 34 37 37 38 37 38 37 57 66 57 53 52 50 48 46 43 42 40 35 31 30 31 33 27 26 37 43 44 39 34 35 34 35 33 34 33 33 32 33 33 35 36 40 43 47 54 56 55 54 63 77 61 53 52 49 49 48 48 47 42 32 36 29 34 51 42 38 37 37 35 36 38 39 39 40 39 40 39 39 40 43 50 54 55 55 48 45 50 69 49 38 41 44 41 39 44 44 40 36 30 22 65 56 46 47 46 45 42 43 47 42 34 37 40 53 60 59 60 59 60 57 57 60 59 57 56 55 54 54 58 58 58 57 58 53 47 40 44 100 46 46 47 49 49 47 49 52 50 49 49 49 49 50 49 52 53 52 54 56 57 57 52 46 30 52 102 50 47 46 44 43 44 45 45 45 46 48 53 57 59 58 42 35 44 52 65 63 59 58 59 57 57 57 55 52 52 47 44 40 36 36 37 36 37 37 37 36 39 39 40 40 50 65 53 49 54 58 58 56 55 55 50 45 40 40 44 41 36 32 31 35 37 30 27 31 45 62 60 58 53 45 40 38 34 33 50 58 56 44 33 30 27 28 28 29 30 30 34 32 32 48 67 99 85 47 42 40 39 39 39 39 38 38 36 38 37 36 38 38 37 37 41 46 55 49 43 44 43 41 36 35 37 37 36 34 36 36 36 35 33 32 32 34 36 38 45 49 56 58 70 79 161 167 115 49 35 36 35 36 35 35 36 33 33 34 35 36 35 36 35 36 36 36 34 33 34 30 32 42 43 37 34 35 33 34 37 38 38 37 38 37 37 39 36 36 36 36 36 36 38 38 37 40 44 47 57 74 116 152 180 144 82 41 37 36 35 35 34 34 34 35 35 34 35 32 31 33 36 37 41 41 38 45 44 46 91 118 127 125 120 117 112 107 103 94 91 89 84 83 82 80 82 92 97 100 111 115 118 122 122 125 129 128 126 123 98 73 54 46 39 33 33 32 31 32 30 28 29 30 34 35 40 40 40 38 39 36 37 36 36 35 37 42 32 30 46 59 50 42 39 36 36 35 36 37 37 36 36 35 34 34 34 33 34 33 32 33 52 71 60 21 27 26 32 42 59 57 48 46 38 27 29 29 29 29 35 49 52 46 44 46 44 45 44 45 52 55 50 51 53 49 45 44 41 40 43 42 40 39 47 71 61 52 46 44 47 46 44 43 40 35 31 30 29 28 31 25 33 45 43 37 31 32 32 34 34 33 34 34 33 33 33 34 37 37 39 45 54 56 57 58 55 57 71 56 51 49 50 49 48 47 43 33 32 29 35 47 46 40 36 38 35 37 39 40 40 38 39 40 39 38 40 43 50 53 55 53 49 44 45 59 65 41 39 41 42 40 45 46 41 36 33 25 48 66 47 45 44 43 46 45 45 45 34 36 41 51 59 60 59 60 59 59 58 58 56 56 55 55 53 54 54 56 57 59 56 53 47 42 34 78 72 47 45 46 48 48 49 52 51 49 50 50 50 49 52 53 54 54 54 55 58 55 54 51 38 32 110 73 55 52 50 49 46 44 46 47 49 51 57 59 65 66 44 38 44 50 61 64 63 61 59 59 57 55 56 55 51 47 44 42 39 38 37 33 33 34 34 34 38 36 36 38 42 52 59 49 51 55 58 59 59 58 53 49 45 45 45 40 37 33 32 36 39 32 32 33 46 63 62 58 51 44 38 36 36 28 102 140 137 78 31 32 28 28 27 26 26 26 28 28 27 28 34 35 61 59 43 43 40 42 40 41 39 39 38 39 38 39 39 39 41 39 39 31 26 27 37 42 45 45 36 33 34 31 29 32 34 33 33 32 30 29 30 31 33 33 32 35 34 32 34 36 32 32 66 83 35 35 37 35 36 36 34 33 33 35 36 35 38 38 38 35 36 35 33 34 35 31 30 27 32 32 34 37 38 35 35 34 33 30 31 31 31 33 34 34 34 33 33 33 34 35 34 33 35 35 36 36 36 32 32 35 69 52 35 35 33 35 36 36 35 36 34 35 33 33 32 34 35 39 38 38 37 44 44 49 63 51 41 37 33 32 37 39 42 44 43 40 41 43 41 41 38 37 36 38 39 43 47 48 59 68 86 103 134 171 195 186 148 88 41 37 33 31 33 32 30 29 29 29 28 32 37 39 38 36 37 36 36 37 36 36 38 44 45 48 64 75 76 67 67 65 63 58 59 62 58 56 55 50 45 41 37 36 35 35 34 34 39 64 48 21 26 27 31 41 59 59 48 46 39 27 27 27 28 30 43 74 98 98 106 109 98 92 90 89 97 96 87 90 96 100 105 106 104 106 104 98 94 87 76 84 67 49 48 46 43 45 42 42 43 38 30 29 28 30 35 27 30 41 44 38 35 32 32 31 33 35 34 34 34 34 34 31 35 36 38 42 55 58 56 58 55 52 72 62 51 50 49 47 49 46 43 30 32 28 33 46 46 39 36 38 35 38 39 39 40 40 39 38 38 38 41 43 49 53 54 54 49 45 41 48 77 43 40 41 41 41 45 44 41 38 36 29 36 72 52 46 44 44 45 45 45 45 33 36 41 54 59 59 58 56 56 57 59 59 55 54 54 55 55 56 54 56 57 59 56 54 48 44 33 51 94 53 46 45 46 49 49 51 49 49 50 50 50 51 53 53 59 71 81 93 100 106 108 108 106 101 136 128 112 114 108 101 97 93 90 86 81 77 75 70 67 67 53 45 48 54 61 65 61 62 59 58 59 54 54 54 51 50 48 45 42 37 35 34 35 34 35 36 40 37 39 42 52 69 92 91 94 99 104 106 107 107 105 104 103 98 93 89 84 76 69 62 58 42 35 34 47 61 64 59 52 44 38 38 34 26 99 144 142 91 30 32 29 27 27 26 25 24 26 27 26 28 32 34 46 60 40 40 38 40 37 38 37 37 36 36 34 38 40 40 43 43 41 30 30 29 47 48 47 45 35 35 36 35 34 33 32 31 33 31 31 31 29 29 34 33 32 34 30 27 29 30 32 39 40 56 48 35 37 35 34 35 35 33 33 34 38 36 38 38 38 36 36 38 35 34 35 33 32 28 32 32 38 39 39 36 35 32 32 33 34 34 32 34 33 33 32 33 34 34 33 35 32 30 33 34 34 34 35 35 38 37 40 45 38 34 34 36 36 35 35 34 34 34 34 34 32 34 35 38 38 36 36 45 44 34 32 33 35 36 39 38 37 36 35 37 38 39 37 41 40 40 38 38 39 38 38 40 38 35 38 37 37 38 41 50 69 73 87 106 55 36 32 32 33 32 32 31 30 30 27 29 36 40 38 36 38 37 36 36 37 36 39 43 92 86 86 84 83 81 84 84 85 83 88 93 100 106 114 123 125 130 138 157 116 51 36 34 31 52 67 27 26 26 31 42 60 57 50 46 40 26 27 28 29 36 57 76 64 53 50 47 41 41 39 38 41 43 41 44 44 43 48 53 57 63 77 89 103 113 132 150 169 160 86 50 42 44 42 41 40 38 29 29 31 32 35 30 28 40 43 38 34 31 33 32 32 33 33 34 33 34 33 31 35 38 37 41 54 57 57 54 54 53 64 69 53 49 50 50 50 48 45 31 32 27 32 44 45 39 36 37 38 37 38 40 40 40 39 38 39 39 40 42 47 53 54 53 49 44 40 37 75 61 40 41 41 41 44 47 43 39 37 31 23 62 66 49 44 43 43 44 47 45 31 34 41 53 61 59 57 55 55 56 56 56 56 54 53 54 52 54 54 54 57 58 58 54 51 48 38 30 97 72 46 44 47 50 48 49 49 50 51 51 50 49 50 61 101 112 112 111 103 93 86 83 77 75 71 70 71 71 67 65 72 80 88 96 105 119 132 141 155 165 164 169 158 101 61 61 58 59 60 60 59 56 56 55 53 52 53 46 42 41 40 36 34 35 35 35 51 86 114 117 109 98 90 81 71 66 61 60 56 55 54 53 55 57 64 75 84 91 99 111 123 132 140 145 147 144 137 111 59 45 42 36 34 31 73 122 129 86 32 32 29 29 27 26 25 26 27 27 29 30 39 70 103 121 122 117 117 116 114 112 107 106 107 106 104 100 91 89 89 82 71 59 55 49 59 60 54 50 43 39 43 44 39 38 34 32 31 32 32 30 31 32 32 31 30 30 28 28 28 29 30 28 35 36 49 38 35 35 34 34 35 34 37 38 38 39 39 40 39 38 37 38 39 39 37 37 36 31 29 31 39 39 38 37 38 37 36 35 32 33 34 35 32 30 31 32 33 33 34 35 33 32 33 34 34 35 33 32 34 33 35 39 41 35 34 34 34 35 35 34 34 34 36 36 35 36 38 39 36 31 37 45 40 29 33 34 35 38 38 36 38 37 33 33 35 37 38 39 42 41 40 40 40 38 40 40 38 35 35 33 34 34 34 36 36 37 36 35 54 38 34 35 33 33 30 30 28 28 28 29 34 39 38 39 38 38 38 36 36 40 51 90 44 42 40 40 38 40 40 42 36 35 35 37 39 41 45 50 54 58 66 122 156 131 53 33 33 32 73 31 26 27 28 42 56 58 54 48 42 25 27 27 28 34 33 33 29 35 42 43 40 38 39 36 37 36 38 38 38 39 40 40 40 42 47 50 53 55 61 67 82 111 135 90 44 43 41 39 40 38 27 28 28 33 31 32 27 41 44 39 31 29 33 34 32 32 32 32 35 34 34 32 35 37 38 42 53 56 56 54 52 52 57 77 56 51 50 51 49 48 47 33 30 28 32 44 44 40 38 38 38 38 37 39 39 41 41 39 42 42 42 43 46 52 54 54 49 45 39 33 65 77 37 39 41 38 44 47 43 39 39 35 23 46 78 54 44 42 42 42 45 44 32 34 41 51 62 61 58 56 53 52 55 55 56 55 53 52 49 52 51 55 59 59 58 56 52 49 40 29 74 93 46 48 46 48 48 49 50 50 51 51 48 47 50 53 49 52 62 75 74 71 70 68 65 65 62 62 59 59 57 55 51 46 42 40 41 45 49 57 62 67 81 115 185 185 114 63 56 60 60 60 59 57 58 57 56 52 52 48 43 41 39 36 32 32 34 38 49 53 51 53 53 51 49 47 47 45 47 45 42 40 38 38 36 35 34 35 35 34 38 41 44 47 51 56 68 79 134 167 131 65 39 36 36 36 41 49 51 48 35 31 29 29 28 27 26 27 27 27 29 30 51 81 76 66 65 61 59 55 55 55 52 54 55 60 63 64 69 74 81 86 96 105 119 123 132 134 135 125 105 83 69 58 41 39 35 33 32 34 34 32 30 31 30 30 29 29 28 29 29 29 28 26 29 32 46 43 34 37 35 37 37 35 37 37 38 36 40 40 38 40 36 39 36 36 38 38 37 33 30 33 42 41 39 39 39 39 39 38 35 36 35 36 34 32 32 35 33 34 35 35 35 35 33 34 36 36 34 32 33 34 34 36 38 35 35 35 36 35 34 35 36 36 37 35 36 37 38 39 39 31 37 42 40 30 34 34 37 38 39 38 37 36 35 32 35 37 40 46 74 65 60 58 58 57 56 48 38 36 34 33 34 34 36 32 33 34 37 36 40 38 32 34 35 33 32 31 29 31 30 28 34 39 36 36 37 38 38 37 39 42 59 62 40 37 34 34 31 32 33 34 33 33 34 32 31 32 31 34 35 36 36 29 36 73 91 48 32 28 64 53 26 27 28 41 58 59 52 49 43 27 26 26 26 32 32 36 30 36 45 42 36 37 35 36 35 35 36 37 36 35 37 38 39 40 45 47 50 55 58 59 59 56 63 83 62 47 44 40 41 39 27 28 29 35 31 32 23 37 47 38 31 32 32 31 30 32 33 32 34 34 34 35 35 36 38 41 50 56 56 54 51 49 52 75 67 53 51 49 50 51 47 33 29 29 31 43 42 41 40 40 40 40 40 40 39 41 41 39 41 44 42 43 47 51 56 55 51 46 40 34 48 88 47 41 42 40 42 46 46 40 39 38 27 27 76 63 48 46 44 44 44 43 32 33 42 51 61 59 56 56 55 56 55 56 57 55 57 54 52 50 52 54 57 58 57 54 52 50 43 36 46 99 60 51 48 48 48 49 49 48 49 50 48 47 47 32 31 34 42 63 69 67 65 65 65 61 60 58 56 57 53 52 47 41 36 33 33 34 38 38 34 34 36 37 40 51 107 98 55 59 60 58 56 57 58 59 56 51 49 46 43 40 37 35 33 32 34 35 29 28 37 47 55 56 54 53 53 49 44 41 38 37 35 34 32 32 29 30 31 29 32 33 33 32 32 35 35 35 31 33 60 86 43 36 38 39 37 38 39 38 35 33 31 31 30 28 25 26 26 28 32 33 31 26 31 39 48 48 48 49 51 49 45 41 41 40 38 38 37 36 34 33 30 30 27 30 39 54 77 104 137 162 218 200 88 45 34 34 32 33 32 32 32 32 32 30 28 28 28 30 31 32 28 27 29 31 39 45 36 42 64 79 90 95 97 104 107 108 107 105 106 104 105 104 100 100 98 88 84 81 76 69 70 66 58 57 54 50 49 46 44 45 45 42 38 35 34 34 32 32 34 34 35 35 33 35 36 34 33 33 30 31 33 35 38 37 35 36 35 37 35 38 38 37 37 37 37 38 42 43 43 33 38 43 44 35 38 35 41 40 41 41 40 39 37 38 38 40 51 101 120 130 129 131 125 121 117 84 38 36 34 34 35 34 35 33 33 32 33 37 35 37 34 32 36 33 32 30 29 30 31 26 32 38 39 36 37 38 40 39 39 38 34 33 36 34 33 33 33 33 34 34 34 34 36 35 32 32 32 32 35 33 34 36 39 41 69 70 33 33 49 68 35 28 26 39 57 59 54 50 44 28 25 26 24 31 33 37 28 38 46 44 38 34 33 34 35 37 36 36 37 37 38 38 40 41 42 45 49 52 57 58 57 58 56 61 74 54 47 44 39 37 26 28 27 36 30 35 23 38 51 39 34 32 31 31 29 31 32 32 32 32 34 34 35 34 37 41 50 54 56 56 51 49 48 59 83 54 51 49 50 50 46 34 26 27 30 41 41 42 40 41 40 41 41 42 41 42 42 40 42 44 43 44 47 50 56 55 51 47 41 34 36 84 61 41 44 44 44 47 47 44 39 39 30 21 60 69 51 49 47 46 47 44 32 33 42 51 62 60 57 57 56 57 56 57 56 56 57 56 54 52 51 55 55 57 59 56 53 51 47 40 32 89 85 51 53 55 53 51 49 47 48 47 49 50 48 30 31 32 35 54 68 68 67 64 63 62 61 57 54 54 54 52 48 41 37 35 33 33 35 34 31 30 31 33 39 39 52 76 63 58 57 56 57 56 59 58 58 54 50 46 42 41 39 36 34 31 33 36 25 27 32 45 60 59 58 56 53 51 47 41 36 35 35 34 32 31 30 30 30 30 30 31 31 30 30 30 32 32 32 34 36 50 58 39 42 47 46 44 42 42 42 38 32 31 31 29 26 25 26 29 33 34 26 27 31 39 57 57 51 51 52 48 43 39 37 35 34 33 32 31 33 31 28 29 29 29 28 28 28 32 35 39 85 124 139 102 28 33 32 32 31 30 30 31 33 31 29 28 29 30 32 34 28 28 27 28 36 52 41 71 99 98 92 84 73 71 65 62 59 61 63 64 62 59 55 59 64 66 72 81 91 99 112 124 130 140 147 149 149 135 115 101 64 45 39 36 34 34 32 33 34 33 33 34 34 35 36 34 32 32 32 30 29 34 36 36 36 38 36 37 38 47 67 86 96 100 99 100 102 102 101 93 93 96 95 90 91 89 88 85 78 69 63 57 50 43 42 43 81 144 130 134 134 141 138 132 139 106 37 38 36 35 35 34 34 33 32 32 35 35 35 37 34 33 35 34 30 29 30 29 31 26 29 36 41 38 38 38 41 39 39 39 33 37 41 36 36 36 36 35 36 37 38 37 35 36 37 35 35 35 33 33 34 36 38 39 41 82 45 32 37 73 54 34 23 35 51 58 56 54 47 28 26 26 25 32 33 39 30 36 47 44 37 34 34 36 36 36 36 36 36 35 35 38 40 40 41 42 47 52 55 57 56 56 55 50 77 70 50 49 46 39 25 26 28 36 28 35 23 36 49 42 33 31 31 31 32 33 33 34 34 33 34 33 34 34 38 41 48 53 56 55 52 47 44 47 87 65 52 50 51 51 50 35 28 28 31 40 43 42 43 42 43 44 43 42 42 43 43 42 43 44 45 46 46 50 55 55 52 46 40 35 27 58 82 41 37 43 42 45 47 47 45 45 34 22 38 71 56 46 48 50 45 44 33 33 40 50 63 63 61 59 57 59 61 58 60 60 58 58 56 53 51 54 56 59 60 60 59 56 54 46 35 63 108 64 56 55 52 48 49 47 47 47 48 48 49 33 30 33 31 45 61 65 66 64 63 62 59 58 52 51 50 50 46 44 39 36 33 33 34 32 30 30 31 34 37 36 40 54 69 60 58 57 58 57 57 59 56 56 53 50 47 44 41 40 36 35 35 35 25 27 31 40 61 62 59 58 53 50 46 41 36 36 36 35 34 32 31 30 30 30 27 27 29 30 31 30 31 32 32 29 31 36 51 43 65 118 132 133 126 111 100 67 36 32 32 31 30 27 28 30 33 35 26 28 33 38 61 61 56 53 49 44 39 36 36 34 32 33 32 30 31 32 30 27 27 27 25 25 27 29 27 28 29 28 36 80 67 34 33 33 32 32 32 34 32 31 31 30 31 31 35 35 30 29 28 28 34 55 43 37 32 30 34 41 44 45 42 40 41 40 39 36 37 35 29 28 27 27 27 27 24 24 23 23 25 28 47 66 98 118 153 212 174 117 49 36 33 33 32 33 33 32 33 33 35 37 38 34 30 32 30 28 26 31 34 35 38 42 36 36 56 102 118 110 103 99 92 89 82 77 70 68 68 71 74 75 74 75 79 83 90 91 104 113 119 123 127 130 153 164 168 173 178 177 167 154 147 110 36 39 34 36 34 34 34 33 33 33 32 31 33 36 32 32 35 34 32 30 30 32 34 26 26 36 40 39 38 39 41 46 54 58 58 63 45 41 41 41 41 39 39 40 42 42 42 46 43 42 41 39 35 34 37 38 37 38 36 60 72 37 34 64 76 39 29 35 48 54 56 56 49 29 28 29 24 30 32 38 29 34 47 45 39 36 35 35 36 36 34 35 35 34 35 37 39 41 42 45 47 53 56 59 57 55 54 56 64 83 54 53 51 45 24 24 26 35 26 35 25 33 49 45 35 32 32 32 33 33 32 32 33 32 34 34 35 36 38 40 46 51 56 54 53 49 45 44 76 79 56 52 52 52 53 35 27 28 33 39 43 45 43 44 43 44 44 42 43 44 42 43 43 43 47 47 46 49 54 55 51 46 41 37 31 39 90 53 42 43 45 44 48 50 50 50 40 26 29 69 76 55 49 49 46 44 33 32 36 47 65 70 73 74 79 84 89 87 88 86 85 82 78 74 67 67 65 61 56 56 56 54 56 53 39 49 116 98 63 61 55 53 50 52 51 49 49 50 49 35 28 32 29 41 55 62 64 63 63 61 59 56 53 52 50 51 47 45 41 38 38 37 38 35 34 34 35 38 38 35 39 48 71 67 59 58 58 59 56 59 60 58 56 54 50 47 45 42 36 35 35 37 26 27 29 38 61 62 61 58 54 49 45 42 38 38 38 37 35 34 34 33 32 31 28 29 31 33 34 33 34 33 33 30 30 35 47 48 74 154 154 159 157 147 140 95 32 37 34 33 31 31 31 32 36 39 29 33 34 37 64 64 60 55 50 45 38 36 34 34 33 33 32 32 33 31 30 27 27 27 26 26 26 28 26 26 28 28 29 37 79 47 36 35 34 34 34 36 36 36 34 33 32 34 39 38 33 32 30 30 33 53 40 28 31 34 41 46 51 51 42 42 39 37 35 33 34 31 30 30 28 29 27 27 25 24 26 28 29 28 28 25 26 27 34 64 68 104 100 43 35 33 33 34 32 32 32 32 34 37 38 35 32 31 31 30 26 30 34 37 36 37 35 38 51 48 40 35 35 35 33 33 31 31 31 31 30 33 33 30 29 29 28 27 29 30 34 39 42 47 52 58 73 86 121 158 205 226 231 212 168 112 38 40 36 35 35 35 36 34 33 32 31 30 32 36 35 34 36 35 33 31 30 34 38 30 27 36 42 40 38 40 72 104 122 118 119 120 101 98 95 89 89 89 90 89 90 88 90 86 83 78 74 59 36 38 40 40 36 36 37 35 88 49 37 41 118 104 30 36 56 55 50 48 46 28 24 28 24 27 29 36 30 30 44 44 36 37 35 32 35 37 39 39 36 37 38 38 39 39 42 44 46 51 56 58 56 53 54 54 53 80 61 51 50 48 24 24 25 33 26 32 24 30 52 47 35 33 32 31 33 32 32 33 32 34 35 35 35 35 35 39 45 52 57 57 53 51 43 39 57 94 60 55 53 53 52 36 23 27 33 39 44 44 44 43 42 43 42 42 43 42 43 44 45 47 45 45 45 45 50 53 50 47 43 41 34 24 80 80 57 56 53 51 52 51 54 54 50 35 26 54 90 90 79 68 59 79 95 104 112 115 118 116 107 103 98 95 92 90 87 87 89 89 89 94 104 110 116 121 125 126 131 133 130 126 112 102 127 131 103 79 69 61 58 57 58 56 54 53 52 37 28 33 29 41 52 59 61 63 62 60 57 54 53 53 55 56 58 58 60 58 61 64 66 69 69 71 71 75 76 71 69 72 88 88 77 75 74 71 70 70 67 68 63 56 54 52 50 45 36 35 35 37 28 29 28 32 66 65 62 59 57 53 45 43 39 38 37 38 38 35 33 32 32 32 29 32 38 50 60 65 69 78 79 82 81 85 94 99 110 162 146 141 143 150 171 133 79 78 68 63 58 55 50 49 48 47 39 40 39 42 68 69 62 59 52 45 38 35 34 35 32 32 31 31 33 32 30 28 27 27 26 25 27 29 27 27 26 27 29 34 61 65 42 45 49 50 56 58 64 67 69 70 71 74 79 82 77 76 71 67 68 70 64 56 54 54 61 62 61 60 52 47 46 42 40 40 34 33 30 29 30 28 26 27 27 26 27 26 27 28 26 26 25 26 28 30 32 26 59 58 35 34 33 31 32 34 33 32 33 37 37 33 33 32 31 33 27 29 35 39 37 38 39 37 29 28 30 32 37 36 35 34 32 29 28 31 30 31 33 32 32 31 30 31 32 32 34 33 32 29 29 30 30 29 24 24 33 56 88 114 123 130 49 38 37 36 34 33 32 33 34 34 30 30 31 32 38 35 36 35 33 34 35 37 40 34 25 32 44 40 39 55 73 65 51 47 43 42 70 69 76 79 79 83 91 97 110 122 132 146 156 165 200 168 62 37 43 40 37 37 38 35 74 68 40 35 100 122 50 41 81 76 48 43 42 28 23 29 24 25 31 35 30 29 44 47 37 38 36 33 34 37 40 42 41 43 40 36 38 39 40 43 47 52 57 57 57 54 53 51 52 67 71 46 44 42 24 26 27 36 28 31 27 31 52 48 36 34 33 33 35 33 33 33 33 34 34 35 35 35 36 39 43 50 55 55 53 50 43 38 42 91 70 55 53 54 52 37 23 26 33 41 43 43 42 43 43 44 43 42 42 42 41 42 45 45 45 44 45 45 49 53 52 49 44 45 37 27 60 91 55 57 56 50 44 45 48 49 49 45 32 46 83 101 118 124 90 83 78 79 71 67 63 59 58 58 56 55 52 51 49 45 42 43 42 41 45 46 47 52 55 57 64 72 82 96 120 153 207 182 149 151 148 135 119 102 76 64 59 59 57 39 29 36 27 39 49 57 60 63 62 59 57 55 62 88 113 120 123 116 116 114 107 100 94 93 88 86 86 86 88 88 86 88 94 101 108 115 120 127 137 140 147 150 149 142 129 120 71 41 41 37 37 37 27 28 29 30 66 67 64 60 56 54 46 42 38 38 38 38 38 36 35 34 33 33 31 52 101 109 108 102 91 89 82 76 69 68 65 64 61 63 61 57 56 60 68 70 77 84 94 104 115 122 131 136 139 141 142 135 120 98 85 71 67 62 53 45 38 34 34 34 30 31 31 29 32 33 32 31 29 28 27 26 26 28 27 25 29 29 33 58 99 122 116 116 110 108 110 105 95 92 86 81 81 84 85 85 81 83 85 86 89 99 110 115 116 121 132 136 142 148 152 146 133 111 71 43 37 33 31 30 29 29 26 26 28 27 28 27 27 29 27 27 27 26 28 27 28 29 33 49 39 35 34 33 33 34 32 32 34 35 34 32 34 33 34 34 28 26 37 42 38 38 40 34 27 29 30 34 37 36 37 37 33 30 29 32 33 35 35 34 33 33 34 33 34 36 35 34 32 29 27 30 30 29 32 33 36 33 31 29 34 55 74 42 36 35 33 34 33 33 33 33 33 28 28 34 38 37 37 36 35 34 34 38 41 35 23 30 47 45 41 39 32 29 28 28 28 29 43 43 43 42 43 42 42 41 39 41 43 43 47 57 148 173 160 94 41 42 39 37 38 39 51 88 45 35 61 122 91 65 84 90 65 51 45 28 23 27 26 25 29 34 31 29 45 48 38 38 36 36 35 37 39 43 41 41 37 37 38 38 41 44 47 52 57 57 57 57 52 52 52 52 77 43 35 34 24 26 27 35 29 28 25 30 47 45 37 36 34 34 36 34 35 35 35 34 34 35 35 37 37 39 41 47 54 55 54 47 43 39 32 66 95 52 52 50 49 36 22 26 34 42 43 43 43 44 43 42 43 42 42 41 42 41 41 42 43 43 44 44 48 52 53 49 45 45 38 30 38 95 55 47 53 45 36 34 28 33 42 51 45 45 72 93 90 80 42 39 47 61 63 57 54 55 54 51 56 55 51 47 46 43 40 38 36 36 35 34 35 36 36 35 35 36 35 37 35 32 55 82 129 131 138 146 150 152 151 128 110 110 102 48 29 36 26 37 48 55 62 62 61 60 58 56 74 84 64 55 51 47 41 38 40 41 43 45 46 44 43 41 38 38 38 39 36 36 36 31 32 33 34 38 50 64 82 105 137 191 168 118 49 37 38 36 26 28 28 28 59 67 63 59 56 55 47 42 38 36 36 36 36 35 33 32 33 32 37 49 42 35 35 37 40 40 39 41 44 45 45 44 42 39 39 38 35 35 37 37 37 39 42 39 38 38 37 38 52 68 97 120 153 176 195 154 85 60 57 48 38 34 31 32 31 31 30 32 32 32 30 28 28 27 28 28 25 25 28 28 29 33 78 93 77 63 52 47 40 38 36 41 42 40 38 37 36 37 36 36 34 36 37 35 38 34 35 37 36 34 37 43 55 76 107 135 172 198 186 140 67 37 34 31 31 30 30 30 30 28 27 26 27 26 29 28 28 28 27 28 28 28 29 37 41 32 32 33 33 33 32 33 35 37 36 37 36 35 35 35 30 28 35 44 40 39 38 33 30 30 33 39 38 38 38 39 36 35 33 38 42 39 39 37 38 39 39 41 44 45 41 38 34 31 31 33 32 31 33 34 35 34 30 30 29 31 42 47 36 37 35 35 34 32 34 35 33 29 28 33 40 38 37 37 34 35 37 39 42 39 23 30 50 49 38 29 28 30 31 33 32 32 38 37 37 38 41 41 41 41 41 43 43 46 50 51 55 61 96 138 64 44 39 36 38 39 42 86 59 38 42 100 72 65 96 115 69 64 48 31 24 28 28 23 30 33 31 28 44 48 39 38 37 37 36 38 42 49 45 41 37 36 38 38 40 43 47 52 58 59 55 55 55 52 49 49 73 56 37 36 25 25 27 37 29 26 26 27 48 46 37 37 36 36 37 36 35 36 35 34 34 34 35 37 38 38 41 47 53 55 52 46 43 41 33 38 106 57 46 47 46 36 23 26 34 43 45 43 44 44 44 43 42 43 42 41 42 42 41 42 43 42 42 43 48 53 54 51 47 48 43 33 27 82 69 34 40 44 42 35 31 36 49 49 41 47 74 96 98 65 28 37 40 53 59 55 55 56 57 54 58 55 51 49 45 41 39 38 37 36 33 32 30 32 34 33 31 31 31 33 34 35 38 42 62 105 147 140 126 122 117 126 144 147 130 56 27 37 25 37 48 55 62 64 62 59 56 51 37 36 40 47 49 50 46 44 43 43 41 41 39 40 37 35 34 35 35 36 34 34 37 37 36 35 34 33 34 34 33 36 41 55 57 86 95 45 37 35 25 27 27 29 51 66 64 61 59 57 48 43 40 38 37 37 36 36 34 33 32 33 33 30 29 33 40 43 47 45 41 37 37 35 36 37 36 35 36 36 34 33 34 34 33 34 35 32 34 36 35 37 38 38 36 39 47 54 74 86 123 76 55 51 39 32 31 30 31 33 31 32 33 33 31 29 28 29 29 27 26 26 29 30 31 37 42 36 32 35 35 37 36 37 37 38 38 40 37 34 34 34 33 33 31 32 32 33 36 35 33 34 33 34 36 37 36 34 36 38 47 56 68 75 102 56 34 31 31 30 32 31 32 30 28 27 27 27 30 31 29 28 29 28 28 27 28 33 44 34 33 33 34 32 33 33 37 36 38 44 50 53 54 60 67 68 74 83 87 86 85 84 83 82 82 83 82 77 65 59 52 44 39 42 42 39 39 41 44 46 53 61 57 56 50 43 39 36 33 34 32 33 35 34 35 34 30 28 29 30 29 41 37 37 36 35 35 33 35 33 33 30 25 32 41 40 40 40 42 43 43 43 44 42 30 32 52 55 37 30 30 32 34 37 36 38 38 36 35 37 36 36 37 38 39 40 42 44 44 48 53 56 51 74 107 58 41 40 36 37 40 58 86 46 33 76 112 131 188 142 101 107 49 34 23 31 30 23 32 35 33 27 43 48 40 36 35 35 39 40 38 39 40 38 38 36 37 41 42 43 48 53 57 57 56 56 55 52 49 50 62 76 45 40 27 26 30 37 30 26 27 27 46 45 36 36 36 37 37 36 33 35 36 34 36 35 36 37 39 39 41 46 52 53 51 47 42 39 33 24 91 87 54 51 48 39 22 26 36 44 44 43 42 42 44 44 43 43 42 42 42 42 40 42 42 42 42 43 46 52 53 51 48 48 45 37 23 46 101 44 34 37 41 43 45 57 65 65 74 83 100 113 132 106 19 37 35 43 53 56 58 59 59 57 58 56 53 49 44 41 39 37 36 33 33 35 34 33 31 33 32 32 33 33 33 33 33 38 44 58 119 151 150 122 115 137 164 209 124 56 27 37 26 37 46 54 60 61 61 57 56 39 27 32 36 46 53 54 49 46 43 41 39 36 36 36 34 36 35 34 34 33 32 32 33 34 34 32 31 31 32 34 34 35 37 35 38 37 53 56 39 37 24 27 27 30 44 61 65 62 58 55 47 43 40 38 37 38 35 36 36 35 32 31 30 28 31 34 44 46 47 44 37 33 32 32 34 33 33 37 34 35 34 32 34 33 33 33 32 29 30 32 32 31 32 34 36 37 37 39 38 39 48 71 60 52 41 34 32 31 30 32 30 30 31 32 32 30 28 28 29 29 27 27 31 32 33 31 31 33 32 34 37 38 36 36 34 33 34 33 33 32 30 30 29 31 29 30 31 32 32 32 33 30 32 32 34 32 34 34 36 36 37 35 37 35 38 53 37 34 30 31 34 31 32 30 29 28 26 26 30 32 32 31 30 28 26 25 27 29 49 38 34 35 34 33 34 35 58 94 119 128 130 127 124 122 117 113 104 99 93 92 89 91 95 92 92 94 96 103 109 112 122 129 137 139 140 139 136 133 131 135 153 157 145 121 87 76 73 47 37 35 33 35 35 34 34 34 29 27 28 27 28 35 39 36 35 33 35 34 34 34 32 32 25 32 51 64 71 77 80 85 92 95 98 104 95 99 112 115 107 106 107 104 109 113 114 109 39 37 35 38 36 38 38 39 40 39 42 44 46 48 50 52 53 51 92 85 43 41 39 40 43 46 94 58 32 52 109 142 190 145 138 147 120 54 21 29 29 22 33 32 33 27 41 48 40 37 36 35 37 39 38 39 41 39 39 37 38 41 42 42 45 50 56 57 57 57 55 51 48 49 53 87 79 64 28 26 30 37 31 23 26 28 44 43 38 37 37 38 37 37 36 36 37 36 38 36 36 37 38 38 42 45 52 54 53 48 43 40 33 26 63 109 68 65 63 47 22 25 37 44 44 44 44 45 44 44 44 42 42 42 40 41 41 44 43 43 44 44 46 51 55 55 51 49 47 41 29 28 106 72 54 50 40 41 64 78 89 103 122 136 138 138 148 102 22 35 34 41 50 54 58 60 59 58 59 57 54 51 47 44 39 38 36 34 35 35 34 33 34 33 33 33 35 33 34 34 33 35 40 40 144 228 242 232 208 207 173 203 125 49 27 35 28 37 47 54 58 61 59 58 53 36 26 31 36 46 55 54 51 48 44 43 38 37 34 36 34 34 33 35 34 34 34 33 33 34 35 33 30 32 33 34 36 35 33 33 35 37 41 51 45 37 24 28 28 29 43 57 63 61 57 53 48 45 43 41 38 37 36 36 37 38 36 35 30 27 31 31 45 48 44 42 38 33 33 32 33 32 33 36 36 36 34 38 38 34 33 33 33 34 33 31 32 30 30 34 34 34 32 34 36 38 37 49 58 51 42 36 33 32 31 33 32 30 33 33 33 31 28 27 28 29 27 27 35 33 33 29 31 32 33 37 38 40 38 38 35 33 33 32 32 32 32 30 30 30 30 31 30 32 32 33 34 33 32 33 32 31 33 33 34 32 36 34 35 35 35 39 41 33 32 32 31 29 29 29 29 29 28 28 32 34 34 32 31 28 28 27 26 29 43 43 36 35 34 34 35 43 76 78 62 54 51 53 48 49 44 46 43 42 39 39 37 39 39 37 39 41 41 41 41 43 47 49 52 59 65 74 86 112 143 170 228 249 245 226 168 136 105 51 36 36 36 36 34 34 33 34 30 28 28 27 28 33 36 37 35 34 36 35 37 36 33 33 33 70 124 137 140 139 136 134 126 122 112 108 101 99 95 91 88 86 87 87 91 93 100 104 39 40 40 39 39 40 39 40 41 38 38 40 43 44 50 54 54 54 57 111 61 40 39 41 44 44 72 87 33 32 86 133 160 135 126 181 170 50 20 29 28 23 31 30 34 30 42 50 41 37 35 36 38 38 40 41 42 40 40 38 39 42 43 44 44 49 54 57 57 56 54 52 49 45 46 77 120 110 27 21 27 36 34 21 25 25 44 44 38 37 37 38 39 37 37 37 38 38 37 37 38 38 38 37 40 43 49 54 51 48 43 41 35 30 36 106 98 93 90 60 21 25 35 43 47 45 45 44 43 45 44 41 40 40 42 42 40 42 43 44 46 47 51 54 57 58 54 51 49 45 34 25 78 110 99 105 100 92 116 140 157 144 138 157 176 185 176 109 22 33 34 39 50 53 56 59 60 58 57 55 55 52 47 44 40 39 39 38 36 35 35 36 35 34 34 35 34 35 35 34 34 33 37 43 68 177 245 234 201 199 161 197 174 56 24 36 25 40 51 55 59 58 58 58 55 39 23 32 33 45 54 54 51 48 45 43 38 37 33 34 34 35 37 37 36 36 37 35 34 34 35 34 35 36 34 35 37 36 35 34 36 36 40 44 49 42 28 29 30 32 43 54 61 60 58 56 49 46 43 42 37 37 38 37 37 37 35 37 31 29 29 29 47 51 45 41 38 36 34 33 33 33 36 36 34 34 34 38 37 33 33 35 35 35 35 33 30 31 31 32 34 31 32 33 36 35 37 39 49 50 42 37 34 33 32 33 32 32 32 32 34 35 32 30 28 30 29 27 32 34 35 28 32 32 34 39 41 39 38 37 34 34 35 33 32 31 32 31 33 31 31 30 31 31 31 33 32 33 32 32 31 32 33 33 33 34 33 33 37 35 34 37 38 34 33 33 30 30 28 28 27 27 25 25 31 33 33 32 32 30 29 27 26 28 40 48 37 36 36 36 37 37 36 35 36 37 39 40 39 40 38 38 38 38 36 37 36 36 35 35 36 37 37 37 36 35 36 38 39 38 40 40 40 36 35 37 51 89 117 123 103 119 128 56 29 31 35 34 36 36 34 34 32 30 28 27 26 29 37 36 36 35 35 35 35 35 36 38 62 84 77 63 45 40 40 46 47 47 47 45 46 46 46 45 46 44 43 42 42 46 43 45 42 39 42 40 39 39 40 40 40 39 40 40 44 46 49 52 55 52 51 88 97 46 41 42 44 46 55 101 45 27 65 125 142 148 139 199 171 47 23 30 29 22 31 29 34 31 40 48 41 37 37 37 39 40 40 42 42 41 42 40 40 41 42 43 46 50 53 56 58 57 55 53 49 46 43 54 150 159 22 21 27 33 35 23 27 28 43 41 36 37 38 39 40 39 38 37 39 40 38 38 39 39 40 38 40 43 49 52 51 48 43 43 37 31 30 84 137 135 136 83 20 27 34 42 49 45 47 44 44 45 42 40 42 41 41 43 45 45 45 46 48 51 55 56 60 60 58 56 53 48 36 31 53 115 139 146 147 155 155 146 170 162 136 198 203 214 198 117 22 34 33 37 49 54 55 61 61 59 57 55 55 52 49 46 43 42 42 41 39 38 37 36 35 35 37 35 35 38 35 36 35 36 36 42 54 119 199 183 184 149 138 156 139 67 26 36 29 39 50 52 57 58 57 57 54 38 24 29 32 45 54 55 53 49 47 44 39 38 35 33 32 35 40 38 36 37 37 35 30 30 32 32 31 34 36 35 36 38 37 37 37 34 35 42 52 42 24 28 29 34 45 55 62 62 60 58 52 51 47 45 40 39 40 39 38 37 34 38 30 29 28 29 49 53 45 40 36 36 35 35 34 33 37 37 34 34 35 34 41 36 34 36 35 36 34 34 33 33 32 33 33 31 33 34 36 38 36 37 45 50 43 37 35 34 34 34 34 34 35 33 33 35 34 32 30 31 30 30 32 35 35 28 29 29 36 42 42 39 37 35 34 35 34 33 31 31 30 30 32 30 31 29 32 32 32 32 32 31 33 33 32 33 34 33 33 34 33 34 35 35 35 35 38 33 35 33 31 29 28 28 28 27 26 28 32 33 34 33 33 32 30 28 26 27 37 50 35 37 38 38 38 31 33 37 38 39 40 40 37 36 34 35 37 36 34 35 33 35 35 34 35 34 34 35 35 34 33 32 34 36 37 38 40 42 43 44 48 48 47 45 38 38 63 58 28 30 34 34 35 35 33 34 34 31 29 28 27 28 39 37 36 35 35 36 35 35 36 40 47 45 51 48 44 42 45 45 45 45 43 44 46 43 45 45 41 41 40 41 41 44 45 45 40 40 39 38 38 39 40 38 39 38 41 41 44 46 49 53 53 51 50 54 118 68 43 44 43 46 43 87 88 32 39 111 125 141 146 180 173 57 26 29 29 21 30 29 33 30 39 47 43 39 37 37 39 40 42 41 42 42 42 41 42 43 44 43 47 50 54 55 57 56 56 54 50 46 41 34 137 161 25 21 27 35 38 22 24 30 41 44 38 37 38 40 41 40 39 37 41 39 37 39 40 40 40 39 41 43 47 50 52 49 45 44 40 37 28 44 148 203 170 114 28 40 45 51 56 54 53 52 54 53 52 52 51 48 48 49 50 45 44 42 47 49 54 57 61 65 65 65 62 57 46 37 40 90 161 222 168 207 176 193 166 216 167 203 202 206 195 113 24 35 32 34 47 52 52 58 60 58 58 57 57 54 52 48 47 44 48 50 46 46 46 49 51 52 54 55 56 51 52 50 48 47 50 48 53 91 171 168 184 153 156 152 161 77 32 41 30 39 47 50 53 57 57 58 54 37 24 28 28 40 52 55 54 52 50 46 40 37 36 33 30 31 32 33 41 55 80 91 99 101 108 114 115 114 112 110 106 105 108 107 108 108 105 108 110 107 103 101 94 90 94 94 93 90 84 79 71 67 62 54 50 45 46 40 37 35 35 36 29 30 24 30 51 52 48 42 37 35 32 33 33 33 34 34 35 35 35 36 49 42 35 42 39 37 36 37 37 37 35 36 36 35 33 34 37 38 38 38 43 50 45 40 37 35 37 37 37 36 40 37 34 34 34 33 33 34 33 33 35 35 38 29 31 28 37 43 43 38 36 34 33 34 34 33 31 36 33 30 29 30 30 29 30 30 34 32 30 30 33 34 33 33 32 33 32 32 35 34 35 35 34 36 37 33 34 32 31 30 27 28 29 27 29 29 31 33 34 32 34 33 31 28 26 26 28 51 37 36 38 40 39 29 34 37 38 42 40 38 37 38 35 36 35 36 37 36 33 35 37 36 36 35 34 34 33 34 32 33 31 33 35 36 36 38 40 40 42 44 46 44 40 38 34 40 35 34 34 32 34 34 32 31 30 31 30 28 24 30 44 38 35 34 35 37 36 36 39 41 35 44 49 51 49 45 42 38 35 35 35 37 39 36 36 37 37 37 37 37 38 39 39 38 39 39 39 39 39 39 40 38 40 40 41 41 43 43 48 52 53 53 50 48 94 102 44 43 42 43 41 58 121 47 30 78 119 130 144 168 182 74 25 31 32 21 28 26 31 31 39 46 42 41 37 37 39 40 43 43 43 42 42 41 42 43 43 45 46 48 53 55 57 56 55 54 52 47 41 36 84 114 32 25 30 34 38 20 24 31 43 45 38 38 37 39 41 40 39 38 41 40 40 41 41 42 40 41 43 44 47 50 53 50 46 44 42 40 38 59 150 204 183 153 107 113 108 107 104 106 111 108 106 109 117 125 121 118 119 119 116 108 104 101 97 93 89 84 75 72 79 75 70 63 53 45 42 74 136 186 169 195 187 218 171 215 165 172 207 220 197 127 19 35 33 35 47 52 53 60 62 62 59 61 67 77 88 96 103 109 112 112 108 105 102 102 98 101 102 106 107 106 104 104 113 122 131 129 125 136 181 183 195 205 205 183 218 130 47 42 31 40 49 51 53 56 57 56 54 37 24 29 28 41 52 55 55 55 51 48 41 38 34 34 32 30 29 36 80 104 95 86 73 69 62 59 58 53 52 50 49 50 46 48 48 45 45 48 51 53 56 60 70 75 85 96 108 121 134 143 159 164 163 154 134 116 66 40 40 37 35 34 28 31 24 31 51 52 49 43 39 36 33 33 34 35 34 36 37 36 36 34 38 36 36 43 42 40 34 32 33 35 35 37 37 38 41 39 42 40 36 41 44 50 45 39 35 35 37 37 37 37 41 39 37 37 36 36 36 37 37 37 38 38 37 32 33 30 35 43 43 38 36 35 33 33 34 34 34 36 32 29 30 30 30 30 31 31 35 33 30 31 33 34 33 32 33 34 33 33 36 35 36 36 36 37 35 34 34 32 31 30 29 30 30 29 29 29 31 34 36 32 32 33 31 28 27 24 27 48 46 34 36 38 37 31 37 36 39 42 41 39 37 36 34 35 35 36 37 38 34 36 36 36 37 35 35 34 32 33 33 33 31 32 35 35 34 36 37 39 42 43 45 43 42 39 36 37 36 31 35 33 34 32 32 31 30 31 28 25 26 30 44 39 35 33 36 37 37 37 41 37 35 46 48 50 48 44 38 34 33 32 33 33 37 36 36 36 35 36 37 35 36 38 38 36 38 39 39 39 40 40 39 39 40 40 41 42 44 42 45 50 52 54 50 50 62 124 63 44 41 39 40 34 109 81 26 49 127 170 174 180 207 108 27 39 35 24 27 24 31 31 38 44 40 40 36 37 40 42 43 42 43 41 41 41 41 42 42 43 45 47 52 55 57 59 57 54 50 48 41 37 51 123 46 30 43 38 36 22 25 33 42 44 38 36 35 39 41 41 40 40 43 40 40 41 42 42 43 43 41 45 48 49 53 53 49 46 49 59 99 107 102 93 82 79 77 71 69 66 62 63 61 58 55 56 56 52 53 56 52 53 59 67 79 87 103 112 130 142 151 163 194 200 98 68 61 55 53 61 113 131 147 160 167 171 171 162 129 150 158 155 168 102 23 35 33 35 47 53 51 58 63 67 106 118 115 102 94 86 69 57 51 48 49 48 44 39 35 35 31 31 32 33 32 34 38 38 42 48 54 58 67 75 89 105 123 141 165 186 208 143 58 42 49 51 51 54 57 56 53 37 24 30 28 40 55 57 54 52 49 49 43 39 34 34 32 31 32 45 46 38 34 41 41 41 41 39 40 40 39 39 38 36 35 37 37 37 34 33 32 33 34 34 34 33 35 37 37 37 36 38 45 61 91 115 154 198 191 135 49 37 36 36 25 31 24 32 52 53 49 43 38 35 35 34 34 35 34 34 36 38 35 35 35 33 32 38 65 90 108 119 122 124 124 123 125 126 124 122 120 116 116 117 114 116 113 110 113 110 104 99 96 91 84 80 73 66 57 53 52 50 43 41 40 41 43 38 35 29 37 43 41 38 37 37 35 33 34 34 33 31 32 30 32 32 32 31 30 30 31 32 31 31 35 34 35 34 34 34 33 35 38 40 40 40 38 39 40 42 37 36 35 33 34 33 30 30 30 30 34 37 36 35 37 37 33 31 29 25 28 42 52 36 37 39 36 32 37 36 38 40 39 39 37 36 34 36 34 34 35 36 36 34 34 35 36 34 32 33 33 34 33 30 28 30 33 34 33 32 34 37 42 43 44 42 41 39 37 36 38 34 37 32 32 32 33 32 31 30 31 26 22 28 47 43 34 33 35 37 38 39 43 36 38 47 45 45 49 44 36 35 34 34 34 34 36 37 35 34 34 35 36 35 36 36 36 34 40 38 39 40 41 42 40 40 40 39 40 40 42 43 45 49 54 54 50 50 51 96 100 45 39 39 38 32 69 102 33 32 107 152 171 177 184 98 32 41 35 24 28 24 30 33 39 45 43 40 38 38 41 44 41 42 43 41 42 41 40 41 42 45 46 48 52 53 58 58 56 55 50 48 42 36 36 107 59 34 46 42 45 23 23 30 40 44 38 38 38 39 41 41 40 39 40 40 39 39 41 43 41 43 44 47 48 50 55 54 52 49 53 58 44 44 54 75 75 70 67 65 62 64 60 59 59 56 55 56 54 54 51 48 43 38 33 35 39 38 39 43 49 52 60 64 144 193 164 134 67 62 61 66 101 127 132 133 136 137 143 152 143 158 163 161 161 103 18 37 32 35 50 53 50 54 61 62 60 48 44 45 43 42 43 44 43 44 47 45 43 42 41 40 39 35 34 34 35 33 33 33 34 38 40 40 39 35 36 38 40 46 52 64 99 113 141 78 51 51 50 52 57 56 52 36 23 29 28 40 56 58 55 51 48 48 43 40 35 35 33 31 35 36 34 35 36 40 41 41 40 40 39 38 38 36 34 35 33 33 33 33 32 32 30 27 28 27 30 32 33 35 35 36 36 36 36 36 36 39 47 61 77 107 116 48 36 35 25 30 22 31 52 55 48 43 38 36 34 32 34 36 36 35 36 40 36 34 32 31 32 48 90 89 72 65 61 58 52 49 49 48 47 52 54 52 50 48 46 47 50 51 54 55 60 64 74 86 94 107 122 127 135 140 146 145 141 128 109 87 63 42 39 32 37 43 41 38 37 37 35 33 33 33 34 33 35 32 35 33 32 33 32 32 31 32 31 30 35 34 36 35 50 76 94 102 104 108 112 110 110 110 109 110 103 102 98 96 90 87 83 78 74 62 54 52 46 41 37 34 32 31 33 30 31 41 61 43 41 41 38 37 37 37 37 40 38 39 38 36 35 36 34 35 35 34 35 34 34 35 35 34 32 35 34 35 34 33 30 31 33 34 32 33 35 37 41 43 44 44 42 39 37 35 38 36 37 32 31 33 33 34 33 31 30 27 22 26 44 47 36 35 35 36 36 39 43 34 41 45 44 46 48 42 41 37 34 35 34 34 35 35 34 35 33 33 35 35 35 36 35 34 40 40 38 37 40 40 39 39 40 40 41 41 42 43 46 50 55 54 51 50 49 54 123 67 39 40 41 33 35 97 59 28 72 116 136 134 129 93 48 46 39 26 27 22 29 31 38 47 44 44 39 38 39 42 43 41 42 43 41 42 42 41 42 44 47 47 51 54 58 58 56 56 50 49 43 35 30 71 89 46 38 47 71 24 22 27 39 46 39 39 38 37 39 40 39 40 41 40 40 40 42 41 40 42 44 46 49 51 55 54 51 48 50 27 29 35 36 57 70 70 67 64 63 60 58 57 56 55 56 52 51 50 49 48 41 37 33 32 30 31 33 32 35 37 37 36 32 37 56 109 104 66 68 90 108 118 129 139 137 124 115 113 109 129 218 228 189 175 14 34 34 36 49 52 47 53 52 31 25 31 50 56 58 57 54 50 41 36 32 33 33 36 34 36 34 32 32 31 32 30 28 28 28 31 34 32 30 31 32 29 31 33 35 41 45 36 56 86 58 52 50 52 56 57 54 34 24 29 28 39 55 59 54 52 50 46 40 39 36 34 31 31 34 28 29 31 33 40 43 41 41 39 37 34 35 34 32 29 33 31 32 30 31 32 31 28 28 27 30 33 32 30 32 31 30 34 33 33 33 35 37 40 41 37 65 67 38 33 25 29 21 30 54 55 48 42 38 34 32 33 33 36 35 35 34 35 34 36 33 32 38 43 32 31 34 34 36 38 40 40 38 37 37 39 41 42 42 44 41 39 39 40 37 38 37 39 38 38 40 40 40 39 38 42 57 73 104 126 152 175 207 167 80 37 38 42 41 38 36 35 33 32 32 32 33 33 35 34 33 33 34 34 34 32 31 31 31 32 33 34 35 60 99 99 90 84 79 72 67 64 61 62 58 59 63 63 67 70 72 77 80 84 90 97 104 111 116 120 119 120 112 103 93 80 68 69 83 66 58 54 48 45 43 39 41 41 39 37 36 34 33 34 32 33 32 33 34 35 33 33 35 37 35 35 34 35 34 33 31 31 31 33 32 33 35 38 40 45 46 44 40 38 37 34 41 38 37 36 32 35 36 35 33 34 30 28 23 24 41 53 38 36 38 38 34 38 43 35 41 42 45 49 46 37 41 38 34 34 34 34 35 35 34 35 34 32 34 35 36 37 35 34 40 40 38 38 39 37 38 39 39 41 42 43 42 44 46 50 53 53 53 51 48 47 103 104 38 40 37 34 28 66 88 31 49 98 121 115 107 78 60 51 45 30 30 23 29 31 43 49 45 44 42 38 39 42 42 42 40 40 40 41 43 41 43 42 47 48 51 54 57 58 57 56 51 49 43 38 30 46 102 59 47 56 72 26 22 27 38 47 41 39 36 36 38 39 39 40 42 41 40 41 41 43 42 42 44 46 50 52 54 56 53 48 48 23 26 32 30 46 69 72 69 65 63 61 58 55 57 57 53 51 51 48 48 45 42 38 34 33 32 32 33 33 34 33 32 31 32 33 38 49 87 94 102 108 97 95 111 152 139 136 80 68 82 109 223 234 203 186 14 34 34 36 48 51 48 53 45 22 28 26 44 59 59 59 55 51 44 38 32 33 36 36 35 37 36 33 32 31 30 31 30 28 29 30 32 31 32 30 28 27 28 30 33 35 39 42 39 46 59 52 51 53 57 60 55 35 23 27 27 39 53 56 53 52 50 46 41 39 36 35 32 32 35 28 27 31 34 41 43 41 41 40 38 36 34 35 31 29 32 32 32 31 32 33 31 30 30 29 31 32 32 31 32 32 31 32 33 32 34 35 32 34 37 41 42 53 46 34 25 28 21 32 52 53 48 43 38 34 33 35 33 36 33 34 35 33 34 34 33 33 35 29 28 31 33 35 39 40 41 40 37 34 34 36 35 34 36 37 36 37 36 36 33 32 31 31 33 32 32 34 39 40 39 35 36 34 38 38 43 54 84 97 142 101 33 41 40 38 36 35 34 33 33 33 33 34 33 33 32 33 33 33 30 29 30 32 31 31 34 35 37 40 39 34 29 30 34 36 38 37 38 36 39 41 40 42 40 41 41 41 41 40 39 36 40 42 46 52 59 64 72 85 101 117 136 146 169 174 172 156 134 100 49 42 42 42 39 36 35 35 34 34 34 33 31 32 35 34 33 34 35 36 34 34 34 34 33 34 33 33 32 34 33 33 33 36 40 46 46 44 42 39 39 36 41 40 41 38 33 34 37 38 35 36 33 30 23 25 41 66 40 38 40 39 35 39 43 36 41 38 49 49 46 39 39 37 34 34 35 35 35 34 33 35 34 34 35 37 36 38 37 36 42 39 40 40 39 38 38 37 38 39 41 41 43 44 45 49 51 52 54 50 49 46 67 126 58 39 39 37 27 35 101 50 33 76 109 176 219 187 177 161 130 31 32 23 30 34 45 52 47 45 41 39 41 41 42 41 38 39 41 41 42 43 43 44 45 47 50 52 57 59 56 55 53 50 48 42 34 30 88 104 117 118 70 25 21 26 35 46 42 40 38 37 39 38 40 43 44 45 45 45 43 41 42 43 47 49 48 53 55 57 57 54 51 27 26 34 27 37 59 67 67 66 62 58 56 55 56 55 51 48 49 50 50 46 40 37 37 33 31 32 31 32 32 31 33 29 28 28 31 37 54 99 103 101 112 110 124 185 226 248 183 131 132 110 168 165 150 123 16 32 33 36 46 49 50 52 44 21 29 27 37 58 60 59 56 52 44 39 34 36 38 37 36 35 35 34 31 30 30 29 30 30 30 29 31 31 31 29 29 28 29 30 31 31 31 33 34 36 49 55 49 51 57 58 56 36 22 26 26 38 51 53 52 51 49 47 43 42 38 36 33 31 36 27 28 32 32 40 43 43 42 41 39 35 33 33 32 29 29 31 33 32 31 33 32 32 28 28 29 30 31 31 33 33 32 31 32 30 34 33 31 32 33 37 40 42 52 37 24 26 21 31 50 52 47 42 36 35 32 34 33 34 33 33 33 33 34 34 34 36 34 25 32 30 31 38 42 43 42 37 33 34 32 35 32 31 33 32 33 34 34 34 34 32 28 29 29 30 31 33 34 33 31 29 32 30 30 32 36 40 40 38 35 70 56 44 40 38 36 35 34 34 35 35 35 35 33 34 33 33 34 33 31 30 32 33 32 32 33 35 30 22 27 28 31 33 35 37 41 40 39 39 39 38 38 38 35 36 34 34 36 36 37 34 30 28 30 30 33 35 35 38 37 36 34 34 45 66 113 139 188 206 164 103 48 43 37 36 35 36 34 34 36 33 31 31 33 33 34 34 35 35 35 34 34 34 33 34 34 34 33 33 32 31 35 35 38 43 44 43 44 38 37 39 40 41 42 39 36 37 40 41 41 42 37 33 29 28 37 78 39 42 39 40 38 41 41 39 41 36 48 49 46 40 38 38 37 36 33 36 35 35 34 36 36 37 36 36 36 39 39 37 42 40 41 42 41 41 40 40 40 40 42 42 42 44 47 49 51 54 54 50 49 48 48 103 94 42 40 39 31 27 87 78 29 62 110 189 252 228 209 198 152 33 33 23 30 33 46 50 48 47 43 40 41 42 42 40 40 40 41 41 42 43 42 43 46 49 52 53 57 57 57 57 54 50 46 45 36 30 67 127 155 141 82 29 19 28 35 45 44 41 39 37 39 38 40 42 47 47 47 48 46 44 43 42 45 48 48 53 54 59 58 56 53 32 24 32 26 34 54 64 66 64 60 58 58 56 56 55 51 47 49 51 50 50 42 38 36 33 31 33 31 30 30 30 33 31 31 30 31 32 41 75 145 146 123 120 127 142 183 245 220 137 141 133 137 139 131 92 22 31 31 35 51 50 50 51 47 22 30 27 33 56 62 61 55 52 43 37 35 37 36 34 34 33 34 33 31 30 30 30 31 30 30 30 30 31 32 32 30 29 30 32 30 26 28 31 32 34 44 59 49 52 57 59 53 34 23 28 26 38 52 54 52 51 48 48 43 41 40 37 35 33 37 29 30 30 28 40 43 46 48 44 39 36 33 33 31 29 31 33 32 31 33 33 33 32 30 28 29 30 31 32 32 32 31 31 32 31 31 32 32 31 33 33 38 39 53 38 24 27 21 31 48 51 47 44 38 36 33 33 34 35 34 34 35 35 35 34 35 36 33 23 32 28 30 37 45 45 43 36 31 32 32 33 32 31 31 31 32 33 34 34 35 32 31 31 30 32 32 32 34 32 30 30 31 28 27 29 32 32 37 39 36 37 49 43 41 39 37 36 34 34 35 35 34 34 33 35 33 33 35 35 33 33 34 33 33 34 34 35 28 22 31 27 31 35 37 38 39 39 37 36 35 34 35 34 32 33 31 29 30 32 33 31 29 27 27 28 29 30 29 32 34 35 34 33 32 30 32 36 50 69 84 123 93 42 37 37 36 37 35 35 36 33 31 31 32 32 33 33 32 33 34 34 35 34 32 34 35 35 33 32 31 32 37 47 74 89 95 96 98 94 94 97 97 100 96 93 89 89 91 89 83 81 71 62 53 43 45 77 46 42 41 42 45 48 46 45 39 38 50 51 49 42 43 44 39 40 36 36 36 35 35 37 38 37 36 37 38 40 40 38 41 41 41 41 41 41 41 42 43 42 41 40 42 44 46 48 51 53 52 50 48 44 43 64 125 66 40 40 36 29 54 106 46 46 93 122 194 184 216 198 123 51 38 26 28 34 44 51 50 50 46 42 42 44 42 40 39 39 40 39 43 43 44 45 46 48 53 55 57 58 56 56 53 51 50 47 40 30 41 106 160 149 114 34 24 28 36 42 46 45 44 40 41 43 46 46 52 51 51 50 48 49 49 46 43 44 47 52 53 59 60 60 57 38 22 32 29 32 46 56 65 61 59 60 60 56 57 56 53 53 52 51 51 49 45 41 38 34 33 33 33 32 32 33 33 32 29 32 32 33 35 46 150 186 190 173 182 172 168 177 210 152 145 156 133 149 147 96 22 32 33 35 50 52 51 51 44 22 28 24 31 54 61 61 56 52 44 38 35 35 35 35 32 34 33 31 32 31 31 32 32 29 29 31 30 31 32 32 31 30 30 32 30 28 27 27 29 31 39 58 50 51 56 58 57 35 21 26 27 38 50 55 53 51 50 48 44 43 42 39 38 36 40 31 29 30 25 36 43 47 48 44 39 36 32 31 32 29 29 30 32 31 31 33 33 31 29 30 30 29 28 28 29 30 30 30 32 31 31 32 31 30 32 30 32 35 47 38 25 26 21 32 46 49 45 42 39 35 35 35 35 36 35 35 38 37 36 36 35 35 34 24 31 26 29 37 48 47 42 36 34 32 31 31 32 33 31 30 30 31 32 33 34 32 33 32 32 31 31 31 32 32 32 31 30 29 29 31 32 31 30 30 36 38 39 43 40 38 36 34 35 34 34 33 33 35 34 34 35 35 34 34 33 33 34 34 33 34 36 36 27 23 31 26 29 33 37 39 36 35 34 33 32 33 33 33 31 31 31 30 31 29 31 31 28 28 27 28 28 28 30 31 31 30 28 29 30 29 28 29 33 34 32 26 66 54 37 36 35 36 34 35 33 32 31 31 31 32 33 33 32 33 34 35 35 34 34 32 32 34 34 33 32 40 77 108 107 100 95 93 89 85 85 83 78 79 82 87 82 81 81 83 84 88 93 97 108 120 123 131 130 128 119 116 105 102 85 79 69 64 70 63 56 52 58 60 56 48 41 38 37 37 36 38 38 37 37 35 38 38 38 39 41 41 40 40 41 42 41 40 41 42 42 42 44 45 45 48 52 53 53 51 50 45 42 44 115 102 40 42 39 32 35 99 78 42 78 103 110 120 138 141 138 86 45 30 30 34 41 49 48 48 44 43 46 48 43 40 40 40 40 40 43 43 43 43 46 47 53 55 58 59 59 58 55 54 52 49 43 35 32 84 124 121 106 41 29 33 40 45 45 48 47 45 47 51 52 51 52 50 48 49 49 50 51 50 47 47 47 53 54 58 60 61 58 41 22 30 31 32 44 52 61 58 59 61 60 58 59 58 56 55 52 52 51 50 47 43 38 36 35 35 35 33 31 32 34 33 32 35 33 32 33 39 105 182 189 180 184 183 181 153 198 191 149 186 157 176 204 137 17 32 31 35 49 52 50 54 45 23 29 25 28 53 62 62 56 53 45 40 35 34 36 34 31 32 32 32 32 32 31 33 32 30 30 30 29 29 32 33 31 31 32 34 30 29 28 28 28 29 36 53 54 52 57 60 56 34 22 26 25 37 48 53 54 51 51 47 45 43 41 41 39 38 40 31 30 32 26 33 43 47 45 43 38 35 33 33 30 29 28 30 32 31 31 32 34 31 29 29 29 28 28 29 30 31 31 32 32 31 32 31 30 31 30 31 31 32 42 39 24 25 21 32 46 48 46 42 38 36 35 36 35 36 36 37 39 38 39 38 35 35 31 24 33 27 28 37 46 48 41 36 34 33 30 30 32 32 31 31 31 31 34 32 33 32 32 34 32 34 32 32 32 32 31 30 29 29 30 32 32 30 28 28 34 37 36 40 41 38 36 34 35 34 34 33 34 35 32 31 33 34 33 33 33 33 35 35 34 34 36 36 27 24 29 24 29 35 39 40 37 37 35 33 32 32 32 34 32 31 30 29 30 29 30 30 29 29 29 27 28 29 28 29 31 30 28 30 28 26 27 28 30 30 31 32 35 45 37 37 34 36 34 34 34 34 32 32 32 32 32 32 32 34 34 33 34 33 33 33 31 33 32 31 32 43 49 39 35 32 34 35 35 32 32 33 32 34 39 41 43 40 38 36 36 37 36 36 40 42 46 48 57 67 76 91 97 113 134 143 145 152 160 158 151 140 144 140 91 59 48 40 38 36 36 36 35 37 37 36 38 37 36 36 42 41 40 41 41 42 41 40 41 42 42 41 40 45 46 46 49 51 52 52 51 48 43 40 71 128 59 44 39 34 26 65 108 57 59 90 101 107 109 110 115 107 75 38 29 33 40 51 47 48 44 42 43 43 42 41 40 40 41 41 42 44 43 44 48 50 53 55 59 63 62 62 62 61 61 61 56 50 43 68 119 114 101 59 47 44 47 58 48 44 40 44 51 52 50 50 49 49 46 49 46 46 48 50 50 49 52 57 57 57 59 62 59 42 20 30 31 29 41 49 58 59 58 62 61 58 57 58 58 57 56 54 51 50 46 45 41 38 37 37 37 36 34 35 35 35 35 35 35 33 31 38 68 182 201 185 185 195 185 166 188 206 161 196 175 180 226 147 17 33 33 37 47 51 50 51 47 22 28 26 26 53 61 60 56 53 44 41 35 34 35 32 32 34 34 35 34 32 32 31 31 29 29 28 30 31 31 31 30 31 34 35 31 28 27 30 28 27 33 44 57 54 59 60 57 34 21 23 27 35 46 53 53 50 50 49 46 43 40 41 39 37 38 25 28 31 29 37 47 48 47 44 40 35 33 31 30 29 29 30 33 31 34 34 30 28 29 29 30 29 30 29 31 30 32 32 33 33 32 32 30 29 29 29 31 32 37 42 25 24 22 33 44 46 42 42 38 35 37 37 38 39 37 38 39 38 39 38 36 36 31 26 34 26 27 40 44 48 40 37 34 32 32 29 31 34 32 32 30 31 34 33 32 32 29 29 31 32 31 32 33 32 30 30 29 30 32 32 31 29 28 28 31 33 35 38 39 37 36 36 35 34 36 35 36 35 34 34 34 36 35 35 34 35 33 33 34 35 37 37 23 24 30 27 31 36 36 38 38 36 34 34 33 32 33 33 32 32 31 31 31 31 31 30 30 31 29 27 29 29 29 29 29 25 26 28 27 28 28 29 29 27 28 29 33 35 39 38 36 38 36 35 35 34 32 31 32 32 32 31 32 34 34 32 31 31 30 30 32 33 32 31 31 27 20 25 27 28 31 38 43 42 39 36 36 34 37 36 36 37 37 35 36 36 37 35 34 33 32 33 34 36 34 34 34 32 32 33 37 44 66 83 113 141 200 242 186 145 78 50 39 36 37 36 33 35 35 35 38 37 34 35 42 41 40 39 41 41 40 40 43 44 41 41 42 44 46 47 49 51 53 53 51 50 46 43 48 116 91 46 42 36 29 37 113 85 60 77 97 108 115 119 123 110 75 41 30 34 40 49 49 45 43 41 44 43 42 42 43 43 42 42 43 42 44 44 51 63 92 103 114 120 126 129 132 129 128 130 123 117 116 120 138 140 136 123 120 117 112 117 104 95 90 85 83 74 65 61 51 47 45 50 52 52 47 45 45 45 48 52 56 58 60 61 59 46 22 29 31 29 39 46 56 61 59 61 59 59 58 56 57 56 56 55 49 47 49 49 43 41 43 45 45 46 45 44 46 47 41 42 39 39 32 35 45 109 143 176 180 140 172 185 190 164 133 154 145 152 216 139 22 34 34 38 48 50 49 49 44 20 27 25 27 50 60 61 57 54 46 41 34 34 33 33 32 34 36 37 36 34 35 33 32 31 29 29 29 31 32 32 33 34 37 37 33 30 27 28 29 28 30 38 64 58 59 60 55 34 23 25 26 36 45 50 53 52 50 48 44 43 41 41 41 40 37 25 31 30 29 40 52 48 49 45 40 36 33 32 31 31 31 31 31 31 33 34 31 30 29 30 30 30 30 30 32 30 32 33 33 33 32 32 31 30 30 31 32 32 36 48 32 25 24 33 42 46 45 41 38 37 37 37 37 39 38 38 38 39 40 38 39 38 31 26 35 26 30 45 48 50 42 37 32 32 32 32 32 33 31 31 32 32 32 33 33 31 30 31 31 32 32 32 32 33 32 31 31 31 32 31 29 27 26 28 29 31 36 39 38 37 35 35 34 35 34 35 35 35 35 36 35 35 35 36 35 36 35 35 35 35 37 37 22 25 29 28 32 36 39 39 37 36 35 35 35 34 32 33 33 33 34 33 33 33 32 30 31 31 31 29 31 31 29 28 29 27 27 28 28 30 31 30 27 28 26 28 32 35 39 39 38 37 36 36 37 34 33 32 32 32 30 31 33 35 35 33 32 33 32 33 34 33 33 33 30 22 23 27 25 29 32 37 45 44 40 35 33 33 32 31 28 28 29 28 30 31 32 31 32 31 30 30 29 30 29 29 29 31 34 36 33 31 28 29 33 38 59 97 87 111 138 78 38 36 36 36 34 34 36 36 39 38 35 36 42 42 40 38 41 41 41 41 41 39 43 41 41 44 45 45 49 50 52 53 52 49 46 43 36 74 122 67 44 40 31 26 86 115 85 75 81 92 138 141 136 198 129 48 29 34 38 49 47 43 43 42 44 42 41 40 42 42 42 40 42 43 45 48 106 139 127 115 109 104 93 86 80 78 75 72 64 60 62 64 59 61 60 63 63 62 67 73 80 91 99 104 115 125 138 147 159 159 161 162 168 131 64 45 40 40 40 39 43 48 53 57 56 47 22 28 31 29 36 46 54 60 58 59 58 58 58 58 58 56 59 78 116 126 129 128 128 127 122 119 116 117 116 114 117 114 114 114 114 117 109 107 116 133 150 175 177 148 176 190 192 194 196 168 215 169 202 124 32 41 38 40 50 52 52 52 43 20 27 24 27 49 61 61 58 54 47 40 35 35 33 33 34 34 37 38 40 39 36 35 30 29 29 30 31 32 34 34 34 35 37 37 33 32 32 30 32 31 32 34 61 64 60 60 56 34 26 27 30 40 48 52 56 56 54 49 48 46 43 43 42 43 39 29 32 33 31 41 51 47 47 46 42 37 34 31 29 31 30 29 31 30 33 33 31 30 29 28 28 29 28 31 31 31 32 32 32 33 34 35 32 30 32 31 32 32 37 44 45 26 26 34 43 46 45 42 39 38 38 41 41 39 41 40 41 41 41 39 40 39 31 27 34 26 33 50 53 51 41 37 35 36 34 34 32 33 34 32 32 34 33 34 31 29 30 31 31 31 33 33 31 32 33 32 30 30 32 32 30 29 29 29 28 29 33 37 39 36 35 34 34 36 35 33 35 37 36 36 36 36 36 36 36 36 37 37 38 38 37 35 22 26 29 27 31 38 41 40 39 36 35 35 34 33 32 33 33 33 37 36 33 32 32 32 32 32 30 30 30 31 30 28 28 29 28 28 28 30 33 32 27 27 26 28 30 32 38 38 36 37 36 37 37 35 32 30 30 29 30 31 35 36 35 33 31 31 31 33 33 33 33 32 28 19 27 28 25 34 37 40 42 42 37 31 28 31 29 27 26 26 27 26 28 30 31 31 32 34 32 30 28 28 28 28 27 30 30 29 26 26 26 27 29 34 38 44 36 27 40 79 44 35 36 37 37 36 36 36 38 38 35 35 42 41 40 40 41 40 38 39 41 40 40 42 42 43 44 46 49 49 52 54 52 50 46 42 37 49 118 96 51 45 36 28 57 113 106 109 116 113 179 226 201 246 212 73 31 35 39 49 49 45 43 42 44 42 40 40 39 40 40 40 40 43 42 60 76 58 54 54 69 74 75 74 74 72 70 68 63 62 64 61 56 54 56 58 50 43 38 39 36 39 37 38 39 41 47 53 62 71 83 120 224 231 160 85 41 42 41 41 41 42 47 49 52 47 22 26 30 30 35 43 51 57 58 58 57 59 57 57 58 58 66 76 70 60 56 58 61 59 54 51 50 49 44 42 44 44 46 46 50 51 51 53 56 61 65 75 85 93 111 129 146 162 186 185 209 194 189 152 100 77 37 40 53 51 50 51 42 20 27 25 26 48 58 60 57 55 48 43 37 36 33 32 35 33 37 38 40 40 38 35 31 28 29 31 35 32 46 61 75 80 89 95 99 99 101 102 103 100 96 98 104 108 107 105 102 88 77 71 65 62 64 61 56 51 50 49 45 43 46 47 47 46 43 32 35 36 33 42 53 49 48 47 43 39 35 31 31 31 30 29 30 31 31 31 31 30 30 30 29 29 31 32 31 30 33 34 34 36 36 35 33 31 33 35 35 34 36 43 54 29 27 38 44 48 47 44 41 40 40 40 43 43 45 44 44 42 43 44 42 40 31 30 34 28 36 52 57 52 42 41 38 36 38 38 34 34 33 31 31 32 32 32 32 32 31 30 30 30 31 31 31 32 34 34 33 32 32 34 31 29 29 29 27 28 33 37 41 37 35 33 33 36 36 36 36 37 36 38 37 37 37 37 37 37 37 37 38 38 38 35 24 31 30 27 33 38 42 40 38 36 36 34 31 32 35 33 33 36 38 39 35 34 33 33 33 33 31 31 29 28 28 28 27 28 29 29 31 33 33 32 28 26 27 27 28 32 37 38 37 38 37 37 36 34 32 31 30 30 30 31 35 36 34 33 31 31 30 32 34 33 33 32 28 19 30 27 23 36 41 40 40 39 35 31 29 30 29 28 27 30 32 31 33 35 34 33 35 35 32 32 29 29 29 29 28 30 28 27 26 27 25 25 27 27 32 37 40 37 31 37 50 38 36 37 36 35 34 35 39 39 36 35 43 40 40 41 41 41 39 39 40 42 42 42 43 43 45 47 48 48 51 53 52 52 48 46 43 40 81 124 67 53 44 33 36 92 125 148 145 142 123 150 195 242 202 55 35 39 39 45 49 48 43 40 41 40 37 39 40 42 39 40 40 40 41 59 31 38 42 41 59 71 76 72 72 69 69 65 64 63 59 57 56 54 54 53 45 40 38 36 34 35 36 36 36 34 38 38 37 38 41 36 43 63 107 150 87 49 50 51 57 51 40 38 56 57 23 25 33 30 37 44 51 53 55 57 56 56 55 57 57 57 47 27 29 30 40 56 61 60 55 53 51 50 48 47 44 42 40 40 39 37 37 38 39 38 36 37 36 37 34 37 37 39 45 51 70 89 119 145 212 230 151 75 53 52 52 51 42 19 27 25 26 47 58 59 57 55 47 42 39 34 32 33 33 32 36 38 40 40 38 33 31 29 28 33 62 110 126 120 109 101 95 91 87 84 77 73 64 65 62 65 62 63 62 60 70 79 88 92 98 108 123 131 136 139 140 138 135 128 119 106 93 88 77 57 56 52 45 45 52 52 48 45 42 39 33 31 31 31 31 30 30 31 31 32 31 30 30 30 28 28 31 31 32 32 33 35 35 36 35 34 38 48 61 65 70 74 81 89 97 90 92 96 96 99 96 95 95 92 92 91 88 88 78 75 69 67 66 61 55 52 42 41 40 32 41 55 58 56 49 46 47 45 42 42 39 37 34 32 31 30 32 32 31 31 30 30 29 30 31 31 33 33 32 33 33 32 32 33 31 28 28 27 25 25 31 34 42 39 36 34 33 35 36 38 39 39 37 38 39 37 38 38 38 39 38 38 38 37 38 33 24 33 29 27 35 39 42 41 38 38 35 34 33 32 32 34 34 36 39 38 36 36 35 35 33 33 32 34 31 28 28 28 30 28 28 30 30 32 33 31 29 29 26 24 27 29 35 39 36 37 37 38 37 35 31 31 31 31 32 34 35 34 33 32 30 31 33 34 34 33 33 34 28 22 30 23 24 33 42 43 40 35 31 29 27 29 30 28 29 31 31 31 30 32 31 32 32 32 31 31 29 30 29 29 29 30 31 32 30 28 26 25 25 26 31 35 38 35 36 28 45 40 34 35 34 35 35 36 39 39 35 34 44 41 42 43 41 41 40 39 41 42 42 43 44 44 44 46 48 48 51 53 53 52 50 48 42 40 55 119 94 59 48 37 31 71 120 132 153 168 162 155 157 226 183 47 37 39 40 42 50 51 45 43 42 40 40 42 42 43 41 42 41 43 42 49 26 31 41 40 53 67 77 76 70 69 69 66 65 63 60 57 55 53 53 51 42 38 35 36 35 35 35 36 36 36 37 35 35 36 36 36 37 38 38 67 120 100 96 99 106 106 101 64 53 54 24 25 31 31 36 44 51 53 53 55 57 56 56 57 56 55 38 21 29 30 35 56 64 61 56 54 53 54 50 49 47 42 37 36 36 35 33 35 37 35 36 34 34 33 33 34 36 36 37 39 38 38 40 43 77 112 145 162 84 51 53 53 41 19 28 24 25 42 57 58 57 54 47 42 36 34 34 34 34 34 36 36 36 37 37 34 30 31 29 42 61 55 41 37 37 37 37 35 32 31 31 34 35 39 44 44 43 44 40 38 35 32 31 33 35 33 37 44 50 53 61 70 78 92 114 127 148 163 176 175 171 172 115 57 49 51 47 47 42 38 33 32 31 32 31 31 32 31 32 34 32 31 31 31 30 30 32 33 33 31 31 32 35 36 36 45 99 121 125 124 116 112 102 95 89 88 84 79 77 74 70 71 74 75 80 82 85 90 97 98 99 108 120 123 129 136 136 133 128 119 113 110 104 94 77 67 57 53 54 54 44 38 35 33 32 32 32 32 32 33 31 30 31 30 32 31 32 33 33 33 32 32 33 33 32 30 29 28 25 25 28 32 43 40 36 36 37 38 39 40 41 41 40 40 41 40 40 41 41 41 40 40 41 42 41 35 28 36 29 29 37 41 43 44 40 39 37 36 35 33 34 35 37 38 42 41 41 40 39 37 36 36 34 33 32 30 32 29 27 28 29 31 32 33 34 32 29 29 27 25 25 27 35 41 38 38 37 37 37 34 32 31 31 31 33 35 34 34 35 35 33 33 34 34 32 33 34 34 25 22 32 25 25 31 41 45 40 36 30 29 28 29 30 28 28 31 29 31 29 28 30 30 31 31 30 29 30 30 29 31 32 33 34 34 33 30 27 24 26 28 30 30 31 32 36 31 38 43 33 34 33 35 36 36 40 40 35 33 44 43 43 43 40 41 43 43 43 43 43 43 45 44 44 46 48 47 50 51 54 54 49 48 46 42 41 86 125 74 52 46 39 46 111 127 126 144 156 160 160 173 163 57 42 42 45 50 51 49 47 45 46 46 45 47 45 43 43 45 44 46 45 50 26 28 38 38 46 59 73 74 70 65 68 67 67 63 59 58 58 54 52 51 43 37 37 36 35 34 35 34 33 34 33 33 33 34 33 34 33 34 37 38 67 119 130 126 129 142 150 120 133 132 20 22 31 27 35 42 48 50 51 54 54 57 56 56 57 55 35 22 29 28 30 50 69 66 60 56 53 54 50 48 44 40 36 35 33 34 34 33 34 34 35 32 31 31 32 34 34 34 34 34 34 35 34 35 35 38 34 64 121 73 51 53 40 21 26 24 24 41 57 57 58 54 46 42 38 35 34 33 33 33 32 32 31 32 33 33 30 30 31 34 21 22 25 27 35 37 44 47 40 40 37 35 35 35 35 34 35 34 35 35 31 31 29 29 29 28 31 33 34 37 39 42 44 43 40 37 36 37 51 69 113 184 188 173 99 53 49 49 44 40 33 30 31 31 29 30 31 32 33 33 32 30 30 29 30 29 31 31 29 29 30 33 37 37 41 56 58 43 32 29 33 31 34 36 35 35 35 34 37 39 42 41 41 39 40 40 35 34 33 34 33 33 32 34 36 38 48 58 70 82 103 121 150 167 192 204 200 190 178 132 66 41 37 36 33 33 32 32 32 32 30 30 29 31 30 30 31 31 33 32 32 32 34 33 30 29 29 27 26 25 26 31 40 42 37 37 38 40 45 49 53 55 54 55 55 55 59 61 58 61 59 63 58 58 56 50 45 50 44 46 52 54 49 46 45 44 41 39 38 36 38 39 40 43 46 47 47 43 44 43 44 41 38 34 34 33 34 29 26 27 30 30 31 33 32 31 30 30 29 27 27 27 31 43 40 38 38 37 38 35 32 31 32 33 33 35 37 37 37 34 33 35 34 33 33 34 35 32 23 24 31 22 25 30 39 46 42 36 29 30 30 29 30 27 28 29 31 32 29 30 31 30 31 31 30 30 30 31 32 31 32 34 35 35 32 32 27 24 26 28 28 28 30 31 33 33 33 45 35 35 35 35 37 36 40 41 36 35 44 45 43 41 42 43 42 41 42 43 43 44 45 43 44 45 48 47 51 52 52 53 51 49 47 42 39 54 129 99 51 50 47 45 87 123 122 121 121 125 130 130 122 74 48 49 50 63 58 48 45 45 48 50 48 46 45 44 43 45 44 44 43 50 27 25 37 38 42 53 67 72 70 67 66 68 69 65 61 59 59 55 54 53 46 42 38 36 36 36 36 34 34 34 34 34 33 32 33 34 34 34 36 37 46 83 125 120 124 127 129 140 156 144 24 22 30 29 33 43 51 51 50 53 52 57 57 57 61 56 38 21 31 27 27 41 70 68 58 56 55 53 51 48 44 42 36 33 34 35 35 35 35 34 33 32 32 33 33 32 33 32 32 32 33 33 33 33 32 35 35 35 67 90 55 53 43 20 24 23 22 39 55 56 55 52 49 43 38 35 34 33 33 33 33 32 31 29 30 30 29 30 32 27 18 24 23 25 39 39 43 44 38 36 35 33 30 30 29 28 31 29 31 31 29 29 28 27 28 28 27 28 27 30 32 33 33 31 32 34 34 35 38 38 40 52 58 82 139 96 46 47 45 39 34 31 32 32 31 31 32 33 34 34 32 30 30 29 29 30 31 30 29 29 32 34 36 36 40 32 29 32 30 30 34 36 39 39 37 35 33 33 33 34 35 35 37 35 37 36 33 32 32 33 33 33 35 34 36 38 39 39 36 33 36 38 43 48 66 84 111 149 229 211 160 102 36 37 34 32 32 34 33 32 32 30 31 30 31 32 32 32 33 33 34 34 35 34 32 30 31 30 27 26 25 29 39 45 36 40 56 91 120 130 137 139 138 139 138 139 135 132 132 131 133 134 134 137 136 136 134 135 134 135 142 143 130 125 120 117 109 99 88 78 73 64 56 52 45 47 47 46 47 47 51 48 44 40 36 31 32 29 28 29 30 31 32 33 33 31 29 30 29 27 27 27 30 43 42 40 37 36 39 36 34 34 33 34 34 33 38 38 36 36 36 36 35 35 36 35 36 32 21 25 33 24 27 34 39 44 40 36 30 31 30 30 29 28 29 31 30 30 31 32 32 31 32 31 31 32 34 34 33 34 36 37 38 38 35 31 29 25 27 27 25 25 28 31 30 33 30 45 34 35 35 35 37 39 40 40 38 36 45 44 42 43 42 43 45 45 43 42 43 43 44 45 44 46 46 48 51 54 56 55 52 51 48 46 41 38 95 134 72 50 46 47 56 92 119 122 123 132 143 137 120 84 55 55 59 76 77 56 48 46 49 49 48 44 45 44 43 43 44 45 43 47 33 23 36 37 41 48 61 71 69 66 62 64 69 66 63 60 58 56 54 54 45 42 37 34 35 36 35 34 34 35 35 35 36 34 34 32 32 33 33 36 39 52 127 150 146 146 146 144 145 131 34 20 31 29 35 45 47 47 48 50 52 53 57 57 59 54 39 22 27 27 24 37 63 70 61 55 56 54 52 50 44 39 35 34 33 33 33 32 33 34 33 32 30 31 31 33 31 31 31 30 32 30 31 31 30 29 32 32 39 64 68 54 40 21 25 22 22 38 51 52 56 53 48 44 41 37 35 35 33 34 33 32 31 31 30 29 28 28 32 25 16 26 21 23 50 47 44 44 35 32 32 33 30 29 31 29 28 30 30 31 29 29 29 29 28 27 26 29 27 29 31 30 29 28 27 25 26 28 31 30 36 40 41 40 46 99 65 45 45 42 35 32 30 31 32 32 33 35 34 34 32 31 31 30 31 32 31 30 30 30 30 31 35 38 30 25 30 28 28 30 33 37 40 40 35 34 31 30 31 31 29 29 29 28 32 32 31 30 29 30 29 29 30 30 30 31 32 31 32 32 32 32 33 34 36 38 37 32 41 44 62 117 95 39 33 32 32 33 32 31 32 31 30 30 30 29 32 32 32 34 34 34 34 34 33 32 29 27 27 26 24 27 36 49 40 52 99 97 73 62 52 50 47 46 45 44 49 51 55 56 49 46 39 37 37 38 41 45 47 54 59 69 75 85 102 112 127 137 143 154 171 182 187 189 188 187 183 175 162 150 125 108 78 55 40 36 32 29 30 30 30 33 33 34 33 30 29 27 27 28 26 24 29 42 44 40 38 36 38 36 37 37 33 33 34 36 38 40 38 38 38 39 37 37 37 38 36 32 21 30 31 24 32 38 40 43 40 36 31 32 31 32 32 30 32 34 37 36 35 37 36 36 37 34 37 37 38 39 40 41 42 43 45 42 39 35 29 26 26 26 24 25 26 27 27 30 29 41 39 35 35 34 38 41 42 43 39 37 45 45 43 43 44 45 46 45 43 42 43 45 46 46 45 47 47 49 52 53 57 56 55 52 50 49 45 37 64 126 104 56 51 55 65 76 96 107 108 103 97 116 109 63 54 54 61 77 89 68 56 52 52 53 48 46 47 46 45 44 41 44 45 45 36 22 34 37 38 45 58 67 71 67 59 60 66 65 63 61 59 57 56 53 47 42 37 35 34 35 36 35 35 36 36 36 37 35 34 32 33 32 35 36 38 43 96 158 160 161 162 160 158 149 43 21 30 29 34 44 46 48 48 48 52 53 54 55 55 52 40 19 27 26 25 35 59 66 62 58 57 55 50 49 43 40 37 34 35 34 33 33 34 34 32 32 31 29 31 31 31 31 31 30 32 30 29 30 31 31 32 31 34 44 73 59 42 19 24 22 22 36 50 52 54 52 48 45 41 38 34 35 33 33 34 31 31 32 29 27 28 30 33 26 17 27 21 21 50 57 48 43 35 31 29 30 30 29 31 31 30 29 29 30 31 30 30 30 28 28 28 28 28 29 30 30 32 31 27 25 26 27 28 28 33 35 38 36 37 54 74 51 45 39 36 32 31 32 32 34 35 37 35 35 33 31 32 31 31 31 31 30 30 31 32 32 36 37 29 23 31 27 25 33 34 36 39 39 33 31 30 30 29 28 28 29 28 28 30 30 32 30 28 28 29 29 30 30 29 30 32 31 28 29 30 31 30 32 31 32 35 35 37 38 35 44 82 55 34 32 32 33 32 31 31 32 32 32 32 30 32 32 32 34 35 36 37 36 34 31 31 28 26 27 25 24 34 49 44 46 38 32 34 36 38 37 34 34 38 40 47 50 52 54 48 46 45 44 41 40 38 41 40 39 37 38 38 36 39 40 42 44 45 49 56 65 72 83 103 125 151 176 205 220 227 230 205 145 57 36 35 30 30 31 31 31 33 33 33 30 30 28 27 29 27 24 29 38 45 40 38 37 38 37 36 37 34 33 34 36 41 44 53 57 61 63 65 71 75 81 85 84 81 87 87 84 90 95 95 95 92 90 86 86 80 73 63 56 51 45 42 38 37 38 36 36 36 39 42 44 46 48 51 53 55 54 53 52 44 39 28 26 26 26 23 25 26 28 26 29 30 40 41 36 33 33 35 38 40 42 39 37 47 46 45 46 47 46 47 46 45 45 44 45 47 46 46 46 47 49 53 53 57 59 58 56 52 53 51 47 46 91 135 101 72 71 72 73 80 96 144 191 132 201 225 135 111 94 139 147 79 66 79 63 55 54 53 51 54 51 49 50 50 51 51 48 41 24 34 39 36 44 55 61 71 67 56 58 67 66 63 61 59 59 55 54 49 41 37 36 34 34 36 36 37 35 35 35 35 35 37 36 33 34 35 36 36 39 61 179 239 236 237 236 236 234 75 18 29 29 33 43 49 50 45 48 50 53 52 53 53 52 45 21 25 26 26 33 54 64 65 63 60 55 50 48 44 42 39 38 35 35 34 34 34 34 34 34 32 31 31 31 30 31 32 31 32 31 29 29 29 31 32 31 32 32 68 66 41 20 23 23 22 35 48 52 54 52 47 44 41 39 36 35 33 35 35 33 33 32 28 28 30 31 33 29 18 27 22 20 48 59 52 47 38 33 30 29 30 30 30 30 28 28 28 30 29 28 28 28 28 28 30 29 29 28 30 29 31 31 28 28 28 28 26 29 31 30 33 34 37 34 62 61 47 42 34 30 33 32 32 32 35 37 36 36 33 31 30 29 30 31 31 30 30 31 33 34 35 37 29 22 29 24 24 35 36 36 39 36 32 30 29 29 30 30 30 29 28 30 29 27 31 30 30 29 28 29 30 29 31 33 32 30 29 28 28 29 27 28 29 30 31 32 32 33 34 37 41 52 38 31 35 34 34 34 33 33 33 33 34 34 33 32 32 35 34 36 36 37 35 31 29 28 27 28 25 23 31 44 49 27 22 28 31 32 36 42 43 41 38 41 39 38 37 36 37 36 40 40 36 32 34 33 31 31 32 31 34 35 36 40 40 36 35 35 38 38 39 37 36 33 33 34 43 55 76 100 130 148 154 79 31 31 29 29 31 31 32 33 32 31 32 30 29 28 26 23 28 34 47 40 38 38 36 36 37 36 35 34 41 68 122 143 145 140 138 135 132 130 122 119 112 109 107 102 98 96 93 93 95 95 92 94 95 95 107 116 117 122 127 133 137 141 146 144 142 140 137 131 127 129 131 127 129 131 120 108 92 73 56 45 32 29 28 27 25 25 27 30 30 28 29 36 45 35 35 37 35 36 38 40 40 38 49 51 50 50 50 50 54 54 56 61 67 67 73 75 77 77 77 76 78 78 77 75 69 67 66 58 52 47 43 65 124 132 87 82 97 107 114 120 140 193 208 223 250 179 133 121 143 147 127 62 131 112 49 54 60 58 59 56 55 56 59 59 59 56 46 26 34 39 36 41 55 60 69 65 56 58 65 66 64 62 60 58 56 53 48 42 39 38 35 34 36 37 38 36 37 37 37 36 37 37 36 37 36 36 36 39 44 137 231 228 231 233 237 238 78 18 28 26 35 44 48 48 46 46 48 51 51 52 52 50 44 24 24 27 25 31 49 63 67 63 59 55 52 48 46 44 40 38 38 35 34 34 35 35 33 33 33 32 30 31 29 31 32 32 31 30 31 32 31 32 33 31 28 30 52 75 44 18 22 22 21 35 46 52 55 53 47 43 41 39 36 36 34 34 35 34 32 32 31 31 30 30 33 29 20 30 23 22 45 61 56 50 39 33 31 29 32 32 31 31 30 34 31 30 28 27 29 29 29 30 29 29 28 28 29 28 29 31 29 27 28 27 28 30 30 27 28 30 35 37 48 68 46 43 35 32 34 33 33 34 36 36 36 35 33 33 31 30 30 31 31 31 32 31 33 33 34 37 29 22 31 24 25 33 36 39 37 35 31 30 30 29 29 30 33 30 29 30 29 28 31 30 30 29 29 29 30 29 31 32 31 31 28 28 28 28 28 27 28 31 31 30 30 31 33 34 32 42 41 35 35 35 35 36 34 33 33 34 34 34 33 34 33 34 35 36 36 37 35 32 31 30 28 28 27 20 28 38 40 21 26 30 27 28 32 37 41 40 36 33 30 29 30 29 29 29 34 36 34 30 28 28 27 27 27 28 30 28 31 34 35 31 30 30 31 33 35 37 37 39 44 45 45 44 40 37 35 38 66 101 43 29 29 30 31 33 32 33 32 31 31 30 29 28 27 24 26 32 48 41 40 39 37 38 38 39 37 38 62 99 95 75 58 52 49 47 45 45 41 41 42 41 41 41 41 38 37 36 33 36 37 37 38 37 38 39 41 44 45 46 53 59 64 67 78 87 104 121 148 176 214 228 241 240 233 226 201 147 71 48 35 32 29 29 25 25 28 31 32 29 29 32 47 35 34 35 37 36 37 37 39 35 71 81 92 101 117 122 121 123 124 118 114 111 106 105 103 106 103 104 105 110 116 119 124 124 127 129 130 130 133 135 152 162 165 163 165 169 166 178 165 149 157 191 238 171 184 220 164 148 159 107 112 143 68 56 78 93 96 89 85 85 83 82 79 78 60 27 31 39 34 36 51 59 67 69 61 60 61 64 65 62 62 60 58 56 51 45 43 40 37 36 37 37 39 37 39 37 37 38 38 37 37 37 38 36 36 37 40 66 133 136 139 144 153 158 64 19 27 27 33 44 48 48 46 45 48 49 49 50 50 50 43 22 23 28 23 27 46 60 65 62 58 54 52 47 46 43 40 38 36 36 36 35 34 33 32 32 31 31 31 32 30 31 31 30 31 32 32 32 34 34 34 32 28 29 37 79 50 19 23 22 21 35 46 51 55 53 49 45 42 42 38 36 36 35 36 36 33 32 31 32 32 32 33 29 17 29 23 21 40 60 59 54 41 34 31 32 33 32 29 29 30 31 30 31 30 28 29 29 28 28 28 31 29 28 29 30 29 31 31 29 29 29 32 31 28 26 26 28 32 35 42 72 50 44 36 34 33 34 34 35 36 36 36 36 36 34 31 31 32 31 30 32 33 33 34 33 33 35 28 21 29 24 25 32 37 39 36 33 32 30 29 29 28 29 33 30 29 29 30 29 30 30 29 29 31 29 29 28 30 30 30 29 28 29 30 29 28 28 28 30 31 30 29 30 31 31 33 34 46 36 36 36 36 35 33 33 33 35 36 33 34 36 35 35 36 37 36 37 36 33 33 31 30 30 27 22 23 32 29 19 28 27 25 27 32 38 40 37 33 31 27 27 27 27 28 29 30 31 33 32 31 30 26 26 27 27 29 27 29 31 32 29 28 27 27 26 26 27 28 31 36 44 44 40 42 38 34 33 29 35 55 36 31 31 31 32 33 34 32 33 32 29 28 27 27 25 26 28 53 45 40 39 38 38 39 40 40 44 47 34 29 31 33 35 35 37 38 38 36 36 38 38 39 41 40 39 40 39 39 38 38 39 39 39 39 38 39 41 41 40 41 38 39 39 38 37 37 32 35 36 43 66 98 139 164 195 203 179 168 110 40 34 32 28 26 26 29 33 33 27 28 29 43 37 36 37 38 37 38 38 40 38 95 99 99 96 94 90 86 80 77 74 71 70 64 61 60 59 56 57 54 56 58 58 58 56 57 58 58 62 67 74 79 89 101 115 136 165 207 235 206 216 164 151 212 163 182 202 172 137 175 135 118 138 111 107 113 117 118 115 111 107 106 106 102 101 75 31 30 40 34 37 50 58 67 70 60 58 57 58 60 59 60 59 54 54 54 53 40 40 37 38 41 38 38 40 41 41 41 40 41 42 41 41 40 36 37 38 40 50 115 144 162 177 185 198 94 19 27 28 34 46 47 48 45 45 49 49 49 50 49 49 43 23 22 28 24 27 42 56 64 61 56 54 52 50 46 43 40 39 36 36 36 35 35 34 33 32 31 32 32 30 31 31 33 31 31 32 32 32 34 34 33 31 29 30 34 66 62 20 24 21 23 33 45 51 56 54 50 45 43 43 40 37 34 35 37 37 34 32 31 32 32 31 33 28 17 28 22 21 39 61 60 56 45 37 31 32 33 32 29 30 30 32 32 34 33 34 33 32 31 32 33 33 30 30 30 30 30 31 30 29 27 29 32 34 28 27 25 24 27 33 37 63 61 46 36 35 34 35 35 35 37 38 37 37 36 36 33 34 34 32 31 33 34 35 34 34 33 35 28 22 30 25 23 32 39 40 35 34 33 31 29 29 27 28 30 30 30 28 30 30 31 31 29 30 30 30 31 29 30 30 29 29 29 28 29 30 29 29 30 31 32 29 30 31 31 30 29 32 49 40 38 38 36 35 35 36 33 34 37 35 34 35 35 36 36 38 37 38 36 33 32 30 31 30 28 24 21 31 27 19 28 26 25 30 33 37 38 34 32 31 28 28 28 27 27 29 30 30 31 31 32 30 26 25 26 27 28 28 28 29 30 28 27 25 26 26 25 23 25 26 32 39 38 37 38 40 34 33 32 26 39 40 32 32 31 31 33 32 33 32 31 30 30 29 26 23 24 29 49 49 41 39 40 39 39 40 41 41 29 27 29 31 32 33 36 40 38 39 38 38 38 40 38 39 37 37 36 35 37 36 36 36 36 36 36 37 36 37 38 36 37 38 38 37 37 36 37 39 41 41 42 42 43 46 52 66 66 53 73 118 76 34 32 27 26 25 29 34 34 25 27 29 41 40 36 37 38 39 39 40 41 38 51 58 63 72 79 77 75 73 73 70 68 65 60 58 57 58 58 56 55 55 53 52 51 50 43 40 41 41 41 42 45 44 47 48 47 45 97 166 185 207 204 195 200 193 196 193 200 188 179 156 146 140 143 152 150 152 154 153 145 138 143 140 137 142 112 34 30 38 36 37 49 58 74 101 132 137 137 139 137 137 134 130 128 126 129 127 119 115 106 102 99 97 90 85 77 74 66 61 56 54 52 50 43 41 38 37 38 43 86 201 224 213 201 188 83 21 28 29 33 46 48 47 45 45 47 47 48 50 51 50 43 22 21 26 22 26 39 52 63 61 56 54 51 49 44 43 41 40 39 38 38 36 36 36 34 34 33 32 32 32 33 32 34 34 34 35 34 36 35 33 34 33 31 31 31 43 77 25 23 24 27 36 49 53 58 56 49 46 47 44 40 39 38 36 35 36 36 34 32 32 31 30 32 28 17 28 23 19 35 62 62 57 50 40 32 32 32 31 30 30 29 33 38 37 34 35 36 36 34 35 34 33 35 34 33 32 33 34 36 32 31 32 32 35 31 30 30 31 30 31 36 51 77 47 40 37 38 37 37 36 38 39 38 37 36 37 36 36 35 34 33 34 36 36 35 34 34 35 27 22 29 24 23 31 38 40 36 35 33 30 29 29 29 30 30 31 32 31 32 33 31 32 31 31 30 30 31 30 29 28 27 29 30 30 29 30 31 30 31 31 28 27 29 28 30 32 31 33 43 46 39 38 37 38 37 36 36 35 37 38 38 37 36 38 37 38 39 37 36 35 32 32 33 31 31 26 21 29 25 20 30 25 23 35 37 37 37 34 31 31 30 27 27 29 30 31 30 28 29 28 28 27 26 27 25 25 27 27 27 29 29 27 28 27 26 26 25 23 26 28 33 33 33 34 38 41 38 34 35 31 31 45 34 32 32 32 35 35 34 34 32 32 31 30 30 24 21 27 44 52 41 40 39 38 39 39 40 34 25 30 30 29 31 35 36 38 40 39 37 37 36 36 37 37 36 36 35 33 35 36 35 35 35 33 32 33 34 34 34 33 35 36 37 38 36 36 37 38 38 38 40 40 42 41 39 42 42 41 38 36 76 50 33 28 26 27 31 36 35 25 23 28 36 42 38 41 42 42 42 43 40 38 40 49 53 63 71 74 73 73 74 72 70 67 60 58 58 58 55 53 55 53 51 52 50 46 39 37 35 33 33 34 35 35 37 39 43 44 42 50 64 105 173 170 157 154 158 161 162 160 160 165 203 204 203 208 212 220 223 223 208 182 218 187 189 215 180 45 29 36 37 39 48 59 94 99 85 83 81 83 78 75 76 74 73 71 67 68 68 68 74 74 78 86 93 97 105 114 123 128 126 131 133 131 124 115 104 94 79 71 80 151 161 151 150 150 89 27 28 28 35 46 49 48 45 45 46 46 48 49 48 49 44 24 20 26 23 25 38 51 60 59 56 54 50 48 42 42 42 42 42 40 40 41 41 40 38 38 37 36 36 38 36 36 35 34 37 38 38 38 38 37 37 36 34 34 33 33 79 42 25 26 26 38 50 54 61 59 54 51 48 48 43 40 38 38 36 36 35 34 33 32 31 31 33 28 16 28 24 19 35 59 59 55 51 41 34 31 32 31 30 30 29 31 36 36 34 37 40 37 36 37 35 34 33 29 30 30 32 33 35 31 30 32 33 32 32 30 30 32 30 29 30 40 77 50 38 38 39 40 40 41 40 40 40 40 38 38 38 38 38 38 37 36 38 39 37 37 35 35 24 21 28 24 24 32 38 40 37 35 32 30 31 29 29 28 29 30 29 30 31 33 31 32 31 32 30 29 29 28 29 28 28 29 30 29 28 28 30 30 33 32 31 29 29 28 29 29 29 32 42 49 38 36 36 36 37 37 35 36 37 38 39 39 38 39 37 37 39 38 36 35 33 33 34 33 34 27 19 29 22 19 30 24 23 36 40 38 34 32 30 31 31 28 27 28 30 30 29 29 30 28 25 25 26 26 26 26 26 27 27 30 29 29 27 27 26 25 24 24 26 29 33 31 29 32 38 41 40 36 35 35 30 47 36 32 33 33 35 36 33 33 31 29 29 30 30 25 21 24 45 58 42 40 39 38 40 40 40 30 23 30 29 30 33 36 36 39 40 40 39 37 34 35 37 35 33 34 34 33 34 35 34 34 35 33 32 33 33 31 33 34 34 36 36 34 34 34 36 36 37 35 37 38 39 38 39 39 38 37 37 35 43 51 33 28 25 26 31 36 36 26 22 29 33 40 39 40 43 43 42 42 40 35 34 43 46 51 60 70 74 71 72 70 67 66 61 59 56 54 54 54 51 52 51 51 48 46 39 36 34 33 30 31 32 31 32 34 35 36 35 38 42 45 73 136 148 127 112 108 102 97 103 131 233 239 241 241 243 246 246 248 222 199 243 195 221 244 210 58 25 34 35 35 48 61 35 31 41 43 50 56 68 68 68 65 64 63 59 55 52 52 51 54 54 56 54 54 51 47 41 40 42 47 57 66 80 95 112 125 140 148 160 171 182 183 183 189 132 50 25 30 35 47 48 47 45 46 47 48 51 51 48 49 43 24 21 27 24 25 37 50 58 60 57 55 50 47 45 43 42 45 55 59 60 63 67 69 70 72 72 73 70 69 69 67 65 69 70 70 69 66 63 62 61 57 51 49 48 49 72 65 36 30 32 40 51 56 63 58 57 55 54 54 50 47 40 37 36 37 34 34 34 34 33 33 34 28 18 26 25 21 36 60 60 56 49 42 37 33 31 31 31 30 29 30 30 31 31 34 37 40 61 78 91 98 107 111 117 119 126 125 121 122 122 118 119 121 120 118 117 117 115 115 119 118 124 117 105 100 98 92 80 79 74 71 64 59 54 54 52 48 45 45 43 41 45 46 43 40 36 34 23 22 29 23 23 33 40 42 38 36 31 30 32 31 31 31 29 28 29 31 31 32 31 31 29 30 29 28 27 27 28 28 27 29 33 32 29 29 31 33 33 32 32 32 29 27 29 29 29 30 38 58 40 37 39 37 36 36 36 37 38 39 39 39 40 41 38 38 39 40 38 38 35 33 34 33 34 28 20 27 20 25 32 23 26 37 40 38 34 32 29 29 30 28 27 29 29 27 28 29 28 29 26 26 26 26 28 26 25 26 28 31 31 30 27 26 25 24 26 26 26 30 33 28 26 31 39 41 39 38 38 36 29 44 41 34 32 32 34 34 34 33 32 30 28 29 31 26 21 23 36 66 42 41 39 39 39 39 38 29 25 30 30 29 32 35 39 39 40 40 39 36 35 35 35 34 34 34 35 35 34 33 34 34 33 33 33 33 32 31 33 35 33 33 33 33 34 33 33 34 32 33 37 36 37 38 37 38 37 36 35 36 33 46 36 29 26 26 29 35 37 28 19 28 31 41 39 40 42 42 41 39 36 35 32 40 42 44 54 65 73 69 69 69 67 64 62 60 57 54 54 53 51 52 51 52 48 44 39 36 35 34 34 34 33 32 32 34 34 35 32 35 37 38 48 77 120 76 67 65 70 75 97 126 174 193 209 222 232 241 244 243 187 176 212 158 190 196 163 50 23 31 36 33 49 56 22 26 35 40 47 58 69 70 68 63 64 63 61 58 55 55 53 52 51 50 50 48 46 48 50 48 43 41 44 42 42 43 44 47 51 55 66 78 96 118 178 241 227 151 49 29 36 48 50 46 44 45 43 48 51 53 50 50 44 25 20 28 24 26 37 47 56 58 57 54 50 47 44 43 83 120 135 133 131 128 126 125 118 112 108 109 106 104 107 110 107 109 118 121 121 124 124 121 127 129 129 134 135 137 142 142 131 127 122 119 118 114 111 102 89 77 67 65 59 52 45 42 39 36 35 33 34 33 33 32 33 26 18 25 23 20 36 63 61 55 48 43 37 33 32 32 32 31 29 28 31 32 31 31 49 92 121 115 99 94 82 77 67 61 58 52 52 49 48 45 47 52 52 54 54 55 50 51 53 57 57 62 67 75 84 89 101 109 120 129 139 147 153 152 150 146 133 125 108 86 72 66 52 46 40 39 22 22 28 22 24 35 44 46 40 36 32 31 32 31 30 30 29 30 30 30 32 32 33 31 30 30 30 30 29 29 29 29 28 29 32 32 30 30 34 34 36 34 32 31 30 29 30 29 29 31 35 62 45 40 38 38 38 36 36 38 40 40 39 40 38 39 39 40 40 40 40 38 36 35 36 33 35 30 21 29 21 27 29 23 27 37 40 38 34 31 31 31 29 28 28 27 30 30 30 29 27 28 26 27 27 27 28 28 28 27 28 31 31 29 27 26 25 26 25 26 26 28 32 27 26 30 38 40 39 37 38 39 31 40 44 35 34 33 34 35 33 34 34 32 30 31 33 28 20 23 34 70 42 41 39 37 38 40 40 30 26 31 29 30 33 35 38 39 41 42 39 38 35 35 35 34 35 35 35 35 35 35 35 34 33 35 35 34 32 34 34 34 32 34 33 32 32 31 33 32 34 36 37 36 38 38 37 39 38 37 35 36 32 40 42 29 26 26 28 34 37 29 18 25 29 39 38 38 40 41 40 39 37 36 28 37 39 40 48 56 68 71 69 69 66 62 59 61 57 56 55 54 52 50 50 48 46 44 42 37 36 34 33 33 34 34 34 34 34 32 31 33 35 34 36 46 85 106 154 171 127 132 179 188 201 222 225 211 205 196 180 162 108 109 118 90 117 128 124 54 25 30 36 34 47 55 22 23 35 36 44 58 72 72 65 65 65 63 61 58 54 54 53 50 44 43 42 42 43 42 44 42 38 38 38 38 40 39 43 43 44 43 47 48 50 48 51 110 146 153 163 82 36 50 49 46 44 44 47 51 52 54 50 48 44 26 19 28 25 27 35 45 54 54 56 54 50 47 47 63 65 54 42 41 39 39 39 40 41 37 36 37 36 37 39 38 47 51 50 47 46 46 41 41 40 37 36 40 42 45 51 63 75 82 95 106 117 130 147 161 175 186 193 205 187 127 59 43 38 35 35 35 33 34 33 33 33 26 17 26 24 20 36 61 63 58 51 44 35 31 29 30 31 31 30 29 33 34 34 41 54 44 29 27 29 29 34 35 36 37 38 38 38 37 38 40 44 44 45 44 47 47 48 45 46 45 39 38 38 37 36 35 38 37 35 34 38 38 49 59 78 96 119 144 166 174 213 228 173 101 46 38 23 22 28 24 28 37 46 45 39 35 31 31 31 29 30 31 31 30 31 31 32 31 32 32 31 30 32 33 30 28 28 27 30 31 33 31 32 33 36 36 37 37 35 35 33 34 32 31 29 31 35 50 52 39 39 39 38 38 36 37 38 40 42 42 42 41 40 39 42 41 42 41 39 38 38 38 39 34 26 31 22 30 32 22 30 39 45 41 36 32 30 30 29 29 29 29 29 28 28 29 29 27 26 25 24 27 28 28 29 28 29 31 30 29 28 27 25 27 27 25 25 29 31 28 27 30 38 39 38 36 37 39 36 33 43 36 34 35 35 35 34 33 32 32 30 31 32 30 22 22 28 63 50 41 40 37 39 39 39 29 26 32 30 31 34 37 38 37 41 44 39 38 36 36 36 34 34 35 36 35 34 35 36 33 35 35 34 34 34 31 33 34 32 33 34 34 34 34 35 35 34 36 35 36 38 38 37 38 37 36 34 34 34 34 43 29 26 26 30 36 37 31 19 22 29 38 39 37 41 43 42 38 36 36 27 35 37 35 42 50 63 71 69 67 65 62 58 60 58 58 57 56 53 52 51 52 48 47 41 38 37 38 34 32 36 34 34 33 34 31 30 31 31 32 33 36 61 103 156 175 179 131 171 204 208 194 171 153 148 146 144 142 138 141 139 136 140 139 132 62 25 30 37 35 47 56 29 25 33 34 42 53 71 72 66 66 65 65 62 60 55 53 52 49 44 43 40 42 42 40 40 40 39 38 38 37 39 39 37 36 40 40 42 41 42 45 46 47 47 49 97 141 64 52 50 49 47 45 49 51 52 54 51 49 47 28 18 26 23 24 36 46 54 54 55 53 50 48 48 38 27 27 28 32 45 44 47 50 54 55 53 50 50 51 52 53 54 56 54 54 49 51 51 49 48 46 46 45 45 44 45 47 45 44 41 43 45 49 52 55 62 74 92 157 227 210 161 82 36 37 35 34 35 35 35 32 33 27 18 26 25 21 36 60 62 58 51 44 36 33 32 31 30 30 31 29 29 31 35 43 31 23 26 24 27 32 36 36 41 42 42 43 45 46 45 43 41 42 41 38 39 40 41 42 46 38 34 35 34 32 32 31 32 35 35 37 40 41 40 40 38 38 40 43 52 61 98 167 190 187 136 52 21 23 27 23 30 37 46 43 37 34 31 30 29 27 31 31 30 29 29 29 31 29 32 33 32 31 32 31 30 29 29 27 29 32 31 31 32 35 35 37 49 55 61 64 68 72 74 75 77 80 82 88 94 86 86 85 85 81 77 78 72 73 70 66 58 51 44 41 41 40 40 37 36 38 41 42 44 42 33 36 28 34 34 28 35 44 50 46 36 32 30 31 32 30 28 27 28 28 28 28 28 29 27 27 28 28 28 28 29 29 29 31 30 30 28 27 26 27 26 25 26 30 30 28 27 30 37 38 37 37 38 40 38 31 44 37 35 37 36 37 36 34 35 34 31 32 33 32 24 22 28 57 58 38 37 37 39 38 38 28 26 32 30 30 35 38 39 38 42 44 41 37 37 37 36 34 33 35 36 35 35 37 37 36 35 35 34 32 34 33 33 35 33 33 33 34 33 34 34 36 36 37 35 36 36 37 36 36 37 37 34 34 33 33 41 32 25 26 33 38 39 33 21 22 28 37 40 38 41 42 41 40 38 38 23 32 36 32 38 49 55 66 70 65 64 60 60 63 59 58 59 56 54 52 51 51 50 48 41 39 34 35 35 32 33 33 33 33 32 32 31 29 28 30 34 36 46 76 152 170 173 126 172 186 154 146 146 148 148 148 147 149 152 151 153 153 150 146 142 77 25 28 36 33 42 59 32 26 35 37 38 49 66 70 67 67 67 67 62 58 54 53 52 49 44 42 41 41 41 40 41 39 38 36 38 39 39 38 38 35 37 37 40 38 37 40 40 41 40 42 44 68 104 64 51 49 47 46 48 52 51 51 53 49 44 28 18 25 22 24 36 46 55 57 53 50 48 46 40 22 21 29 29 30 54 57 50 49 53 56 58 55 57 53 49 47 50 48 43 42 40 39 41 41 37 34 35 35 33 34 35 36 38 40 44 43 43 40 39 37 39 38 41 38 42 56 100 146 79 37 34 33 34 34 34 34 33 26 15 24 23 19 37 59 62 57 51 45 36 32 31 32 32 32 29 27 30 30 30 34 19 22 26 23 26 37 41 40 42 44 43 43 42 41 39 37 35 33 33 34 33 30 32 33 35 34 31 31 31 29 27 28 27 28 30 29 32 34 33 31 32 32 30 31 33 35 38 33 37 49 115 142 32 21 25 22 28 38 48 45 38 33 33 31 28 27 29 30 29 29 29 30 31 31 33 31 33 31 31 32 32 30 29 28 29 31 31 33 44 76 125 152 163 160 156 150 147 146 138 134 125 118 116 114 116 112 113 110 111 112 110 112 113 111 119 129 131 129 132 136 136 135 130 128 124 118 112 104 96 87 81 74 65 62 57 53 52 58 58 51 45 38 34 32 30 28 29 27 28 27 27 27 28 27 27 27 27 29 28 27 28 26 27 31 32 30 28 27 26 25 25 26 27 30 30 28 27 28 34 39 37 37 39 39 39 32 46 43 36 36 37 38 37 35 36 35 33 34 34 33 24 20 24 42 73 42 39 38 39 38 36 27 27 31 29 29 34 37 39 40 42 44 38 37 38 37 34 34 34 34 35 34 35 36 35 34 35 35 34 32 33 33 31 35 35 34 34 35 34 34 34 36 37 37 34 36 37 38 38 38 38 37 34 35 34 30 40 34 28 30 35 38 39 35 20 19 26 37 42 39 39 40 40 41 39 38 23 31 36 33 36 48 52 60 70 67 63 62 61 62 61 60 59 57 56 54 51 50 48 48 42 37 34 34 33 32 31 33 34 35 32 30 29 29 28 31 35 36 39 50 147 166 156 138 151 191 168 156 154 154 154 155 157 157 158 159 160 159 161 164 165 102 21 28 35 34 46 58 39 23 32 35 34 45 63 71 68 65 65 66 64 60 55 52 51 48 45 42 43 41 42 40 41 40 37 37 37 39 39 37 36 35 36 39 38 36 37 39 41 40 38 38 39 43 80 81 51 50 46 47 49 51 52 51 52 50 45 30 17 24 25 26 35 45 53 55 53 50 47 47 38 21 24 31 26 29 52 61 55 52 55 57 55 55 55 52 43 39 50 49 43 42 42 40 37 39 36 34 32 33 29 30 30 31 30 33 39 41 38 35 32 31 33 34 35 38 42 41 39 64 105 58 35 34 35 36 35 33 33 25 15 24 23 19 36 57 62 58 53 46 39 34 32 32 32 31 30 29 30 29 31 31 18 24 28 22 25 34 44 44 47 44 42 42 39 38 36 36 33 35 31 30 30 30 29 29 30 31 32 30 31 28 29 29 28 29 28 29 28 30 30 31 31 31 27 26 30 30 31 33 35 36 38 81 84 29 25 21 29 38 47 44 38 34 33 32 32 30 29 28 29 31 31 30 30 32 32 32 32 31 32 32 31 32 30 28 29 31 33 38 72 99 85 70 66 60 53 52 49 46 40 41 39 37 39 45 48 47 47 45 38 37 34 36 35 35 35 40 42 45 46 45 57 62 71 78 84 97 114 126 144 155 165 176 185 184 181 177 165 156 135 104 61 44 38 33 31 30 29 28 28 28 27 27 28 26 27 28 28 28 26 26 27 26 28 32 33 29 29 27 27 26 27 27 28 31 29 27 26 27 31 37 38 39 39 39 41 32 42 44 36 36 37 36 38 37 38 37 34 35 36 36 27 23 24 33 74 43 41 39 40 40 36 28 30 31 30 31 36 38 40 41 44 44 39 39 39 36 34 34 34 35 35 36 36 36 35 36 32 34 33 32 33 34 34 35 35 35 34 34 33 34 33 35 38 36 36 35 37 38 38 38 38 37 34 34 35 30 40 35 26 30 36 38 39 36 22 17 24 33 48 41 38 39 41 43 41 40 20 28 36 32 32 42 51 55 66 67 63 61 60 63 62 60 58 56 55 54 51 49 49 46 42 37 35 34 33 33 33 33 34 35 33 32 30 30 31 35 38 35 35 38 98 150 140 170 146 186 185 190 189 189 195 199 200 206 211 217 226 230 233 237 243 172 19 25 36 35 44 57 44 23 30 35 34 40 58 70 69 65 67 63 63 63 57 53 49 47 42 41 41 41 41 41 39 40 39 39 38 37 38 38 36 37 36 37 36 38 38 38 38 38 38 38 38 41 50 80 56 48 47 47 50 53 52 50 50 51 47 31 14 22 24 24 33 44 53 53 52 49 48 48 40 22 22 29 26 27 48 65 61 59 58 57 53 49 48 44 39 40 42 42 41 40 37 36 33 33 36 36 34 32 31 30 28 28 29 31 36 37 35 30 31 31 31 31 32 33 37 38 38 39 57 79 36 34 35 36 36 35 34 25 16 23 20 18 37 58 60 57 51 45 39 34 32 32 32 31 32 32 29 29 31 30 17 25 29 23 24 33 43 47 47 45 42 39 37 35 34 33 35 36 32 30 29 30 30 29 29 30 29 30 29 27 29 30 27 29 30 29 27 29 30 30 29 28 27 28 28 29 29 30 31 33 33 34 65 57 26 21 29 40 47 44 39 36 35 32 30 30 29 29 30 31 29 29 31 31 31 32 30 30 30 30 31 32 31 31 31 34 34 47 38 27 29 29 31 36 40 42 43 41 40 39 39 40 43 45 49 47 47 45 46 45 42 37 37 36 35 35 36 36 36 38 37 38 40 41 39 40 38 40 36 36 40 46 65 85 116 143 177 204 239 245 195 128 50 33 34 32 30 28 30 29 29 29 28 29 26 26 27 27 26 26 26 26 28 31 31 28 28 27 26 26 26 25 29 30 27 25 24 25 29 33 36 38 39 37 42 38 40 46 40 41 40 39 41 40 40 38 36 38 40 40 31 25 27 34 72 50 43 43 44 42 36 27 33 34 32 35 36 41 41 42 43 43 40 41 40 38 37 36 36 35 37 36 36 36 37 36 35 35 34 33 33 34 34 33 33 34 34 33 32 34 35 36 35 36 36 35 37 37 38 38 36 37 35 34 32 31 34 36 28 32 35 38 39 36 24 16 21 28 52 39 40 42 46 46 44 42 19 25 37 32 30 38 53 52 63 66 66 62 60 61 61 59 56 56 55 53 52 53 52 48 42 37 34 33 35 33 32 33 34 36 35 32 30 29 31 36 36 32 34 38 69 139 145 183 164 180 198 238 240 240 241 242 241 242 243 244 243 244 243 243 244 184 24 26 34 34 45 56 47 24 29 35 33 37 52 67 73 70 67 65 61 60 55 51 47 46 43 42 42 41 39 38 38 38 39 39 38 37 37 38 38 38 37 37 37 37 37 36 36 36 37 38 39 39 42 66 73 50 47 47 50 54 52 51 49 48 45 34 14 23 24 24 33 44 52 53 51 49 47 46 42 24 22 30 28 26 44 67 63 61 59 56 51 46 42 38 38 38 38 38 36 33 33 33 32 34 36 35 32 32 33 33 29 27 29 31 33 36 34 29 29 30 30 32 32 32 36 37 35 38 43 66 52 35 36 39 36 36 35 26 17 22 20 19 36 54 62 57 51 46 40 35 33 32 31 30 32 31 30 31 34 33 17 25 29 21 23 31 41 47 51 46 39 38 35 35 34 35 35 35 33 31 30 30 30 29 29 30 30 30 29 29 29 29 29 29 31 29 27 29 29 28 28 28 27 28 27 28 29 28 29 29 30 35 44 69 28 20 28 39 48 45 41 37 33 31 31 29 28 29 31 31 29 30 30 31 31 33 31 30 32 31 31 32 30 32 33 34 35 37 21 23 29 26 31 35 36 41 47 48 45 41 39 39 40 40 42 40 37 36 37 37 37 35 32 31 30 30 30 28 29 30 30 30 32 34 37 36 34 34 35 33 33 33 31 32 37 39 50 60 97 124 136 163 146 52 33 33 29 30 31 30 31 30 29 29 27 26 25 26 26 28 26 26 27 30 30 27 26 27 28 27 26 27 28 30 28 25 26 27 28 33 37 39 38 36 45 46 46 57 51 56 59 61 65 66 65 63 62 61 62 59 48 37 30 35 60 50 39 40 43 40 35 29 35 34 34 39 40 44 46 45 45 44 43 42 42 40 41 39 39 40 40 40 39 40 37 36 37 35 35 35 33 34 35 33 33 33 34 34 33 34 36 36 33 35 36 36 37 38 39 38 38 39 36 33 32 31 33 39 31 33 36 38 39 39 26 17 20 26 52 42 43 44 48 46 46 46 24 23 34 34 31 34 55 52 59 64 67 66 62 61 61 61 57 56 54 52 53 53 50 49 44 37 33 32 33 33 33 34 35 35 36 34 32 32 32 37 36 31 31 33 47 103 145 158 157 160 193 224 240 238 239 238 236 238 239 241 240 241 240 239 239 199 30 27 32 35 44 55 53 25 29 36 33 33 46 64 76 75 68 64 60 58 52 47 44 44 44 43 41 39 39 39 38 37 36 35 35 35 37 37 39 36 38 36 38 36 37 36 34 35 38 38 36 36 39 46 82 55 49 48 49 51 51 51 50 48 46 33 15 22 24 24 32 42 51 54 53 52 48 44 43 26 20 32 30 26 39 67 68 64 60 55 50 43 39 37 37 37 37 38 36 36 35 37 36 35 35 36 35 34 35 37 34 29 28 29 33 36 36 32 30 31 32 32 33 33 34 33 34 34 37 46 64 43 36 35 36 36 34 25 16 23 20 19 34 51 60 56 49 45 38 33 33 33 32 30 31 32 31 32 34 34 16 23 28 21 23 34 41 47 53 49 40 37 33 34 34 35 34 34 31 31 31 30 30 30 29 30 31 30 29 28 27 28 29 28 29 28 29 30 30 29 30 29 27 27 27 29 32 29 26 27 28 33 38 52 43 20 29 40 49 45 41 36 34 32 31 30 31 29 30 30 30 31 30 30 31 32 30 30 28 29 29 31 31 30 32 34 34 26 20 27 28 25 31 35 39 41 45 46 45 40 36 32 31 31 32 30 29 30 31 32 31 30 30 29 29 27 28 29 29 29 28 29 28 29 30 26 29 28 28 26 27 29 27 29 31 33 36 39 39 37 33 35 82 113 41 33 28 29 30 31 32 30 29 28 26 26 26 26 27 28 28 27 29 32 32 29 27 28 28 27 27 28 29 30 26 25 25 26 30 37 66 100 141 155 162 164 159 161 155 153 148 146 145 139 133 132 132 132 132 135 142 144 143 141 146 144 140 135 133 131 114 107 105 100 89 82 79 79 75 71 62 64 62 58 52 52 46 47 44 45 47 49 47 45 43 40 37 36 37 36 34 32 34 33 34 34 35 34 34 35 35 34 34 37 37 38 37 38 38 37 39 38 38 34 31 32 31 42 33 34 36 38 40 40 27 17 18 24 47 45 44 44 47 46 47 46 34 21 32 35 29 33 52 54 54 62 66 66 62 61 62 62 60 57 55 51 53 52 49 49 44 38 36 36 34 33 34 34 35 37 36 35 33 32 33 37 36 32 31 33 39 74 123 115 133 135 193 223 247 244 245 244 241 242 243 244 243 243 243 244 243 215 40 27 31 35 44 57 52 27 26 35 32 33 43 62 74 75 70 66 60 55 48 45 44 44 46 42 41 42 39 38 37 36 36 35 34 34 37 36 37 36 37 36 38 37 37 36 36 34 36 36 35 34 39 42 76 69 49 50 50 51 51 50 49 47 46 34 14 21 24 23 32 42 52 53 53 51 47 44 44 28 19 31 31 26 35 65 72 66 60 56 49 42 39 37 37 38 37 40 38 38 39 40 39 37 37 37 36 34 34 35 35 29 27 28 31 38 36 32 31 31 31 31 31 32 33 31 31 33 34 42 61 49 35 34 36 35 36 25 18 25 21 20 34 48 59 55 49 46 38 33 32 32 31 31 32 31 30 30 34 35 17 22 29 23 22 31 40 44 52 49 41 37 34 35 34 34 33 35 33 33 31 31 30 29 31 30 30 30 29 27 27 27 28 27 27 29 29 30 30 28 29 30 28 28 30 30 30 27 25 26 27 31 34 42 52 22 29 39 48 45 40 36 36 35 32 30 30 31 30 31 31 31 31 33 33 33 32 31 30 30 29 30 31 30 30 34 36 23 19 28 27 24 35 41 41 44 48 47 43 39 38 34 32 30 29 28 29 30 32 31 30 29 29 30 29 27 28 29 30 29 31 31 29 30 30 28 28 25 25 25 24 25 25 26 26 30 32 34 33 36 36 34 35 66 69 34 28 29 29 30 31 29 29 27 26 26 27 27 26 26 28 29 32 33 32 29 27 28 28 28 26 28 31 29 26 24 26 26 34 67 120 115 90 81 73 73 66 60 59 56 49 49 51 47 41 47 51 50 50 47 47 51 55 56 60 63 67 72 80 86 94 100 110 117 131 143 147 149 154 157 162 166 163 156 152 143 134 127 119 106 91 81 68 60 51 48 40 39 36 35 35 33 34 34 33 34 35 34 35 37 36 35 36 36 35 37 36 38 39 38 38 38 39 33 28 31 30 42 35 35 36 41 41 39 28 18 17 22 44 50 48 47 48 48 49 49 54 21 29 34 28 32 47 56 54 57 64 64 60 60 63 62 60 58 55 53 52 52 51 49 46 41 36 36 36 35 34 33 34 35 34 36 35 34 32 37 35 31 30 32 35 49 109 115 150 140 179 206 248 246 246 247 245 245 247 247 247 246 245 244 243 228 53 28 31 33 44 59 58 27 25 35 33 33 40 55 72 76 72 64 59 52 48 46 45 43 43 42 41 40 38 37 36 36 35 34 35 34 33 34 35 36 37 37 38 37 37 35 34 34 37 37 35 34 34 38 56 88 53 52 51 52 50 51 49 49 47 35 15 18 24 23 33 40 50 53 53 50 44 43 42 31 20 29 31 25 32 58 73 69 61 56 49 43 40 38 36 36 37 38 40 40 41 43 40 37 38 36 36 33 32 34 35 31 27 28 33 37 36 33 31 30 29 30 31 33 32 30 28 30 33 37 55 62 36 34 33 34 35 24 17 24 19 19 33 46 55 54 48 46 38 35 33 34 33 31 32 31 30 31 34 35 17 22 32 24 23 31 40 42 51 51 44 38 35 33 32 34 33 33 32 32 33 32 31 30 32 31 32 31 30 29 29 29 30 29 28 28 30 30 30 29 31 30 27 28 30 31 30 27 25 26 25 28 31 34 57 32 31 42 49 45 42 37 38 34 32 31 31 31 34 32 32 34 33 35 34 33 33 32 30 31 33 32 32 31 33 33 34 24 22 31 27 23 33 43 46 47 48 44 39 36 35 35 32 28 27 28 29 28 29 28 29 29 30 30 29 30 28 28 29 29 29 29 31 27 27 28 28 27 26 25 25 25 24 24 25 26 30 28 29 27 31 35 35 33 55 41 31 28 27 28 30 29 30 29 27 26 28 28 26 25 27 29 30 31 30 28 28 29 28 27 27 28 27 27 27 25 26 27 44 59 37 27 30 30 33 35 38 38 35 36 36 35 37 38 37 40 43 42 42 42 41 40 38 37 36 36 34 35 35 33 31 32 30 27 29 33 37 37 39 42 54 68 83 96 119 132 151 167 186 202 220 226 230 200 133 83 48 42 36 34 33 33 35 33 32 33 34 34 34 35 35 35 36 36 36 37 36 37 37 37 37 38 37 35 28 29 30 37 42 37 37 42 43 41 29 18 15 21 40 56 51 49 50 50 54 53 84 20 25 34 31 31 44 57 57 55 65 62 60 61 61 63 62 58 58 54 55 53 51 50 47 41 36 36 35 35 33 33 32 33 32 33 33 33 32 35 37 33 31 33 35 39 86 119 170 185 155 193 248 247 248 248 246 247 247 246 246 246 245 244 245 235 65 28 30 35 44 58 55 30 24 35 33 32 40 55 70 73 71 68 61 55 48 46 44 43 42 42 44 45 39 37 37 36 35 34 35 35 34 34 35 34 36 37 38 39 38 38 35 35 37 37 35 35 34 34 46 86 65 57 55 53 51 51 50 52 51 37 15 19 24 25 35 41 49 52 52 49 46 45 43 33 20 31 34 25 29 49 71 68 62 56 50 46 41 37 36 37 37 39 40 39 47 46 40 39 37 36 36 34 31 33 37 32 29 30 32 34 37 34 33 30 30 31 30 33 31 30 28 29 29 34 46 68 39 35 34 37 35 24 17 22 18 19 31 46 55 54 49 45 37 34 34 34 34 32 31 32 31 32 32 35 17 22 30 25 23 31 42 42 51 50 45 41 36 35 33 34 34 34 34 33 33 33 31 33 35 32 33 31 30 30 29 29 30 29 26 27 28 28 29 29 31 30 28 28 30 31 30 29 27 25 25 25 29 35 51 43 33 43 49 47 41 37 37 33 30 30 33 33 33 35 35 35 34 33 33 34 33 32 32 32 32 32 32 33 34 33 34 22 21 30 27 22 29 40 48 49 46 42 37 34 34 34 34 29 28 27 27 27 28 28 29 29 30 31 29 29 30 30 29 29 30 29 29 29 30 28 28 28 27 25 25 25 25 25 24 28 27 26 27 25 28 30 34 32 42 47 30 29 29 29 29 29 29 29 26 25 29 27 28 27 29 28 30 30 30 28 28 28 28 27 28 28 30 29 25 25 28 29 37 29 23 26 29 29 29 33 38 42 41 41 40 36 37 37 37 39 41 39 39 38 39 39 37 34 32 32 31 30 31 30 29 30 32 32 32 34 37 37 39 36 36 36 32 32 35 37 41 45 56 71 93 117 174 193 187 181 108 53 39 35 33 33 34 31 32 33 34 35 35 36 36 37 37 37 37 37 36 36 37 36 37 38 38 36 26 27 29 33 45 36 35 42 43 41 30 19 14 21 38 56 68 79 92 93 94 98 112 20 24 32 32 31 43 53 57 57 63 62 61 61 62 61 62 59 57 56 54 53 52 52 48 44 37 37 37 35 36 33 33 32 33 33 33 33 33 35 36 33 32 33 34 39 59 106 160 218 141 176 232 247 247 246 247 246 246 246 246 246 246 245 244 241 78 28 28 34 46 56 55 31 22 31 33 31 38 50 66 73 71 68 65 60 53 50 47 43 44 43 44 44 38 38 37 37 35 35 35 36 35 34 35 35 36 37 38 38 40 39 38 36 37 37 36 34 35 35 38 64 85 62 58 55 52 52 52 52 51 40 16 19 24 25 35 42 49 53 52 50 47 45 44 34 19 30 36 25 26 42 68 66 62 57 51 46 39 38 37 38 39 39 40 39 38 37 38 38 40 39 37 35 37 38 42 35 31 31 33 35 38 34 32 32 30 30 30 34 32 31 29 28 29 33 38 64 54 36 33 32 36 25 17 21 18 19 31 46 54 54 49 45 39 34 34 34 33 31 31 32 32 32 32 34 17 22 31 23 22 32 47 44 50 51 45 41 35 33 34 34 33 31 32 34 32 32 30 31 32 31 31 30 30 28 30 30 30 30 28 28 29 29 28 29 31 30 29 28 29 31 30 29 28 27 25 25 28 31 44 56 31 42 48 46 40 38 34 33 32 32 34 33 35 36 35 37 35 33 33 34 35 35 35 35 34 34 32 34 33 34 36 21 22 29 24 21 27 39 51 51 46 40 33 32 34 33 33 29 28 27 28 27 29 30 30 30 29 31 31 31 30 31 29 28 28 28 27 27 28 27 29 28 26 26 26 27 27 26 28 29 26 24 25 26 26 27 31 32 34 46 33 28 28 29 28 28 27 28 27 26 27 27 28 28 28 27 30 31 29 28 29 28 26 26 28 27 29 31 27 25 27 32 29 20 23 27 27 28 30 32 38 42 46 45 40 38 35 32 32 31 31 29 30 32 30 31 34 33 29 27 28 26 27 27 27 27 27 29 28 28 29 31 33 30 28 29 30 31 32 31 31 32 33 34 37 37 32 32 38 59 125 111 42 35 33 33 32 32 33 34 35 35 36 36 35 37 37 36 36 37 34 36 36 37 38 40 39 36 26 24 29 29 46 39 35 41 41 39 31 20 18 36 91 127 137 138 138 137 136 131 121 29 26 34 36 35 42 55 60 58 62 67 63 64 64 63 64 63 58 58 57 56 54 53 49 46 43 42 38 37 35 34 32 33 33 33 34 33 34 35 38 35 32 32 35 35 46 90 149 221 155 168 219 245 245 246 247 245 245 246 246 247 247 247 245 244 93 26 28 34 47 57 59 34 22 31 34 32 37 47 64 71 70 68 65 64 56 54 52 49 48 47 42 40 37 37 37 37 36 37 37 36 35 34 34 33 35 37 38 40 40 39 40 38 37 36 35 35 35 35 37 46 96 71 59 56 55 53 53 53 51 39 14 17 23 24 34 43 52 52 51 50 47 45 44 33 19 28 37 27 26 40 67 68 63 58 52 47 40 38 38 39 39 38 40 38 35 36 37 40 43 39 37 35 37 36 38 34 30 31 34 37 38 34 32 32 32 30 31 35 32 30 30 29 30 32 36 47 71 41 34 35 36 24 17 22 18 20 34 48 53 52 48 43 37 34 35 35 34 31 31 33 31 32 32 31 17 21 31 23 22 32 51 49 50 49 45 41 36 34 34 34 33 31 32 33 31 33 32 31 32 33 33 30 29 29 30 30 28 29 29 29 29 29 29 30 32 31 30 30 30 31 30 28 27 27 26 25 25 29 41 64 35 42 47 45 41 38 36 35 33 32 35 35 35 36 36 38 37 35 35 35 35 36 37 35 34 35 34 34 36 35 35 22 21 28 24 21 26 38 50 49 45 40 34 32 32 32 33 30 28 28 29 29 30 29 28 29 29 30 29 30 31 29 28 29 29 30 30 29 30 30 28 27 26 25 26 27 27 26 27 28 26 26 25 24 27 27 28 30 32 46 40 28 28 28 30 29 29 28 27 27 27 29 28 28 28 26 29 31 30 29 29 28 27 27 28 29 29 32 29 27 26 31 25 19 26 26 25 29 32 33 36 42 47 46 41 39 33 30 28 28 28 28 27 29 29 28 30 31 30 29 28 27 28 28 28 29 29 30 29 28 28 29 30 28 26 27 27 28 29 28 27 30 29 31 34 37 38 37 33 29 37 81 69 35 34 31 33 35 33 34 35 35 36 35 36 36 37 36 34 34 35 36 37 38 39 40 40 36 27 22 29 29 45 40 35 41 41 38 30 21 27 60 79 63 50 45 45 42 40 40 144 87 78 81 80 71 75 79 80 81 77 80 77 74 72 72 69 67 65 61 58 57 54 53 54 53 48 47 45 41 38 36 34 32 32 34 34 33 34 35 37 35 32 33 33 34 39 66 128 201 185 158 207 242 246 246 246 245 245 245 244 244 247 246 245 246 109 24 28 32 47 60 59 39 21 30 36 34 36 46 62 70 68 65 64 63 58 56 53 52 49 48 42 48 48 39 37 37 38 37 39 37 36 35 36 35 35 35 38 41 37 38 39 38 36 37 36 37 35 35 36 37 87 82 62 58 56 55 54 51 49 39 15 18 24 24 35 45 53 53 50 51 47 45 44 33 18 27 38 27 27 39 66 68 63 58 52 48 41 38 38 36 39 41 46 44 39 40 45 45 47 41 38 37 38 38 36 34 29 29 32 37 37 34 31 30 32 32 33 36 35 32 31 31 30 33 35 38 74 52 40 39 39 25 17 22 19 22 34 47 55 52 48 44 37 35 36 36 34 34 33 31 32 32 33 31 16 20 31 23 22 29 52 53 50 52 45 40 36 34 34 34 34 32 34 33 31 33 32 31 32 32 32 31 30 29 30 29 29 28 29 30 29 28 29 29 30 30 31 31 32 32 31 29 27 27 26 25 25 26 34 58 45 40 45 43 39 36 36 36 34 33 35 35 35 35 36 36 35 36 36 35 36 36 36 35 33 35 34 34 35 36 33 20 22 29 22 20 27 37 45 47 42 37 32 28 31 30 30 30 29 30 28 27 28 27 28 28 30 30 28 29 30 30 28 29 29 30 30 30 29 29 27 27 27 26 25 27 26 26 25 28 25 25 24 24 27 27 27 28 29 38 50 31 28 27 29 28 29 29 29 28 26 28 28 26 26 26 29 31 31 30 29 28 27 28 29 30 32 32 29 27 28 34 23 20 27 26 25 30 38 36 37 44 47 45 39 38 35 31 30 27 29 27 28 28 28 27 28 30 29 30 29 28 27 29 29 29 28 29 30 30 29 29 30 29 29 28 29 28 27 28 27 28 28 28 31 30 31 31 31 31 29 30 53 41 35 34 30 31 32 33 35 35 35 35 37 37 36 36 35 36 36 36 37 37 39 42 42 39 30 22 28 29 42 42 36 41 40 36 31 26 32 29 20 25 27 28 29 31 34 34 95 93 96 98 97 98 107 115 120 126 131 132 135 137 136 140 138 138 132 127 122 117 106 95 85 73 61 59 54 48 43 36 35 33 32 32 33 35 36 35 36 35 33 34 32 35 37 47 111 171 185 143 201 217 215 217 218 220 221 221 220 222 225 227 227 230 110 24 28 32 48 61 61 43 23 28 36 35 38 47 59 68 66 64 63 63 57 55 54 52 49 47 40 49 47 39 40 42 45 41 39 37 36 36 36 36 37 37 38 40 40 40 40 40 38 40 39 38 36 35 35 37 67 92 68 61 59 59 54 52 46 39 16 18 23 26 37 45 51 54 50 50 47 46 44 36 19 26 35 25 26 38 66 69 64 59 53 49 41 39 37 38 41 53 58 50 39 46 54 51 55 41 39 38 38 37 36 34 31 31 33 36 35 34 32 33 34 33 34 37 37 34 32 33 31 31 34 36 64 64 40 39 40 24 17 23 21 25 38 50 56 53 48 44 38 36 38 37 35 34 32 32 32 32 34 31 16 21 31 23 23 29 49 54 52 49 44 40 37 37 34 34 32 33 32 33 31 33 33 32 31 30 31 31 29 31 30 30 29 27 28 28 28 28 30 30 29 30 30 30 31 30 30 30 28 28 27 26 23 25 31 47 61 42 47 44 39 37 37 35 34 34 37 35 36 37 35 34 34 36 36 35 35 36 36 35 35 35 34 35 38 37 32 20 23 30 23 22 28 38 44 48 44 39 33 30 29 30 32 31 29 29 26 27 28 28 29 28 29 29 28 29 29 30 29 29 29 30 30 29 29 29 29 29 28 26 26 26 25 26 26 28 26 24 24 26 25 27 26 26 31 34 49 32 28 27 30 30 29 26 27 28 26 28 26 25 26 28 30 31 31 29 29 27 27 27 28 28 32 32 29 27 26 32 23 21 27 27 24 28 40 39 38 44 47 44 36 34 37 33 29 27 25 26 29 28 29 28 29 29 29 31 28 28 27 27 29 27 28 31 29 30 31 30 30 31 30 29 28 29 27 27 28 27 28 27 29 31 28 28 29 29 30 29 35 43 35 32 31 31 33 34 37 37 36 35 39 38 37 37 35 39 36 37 38 37 40 42 42 39 31 26 26 28 37 43 37 40 39 35 32 32 27 21 21 24 23 24 25 29 33 37 44 45 44 42 45 44 43 43 41 38 36 37 39 41 50 54 63 71 87 100 112 122 136 148 162 176 185 196 170 108 52 39 38 35 34 33 33 34 33 33 35 35 34 34 33 32 36 37 84 128 175 132 199 192 159 159 160 160 161 161 160 161 167 182 201 219 124 23 28 33 49 61 64 46 25 30 37 36 41 50 59 63 67 64 60 61 57 56 55 53 51 47 46 42 39 43 42 43 43 40 38 38 38 38 39 37 39 41 42 44 42 43 44 43 42 43 41 38 36 34 34 35 48 93 77 70 64 56 130 87 43 37 15 18 23 28 39 47 51 53 52 50 48 47 44 37 17 23 36 26 25 36 66 70 65 60 51 49 43 38 38 36 39 42 42 39 41 42 42 40 38 36 38 38 37 37 37 36 33 34 34 36 37 36 35 36 37 37 37 39 39 36 35 33 32 31 33 36 52 77 36 35 35 24 20 26 21 32 43 52 58 55 48 44 41 39 38 37 36 35 33 33 32 32 35 32 15 21 28 24 21 27 47 56 52 48 43 40 37 34 34 35 31 31 32 34 32 33 34 32 30 30 30 31 30 30 31 32 29 27 30 29 28 28 29 28 29 31 31 31 31 32 31 29 28 27 27 26 25 24 29 37 67 47 47 44 39 37 36 36 35 35 36 34 36 37 35 36 35 35 36 34 34 35 34 34 34 33 33 35 36 38 30 18 24 32 23 22 29 38 44 46 41 37 33 30 29 30 31 30 29 28 26 27 27 29 29 30 30 30 28 29 30 32 31 30 30 30 30 29 28 28 30 29 27 27 27 27 27 26 28 27 26 23 24 24 27 27 27 26 29 32 49 38 30 30 31 31 29 28 28 28 26 26 25 25 26 28 27 32 31 29 29 29 27 28 29 29 33 33 28 27 25 30 23 20 29 27 23 28 38 43 42 43 46 44 35 33 34 34 29 27 27 28 26 27 27 27 29 28 29 30 29 28 27 27 28 26 28 29 26 26 29 28 29 29 30 31 28 26 28 28 27 28 29 28 29 28 26 26 26 27 30 31 30 50 38 33 33 34 34 35 37 35 36 35 38 38 38 36 34 37 38 37 37 38 39 41 41 39 33 25 24 27 35 51 36 41 41 36 32 33 22 20 25 24 21 23 25 26 29 36 44 43 44 42 41 40 38 39 40 39 36 33 33 34 34 34 35 36 35 36 40 44 51 53 63 73 119 210 250 223 137 62 36 35 33 33 34 34 34 34 36 35 34 32 32 33 34 35 59 103 164 137 183 205 159 159 159 158 159 160 170 182 201 220 227 229 125 26 31 36 49 65 66 51 28 30 39 37 40 48 58 61 67 68 64 62 60 58 56 56 53 51 50 47 45 46 45 45 44 41 42 42 43 44 44 42 39 43 46 46 47 47 46 47 45 45 41 41 38 34 36 35 41 77 96 75 69 60 167 119 33 37 16 18 25 27 39 47 55 54 53 51 50 47 44 40 16 19 35 27 24 34 65 70 66 60 52 48 43 40 37 37 39 39 40 40 42 40 41 38 38 38 39 38 37 35 34 33 33 34 35 38 38 37 38 39 40 38 40 42 40 39 38 36 37 36 33 36 46 78 43 33 36 25 21 26 24 34 46 55 61 55 50 46 43 41 41 39 37 36 33 33 34 34 34 34 17 21 29 22 22 28 48 56 53 47 42 39 38 36 34 36 32 30 33 34 31 32 34 33 31 30 30 31 31 31 31 31 31 29 31 29 28 29 29 29 29 31 31 32 34 33 32 31 30 28 26 25 24 22 29 35 63 53 48 45 39 38 37 38 35 35 37 36 37 37 34 35 35 35 35 34 35 35 34 33 32 33 32 32 35 37 30 19 24 33 24 22 30 39 43 46 43 39 34 31 30 30 30 30 29 28 26 25 29 30 30 29 28 29 29 30 32 32 32 31 31 31 30 29 28 28 29 29 29 29 28 28 27 27 28 26 26 25 24 25 27 28 25 26 28 32 49 42 30 31 32 31 30 28 29 27 26 27 26 26 27 28 28 31 32 30 28 29 27 27 29 31 33 32 29 26 29 31 21 20 31 28 24 27 37 44 45 44 42 41 34 32 32 32 29 29 28 26 27 26 27 28 29 29 30 29 29 28 28 29 28 27 28 28 29 28 28 27 28 29 29 30 29 27 27 28 29 30 30 30 29 27 25 25 27 26 28 30 29 45 44 36 35 35 36 35 36 36 36 36 36 36 37 37 36 38 38 37 37 38 39 41 42 39 35 26 22 24 30 54 38 42 42 38 33 32 19 21 25 25 21 22 25 25 29 33 41 39 38 36 35 32 30 30 31 32 30 27 27 27 28 29 29 28 29 29 31 33 35 36 37 39 36 44 90 119 154 164 79 38 35 34 33 32 35 35 35 35 35 34 34 34 35 36 42 78 137 147 153 208 182 176 183 191 206 219 229 225 219 214 199 181 109 62 65 68 83 94 98 95 80 86 93 93 96 101 106 110 114 112 112 113 114 110 109 106 104 100 96 92 87 87 83 84 82 78 76 75 70 71 71 70 67 65 63 63 61 60 56 58 55 53 48 41 38 36 34 34 35 56 104 92 78 68 128 90 46 42 16 18 22 27 39 46 56 56 54 53 50 48 46 47 18 22 32 27 24 32 62 69 65 59 52 49 44 42 40 40 42 47 61 73 78 80 83 87 91 95 101 105 108 111 111 109 107 106 107 108 107 108 104 105 101 99 93 91 93 88 78 70 68 67 61 56 58 77 69 46 41 33 27 31 31 40 48 58 60 58 54 53 47 45 44 43 40 36 34 33 33 34 32 31 19 19 30 22 20 26 47 56 53 47 41 39 37 37 36 34 33 32 31 33 32 31 32 32 32 30 30 31 31 31 29 30 31 28 31 29 28 28 28 29 29 31 32 33 33 33 32 32 30 28 27 28 25 22 26 33 52 65 49 45 39 39 37 37 35 35 37 37 38 38 35 35 35 35 35 34 34 34 35 33 33 33 33 34 35 38 29 18 24 30 21 21 33 42 46 49 44 39 35 32 31 32 30 30 31 30 27 26 29 29 31 31 30 29 31 30 30 32 32 31 32 30 30 30 29 28 28 27 29 30 28 29 28 28 28 27 27 25 26 27 28 27 24 24 26 31 44 49 31 30 32 28 28 26 26 26 26 27 25 26 27 28 28 30 31 28 27 28 28 28 27 29 31 32 30 29 28 31 19 22 31 26 26 27 35 44 49 47 44 40 33 32 31 32 29 28 28 26 27 28 28 26 28 28 28 28 28 26 28 30 27 26 28 29 29 28 29 29 28 28 28 30 30 26 26 26 27 28 29 30 29 27 25 26 28 26 25 28 26 33 49 37 35 35 35 35 36 35 35 36 36 37 37 37 38 37 35 37 38 38 40 40 42 40 37 26 20 25 29 53 40 40 42 40 37 29 17 20 26 25 21 24 28 28 28 32 40 38 36 34 34 33 31 31 31 30 29 29 28 26 28 27 29 29 29 29 27 29 30 32 33 33 35 37 39 39 53 101 140 70 35 34 34 32 35 35 35 35 37 35 34 34 36 37 36 59 115 171 156 196 219 232 235 236 231 221 196 167 153 152 147 149 149 141 142 141 132 133 123 114 106 100 96 95 94 89 90 89 87 88 88 85 85 88 93 94 96 94 101 108 115 119 124 125 130 136 143 147 149 152 157 164 168 169 170 168 163 159 147 141 132 96 52 45 41 41 34 33 35 43 98 89 66 62 69 63 56 43 19 19 25 28 38 46 55 55 54 53 50 47 47 46 19 20 32 29 25 34 60 67 64 59 54 51 45 43 42 43 80 126 145 146 142 138 129 124 122 118 114 108 100 102 94 93 92 93 93 97 96 99 98 102 104 99 100 110 123 125 128 132 139 147 152 158 159 156 156 148 145 135 123 117 107 108 106 102 93 87 74 65 55 51 47 50 46 40 36 34 34 33 33 30 18 18 29 23 22 29 46 56 54 48 42 40 38 38 36 34 33 31 33 34 32 30 31 31 33 32 32 31 31 32 30 31 31 28 29 29 30 29 30 30 31 31 33 33 34 34 33 32 32 30 30 28 26 24 25 30 48 71 48 45 40 38 37 36 36 37 38 38 36 37 35 34 36 35 35 34 34 33 36 35 35 34 34 36 37 41 31 19 26 30 21 22 33 46 50 50 45 38 33 32 32 31 30 30 30 30 28 28 29 30 33 32 31 32 31 31 31 30 32 30 31 30 30 29 29 29 28 28 29 29 28 30 31 29 29 29 28 27 27 29 29 28 25 25 25 30 38 58 30 30 31 28 30 26 27 27 27 27 25 26 28 29 29 31 33 29 28 29 29 29 28 30 33 33 30 28 28 33 18 23 31 25 26 28 34 43 49 46 44 39 33 32 31 32 31 30 29 27 27 28 27 27 28 27 29 29 29 28 30 30 28 28 29 29 29 28 30 29 26 27 30 31 31 27 26 26 26 28 28 28 28 28 28 27 27 27 26 27 29 30 49 39 36 35 35 36 36 36 36 37 37 36 36 38 39 38 36 36 38 38 39 41 40 41 37 27 22 23 27 49 45 38 42 40 35 28 18 22 27 23 20 28 31 29 28 32 42 39 36 34 31 32 31 29 31 30 30 30 28 28 29 29 29 29 28 27 28 28 31 29 29 28 29 29 29 30 33 35 72 113 50 35 34 34 35 34 34 35 37 37 33 33 35 36 33 39 85 149 165 185 216 205 184 167 162 159 150 152 155 139 95 70 51 46 46 43 39 36 39 40 41 39 40 37 35 37 37 36 37 39 41 44 48 46 44 45 39 36 35 34 33 33 32 32 32 33 34 35 39 44 50 55 60 71 81 94 111 126 151 196 253 238 158 88 44 39 36 34 33 37 77 106 75 36 53 70 70 48 19 16 22 28 39 46 56 56 55 53 50 49 48 45 19 17 30 28 24 34 60 70 66 59 56 54 48 44 45 70 90 66 46 41 36 39 43 40 35 33 33 35 35 34 36 37 41 44 53 54 51 51 45 39 37 36 33 31 29 30 31 32 35 36 39 49 55 61 74 82 100 109 125 132 148 162 178 184 197 207 211 206 198 189 163 132 82 51 38 37 33 34 34 32 17 19 27 21 21 28 44 52 52 46 41 40 39 38 35 34 34 33 33 34 33 33 31 31 32 30 29 31 32 31 31 31 30 29 31 31 31 33 33 33 32 33 35 36 37 36 33 33 33 32 32 31 28 27 27 28 40 70 55 44 41 40 40 36 37 39 39 38 37 38 37 35 36 36 37 37 37 35 36 35 36 36 35 37 37 42 30 19 26 30 22 24 34 49 52 48 44 37 34 34 33 32 31 31 30 29 28 29 29 30 32 30 29 31 31 31 30 30 31 31 30 29 28 30 30 28 28 30 31 29 30 32 32 29 28 30 28 27 27 29 28 26 25 25 25 28 35 60 34 32 33 29 27 27 29 29 28 29 29 29 30 29 29 30 33 31 30 29 29 28 30 31 34 33 29 27 33 32 17 23 31 25 25 29 34 39 48 46 43 39 33 31 32 32 32 30 29 27 29 28 27 29 29 26 28 29 29 30 32 30 28 28 29 29 28 27 27 26 27 27 28 28 29 26 26 27 27 27 30 29 28 27 27 30 29 29 25 26 29 28 43 39 38 37 36 37 36 36 36 36 37 37 38 39 38 38 38 38 39 40 39 41 40 41 36 29 21 21 27 41 57 39 40 39 36 26 17 24 28 22 19 27 33 30 29 31 42 37 35 34 32 32 33 32 31 28 29 29 29 27 28 28 28 27 27 28 28 27 28 29 32 30 27 28 28 27 29 33 38 76 79 40 37 36 35 33 35 35 36 36 33 33 33 34 33 31 66 107 142 171 212 172 160 163 166 168 171 174 151 72 41 41 40 40 40 42 43 42 44 44 44 43 43 42 39 38 40 38 41 41 40 40 41 42 43 43 40 36 36 37 38 38 36 36 35 38 37 38 38 40 41 43 44 43 40 41 42 42 49 74 146 149 165 182 104 43 36 33 32 34 52 136 188 52 45 84 152 110 12 17 23 27 38 46 56 56 55 54 50 49 47 45 20 19 30 29 26 33 59 71 65 62 59 57 50 45 51 52 30 28 31 28 29 34 38 42 42 40 39 37 38 37 37 40 44 44 46 47 46 46 44 45 40 38 38 38 40 39 39 39 43 45 44 44 45 44 44 43 43 43 46 47 51 52 57 65 75 91 117 138 167 196 224 236 203 148 54 36 34 35 35 33 16 19 28 22 20 28 44 51 50 48 41 39 40 39 37 35 34 31 33 34 33 32 31 30 30 31 30 30 30 30 31 30 31 30 34 34 33 35 36 36 37 36 37 38 42 41 38 38 36 35 36 36 35 33 31 30 37 65 69 47 44 43 41 39 41 43 40 39 39 39 38 38 38 38 37 37 38 38 36 35 37 38 38 39 38 39 29 21 27 32 25 27 34 45 51 46 43 37 37 33 32 32 33 31 29 28 29 30 29 30 32 30 30 31 32 30 29 31 31 30 31 30 30 30 30 29 29 30 31 28 32 34 34 31 31 30 28 29 27 28 29 29 27 23 23 26 32 60 46 33 32 30 30 29 30 30 29 30 29 29 30 30 31 33 36 31 29 28 30 29 30 33 34 33 30 29 33 28 18 24 30 22 22 27 33 38 47 47 42 38 35 31 33 34 31 30 30 29 29 28 26 27 28 27 28 29 29 29 28 27 27 27 29 28 27 26 26 26 26 28 30 30 30 27 26 26 26 26 29 29 27 26 29 30 30 30 27 25 29 28 42 40 37 36 37 38 37 38 36 36 37 38 36 38 37 36 37 37 39 40 40 42 41 42 39 32 21 19 25 34 63 41 43 40 35 24 15 25 27 22 20 26 34 34 33 33 44 38 34 34 34 34 32 31 29 30 30 29 28 28 27 28 27 26 25 25 26 27 27 28 29 30 27 25 26 27 26 27 31 38 80 59 38 37 35 34 34 33 35 36 35 34 32 32 31 28 42 81 118 154 210 200 234 235 237 238 239 242 194 51 31 33 36 37 38 43 48 47 44 45 45 46 49 46 42 41 40 38 38 35 35 37 37 37 34 36 36 35 34 32 31 32 31 30 31 32 31 33 32 34 36 37 38 36 34 35 35 37 38 43 49 41 38 64 140 113 40 35 34 33 40 97 149 70 146 181 204 125 12 17 22 27 39 47 56 58 55 55 51 50 48 49 20 17 30 28 27 32 58 70 65 64 59 57 49 46 43 24 21 26 27 24 29 35 37 38 44 45 44 40 38 36 36 38 40 37 37 38 37 38 39 40 36 36 34 33 34 34 33 34 35 35 36 36 36 40 40 41 39 38 38 38 38 40 41 39 40 39 37 35 36 38 53 78 112 150 169 88 32 35 35 34 16 18 28 22 21 27 44 49 49 45 41 39 36 38 37 36 33 34 34 34 33 33 31 29 31 29 29 30 30 30 31 34 37 34 35 44 59 68 71 73 76 77 75 76 78 79 75 75 75 75 74 72 72 68 64 62 65 79 88 65 56 55 53 52 50 46 44 41 40 40 38 38 38 40 41 41 41 40 39 40 42 40 39 40 42 44 30 26 33 36 27 27 37 46 50 49 44 36 35 33 30 29 32 33 29 29 29 26 28 30 30 28 31 32 32 32 29 30 31 29 29 31 29 27 28 31 30 30 29 31 31 34 33 32 31 30 30 28 28 27 28 30 29 25 22 27 32 47 59 35 33 33 30 32 30 30 29 29 29 29 31 32 32 32 36 33 31 32 32 31 32 34 36 35 31 32 32 25 19 26 30 21 22 26 34 37 45 47 42 39 36 34 33 33 33 31 30 31 28 27 26 28 29 29 28 28 28 27 27 28 29 25 27 28 29 29 28 27 29 29 27 28 28 24 27 26 27 26 27 26 27 28 29 29 31 33 29 27 28 29 38 43 36 38 37 38 39 36 37 37 37 37 39 41 38 39 38 38 39 40 41 42 43 43 39 32 22 19 23 28 62 40 43 41 38 22 17 26 25 21 22 26 33 36 34 34 43 40 34 33 33 32 31 32 31 30 30 28 29 28 27 27 28 27 27 28 28 28 28 28 28 29 26 25 26 27 26 26 28 33 56 82 39 35 34 36 34 33 34 35 33 32 30 32 29 27 33 69 105 140 202 223 250 249 248 247 249 249 196 46 31 31 36 35 37 43 51 50 46 46 48 47 48 47 44 40 38 38 36 35 34 35 33 33 33 32 33 34 33 32 29 29 30 28 29 30 30 30 31 32 32 32 33 31 30 30 31 33 34 33 36 38 39 39 56 114 79 37 35 33 35 77 122 111 114 120 115 82 16 18 24 29 39 48 57 59 57 57 53 51 48 49 20 16 28 30 26 33 57 68 66 64 60 56 49 48 37 18 23 30 26 23 32 40 39 38 42 43 41 39 37 36 33 34 32 31 32 32 31 32 34 33 32 34 33 33 31 31 30 31 32 32 29 31 32 36 37 36 34 33 33 31 32 33 35 34 34 38 39 41 44 45 40 38 39 46 99 140 53 36 35 32 14 18 27 22 22 27 45 50 48 46 42 40 37 38 38 37 34 34 34 34 33 33 32 30 31 29 30 31 31 31 31 37 38 44 100 135 149 153 156 154 156 153 150 147 144 145 141 137 136 138 141 141 143 145 145 140 143 146 152 145 144 150 148 146 141 136 128 120 113 102 90 81 71 64 54 47 40 40 41 40 37 39 42 46 48 49 36 32 42 42 35 34 41 48 51 49 41 36 35 33 31 30 32 32 29 28 30 28 28 29 31 31 31 32 32 31 28 29 31 29 30 29 29 28 29 31 30 29 30 30 31 34 31 31 32 30 29 29 29 30 28 30 30 28 25 26 32 42 65 38 36 35 32 33 33 32 31 32 32 33 33 33 34 34 38 37 35 32 32 33 32 36 38 36 32 34 33 27 21 29 30 23 25 30 35 38 46 50 42 38 37 36 35 34 36 34 32 33 29 27 28 28 28 30 30 30 29 29 28 30 28 27 28 27 29 31 30 28 28 28 27 28 29 26 27 26 27 26 27 28 28 28 29 29 31 34 31 26 26 29 34 47 37 38 37 37 38 36 36 37 37 37 39 40 38 39 40 40 41 43 42 43 43 42 39 35 24 19 21 25 62 46 42 41 36 21 18 28 26 21 23 27 33 38 37 33 43 40 35 36 33 34 34 34 31 30 29 28 29 28 26 26 27 26 28 27 28 26 27 28 30 32 28 26 27 26 27 27 28 30 38 76 59 36 35 35 34 34 36 34 32 30 30 30 29 28 27 47 91 118 197 222 216 214 214 213 212 211 170 44 26 29 33 32 34 40 50 53 47 46 47 48 49 47 43 40 39 38 35 35 35 34 32 32 32 32 32 32 30 31 29 28 29 29 30 30 29 30 30 30 30 30 31 31 31 30 29 29 30 30 33 34 35 36 37 49 97 61 35 32 31 48 118 153 160 150 141 99 16 20 24 31 39 49 63 62 58 57 52 50 46 46 22 16 27 31 27 33 54 69 67 63 60 58 52 49 34 17 21 30 24 20 31 44 43 39 43 44 39 37 35 35 34 32 31 29 28 29 29 30 30 31 30 31 32 34 31 31 28 28 30 30 29 31 32 34 35 33 30 31 31 29 30 31 30 28 29 32 34 36 39 40 40 39 38 38 36 59 101 48 36 31 14 19 26 21 22 27 45 51 49 46 43 41 38 36 37 37 35 35 34 36 35 33 32 31 30 32 31 30 31 29 30 34 58 98 95 74 58 52 51 46 48 47 42 41 44 42 40 37 36 35 37 38 39 41 41 41 41 42 41 40 39 39 50 60 68 73 82 93 107 117 129 140 148 153 162 167 166 165 160 157 148 137 126 118 105 98 87 71 69 68 59 51 47 52 53 49 42 35 36 33 33 31 32 31 30 31 29 28 29 30 30 31 29 29 29 30 27 27 29 28 28 29 29 27 29 30 31 28 28 29 32 35 32 32 31 29 30 28 30 31 31 32 32 34 34 36 41 48 75 54 45 45 46 44 46 43 42 43 41 42 43 43 43 45 48 45 39 36 36 35 35 38 39 40 34 34 35 28 24 34 32 27 28 37 43 43 48 49 43 39 39 38 37 37 37 36 36 36 35 33 33 31 32 31 31 32 32 29 29 30 28 28 29 29 30 31 29 29 27 28 28 29 31 28 28 28 28 28 29 31 29 27 29 31 31 33 32 28 25 28 31 53 38 38 37 36 38 36 36 37 38 38 38 39 37 38 40 39 41 42 43 42 43 43 42 37 24 19 21 25 52 54 40 38 31 20 21 31 25 20 22 27 30 37 40 34 42 39 36 35 33 34 34 33 31 31 29 29 29 27 26 26 27 27 27 27 26 27 28 27 30 31 28 27 27 28 28 28 28 28 32 56 83 41 35 33 35 33 37 34 33 31 31 30 31 30 27 33 81 105 180 188 149 147 149 151 148 147 130 50 26 27 34 32 31 37 50 55 51 48 48 48 46 44 41 39 39 38 35 34 33 33 30 31 31 31 31 32 32 33 31 29 29 29 29 29 29 28 29 31 31 31 31 32 31 29 28 27 28 28 29 31 32 35 35 38 69 90 35 34 31 40 93 183 234 229 224 164 13 21 26 32 39 51 65 64 60 57 54 51 48 46 23 16 26 30 28 33 50 66 66 62 59 58 52 47 37 16 22 33 26 21 28 40 44 41 44 42 38 38 35 34 32 32 31 30 28 30 29 31 30 29 30 32 32 34 33 33 32 31 30 30 30 29 32 34 35 33 29 29 30 29 28 28 29 28 29 29 31 34 35 35 37 34 36 37 38 34 79 73 34 33 16 19 26 20 22 28 42 50 49 46 42 41 38 37 37 36 36 36 35 36 34 34 33 32 32 32 31 31 31 31 30 38 58 46 32 33 32 33 32 35 39 42 41 39 38 38 40 39 40 39 40 40 40 42 43 42 42 43 41 38 39 39 38 37 36 34 35 37 37 36 38 40 49 53 59 66 76 85 104 118 137 152 178 187 204 216 219 208 198 191 171 125 65 51 55 53 40 38 36 33 34 31 32 33 30 30 31 29 29 31 31 31 29 28 28 29 26 27 29 29 29 29 31 30 30 30 31 28 29 29 32 33 33 33 32 31 32 31 32 30 35 58 97 116 128 131 136 137 147 143 139 138 141 139 138 137 138 134 133 132 133 132 131 133 136 132 129 126 115 111 107 102 95 88 75 69 63 50 37 39 35 30 29 36 42 40 48 54 48 44 43 43 42 41 42 41 42 41 40 39 37 36 36 34 32 33 33 30 29 29 28 28 28 28 30 30 27 27 29 29 30 32 32 28 29 27 29 31 30 30 30 25 28 30 29 33 33 27 25 29 31 50 40 41 38 37 39 38 36 37 39 38 38 40 38 37 40 41 42 43 43 42 43 43 42 38 26 20 21 25 47 55 34 32 29 18 22 31 23 19 23 28 31 38 42 39 44 40 36 34 33 34 34 33 32 32 31 30 29 27 26 26 27 28 27 28 26 27 26 26 28 29 27 27 27 28 29 31 31 30 30 35 87 60 34 34 35 34 35 35 34 31 32 29 30 31 27 28 56 102 137 194 141 138 139 142 144 141 139 69 25 26 31 32 30 35 50 57 55 50 50 50 46 42 37 36 38 38 35 34 32 31 31 31 32 33 31 31 31 31 30 30 31 30 29 28 28 29 31 31 31 31 31 31 29 29 29 29 28 28 32 33 30 32 33 34 42 88 56 32 29 32 66 136 221 224 224 159 15 22 28 34 38 52 69 67 62 58 57 53 47 46 25 18 23 29 25 32 48 65 66 61 60 58 53 49 39 18 19 31 26 21 25 35 47 45 44 41 37 34 33 33 32 33 32 30 28 30 30 30 29 29 30 31 32 33 30 29 30 31 29 28 28 29 31 33 34 32 30 29 29 29 27 27 28 28 29 31 32 34 33 33 32 34 35 35 38 34 42 79 45 35 14 18 25 21 21 28 43 51 47 43 44 41 39 38 37 37 34 34 35 37 35 35 32 31 33 32 31 31 31 31 32 39 33 23 27 29 28 29 33 33 34 38 39 40 38 38 38 37 36 37 38 40 41 41 41 43 43 43 39 39 38 37 39 39 39 37 37 37 39 38 40 39 39 40 39 41 39 41 39 36 32 34 42 47 63 83 115 134 181 226 244 238 197 140 67 51 41 37 35 34 32 31 31 35 31 30 31 30 30 30 31 31 31 31 28 28 29 28 28 29 29 28 30 29 27 28 28 28 30 30 30 33 34 33 33 32 31 32 35 65 124 135 124 114 106 99 94 89 88 85 84 82 79 77 77 75 70 70 70 70 63 58 58 59 64 68 72 82 91 97 99 106 118 127 133 135 141 146 152 155 154 150 147 143 141 136 130 121 111 101 92 89 86 78 70 67 65 62 58 54 49 46 40 36 34 32 32 32 28 28 29 29 29 28 30 29 28 27 30 29 28 29 30 29 28 28 30 31 30 30 30 27 28 29 31 35 34 28 25 27 29 45 50 40 40 39 40 39 35 36 38 39 40 40 40 39 40 39 41 42 43 45 45 45 44 40 31 24 20 26 43 70 32 33 25 18 26 32 22 21 25 30 34 39 47 42 45 41 38 35 35 34 34 32 30 31 29 29 28 28 27 27 27 27 28 27 26 25 26 26 27 31 29 27 27 29 28 30 30 29 29 32 65 83 37 36 34 34 35 35 35 34 31 29 28 29 28 24 40 93 110 186 151 138 139 142 149 156 176 114 20 26 31 32 29 31 46 59 56 54 52 52 46 42 37 35 38 38 36 36 32 31 31 31 32 33 32 31 30 31 30 31 30 29 28 29 30 30 30 30 30 30 31 31 29 29 31 29 28 30 33 32 30 31 30 32 37 57 87 39 29 31 50 101 143 148 151 112 22 28 30 36 36 48 70 71 64 60 56 53 49 48 25 17 22 28 24 31 47 65 66 62 58 56 53 47 39 19 19 29 25 20 23 33 48 47 43 40 38 36 34 35 32 31 31 31 29 31 31 31 30 30 30 30 32 33 32 31 32 31 27 26 29 31 30 32 34 33 32 30 28 28 29 29 29 29 29 31 33 33 30 29 32 32 32 34 33 36 33 57 64 35 14 18 24 21 22 29 43 51 48 47 43 41 39 37 37 37 34 33 36 35 35 35 33 32 34 34 33 32 32 30 32 37 25 23 29 30 31 32 31 32 33 36 38 39 40 39 39 37 39 39 39 41 39 39 40 42 42 41 38 36 35 35 36 37 35 36 37 36 37 35 36 36 37 36 35 36 36 37 37 37 37 37 38 37 39 37 42 45 57 84 106 107 129 172 155 70 38 37 33 34 33 32 33 35 32 31 31 30 29 30 30 30 30 31 30 29 28 27 28 30 29 30 31 30 29 29 29 29 32 31 30 35 35 33 34 33 29 32 49 73 61 45 40 39 37 36 37 36 36 36 34 33 35 37 42 44 45 49 47 43 38 39 39 38 35 35 32 33 31 33 33 33 36 38 39 41 45 49 54 62 70 76 84 91 104 117 137 152 167 175 185 194 201 200 196 194 184 177 161 144 118 87 53 42 38 33 32 32 29 28 28 29 27 28 29 28 27 27 28 30 31 29 28 28 28 29 30 30 29 29 30 29 29 29 31 34 33 29 24 25 27 39 56 39 40 37 38 39 37 37 38 38 40 40 42 42 43 43 44 46 45 46 46 47 46 43 33 27 22 28 39 81 35 38 28 22 31 36 25 24 29 34 38 42 48 47 44 41 39 38 36 34 33 31 30 29 28 29 29 28 29 28 27 27 29 26 27 28 27 26 27 30 29 28 29 28 28 28 27 28 29 29 43 89 55 36 35 34 35 35 35 36 31 31 30 31 30 26 28 54 96 141 169 157 180 206 221 232 241 155 19 26 32 35 27 29 43 59 61 59 54 52 47 43 37 36 39 40 38 37 34 32 29 31 31 30 30 30 29 30 31 30 28 29 30 30 29 27 29 29 29 31 31 30 30 30 30 30 30 31 32 32 28 29 28 27 33 35 93 57 33 30 36 81 107 117 123 102 33 33 34 37 41 52 72 74 66 62 54 52 47 48 28 16 21 27 26 31 45 62 63 60 58 56 53 48 39 17 20 29 25 19 21 30 45 49 44 40 37 36 36 36 35 31 30 31 31 34 32 31 29 30 30 33 34 32 31 31 30 29 28 29 29 30 31 32 33 33 32 30 30 30 31 30 29 28 29 29 32 32 29 28 32 31 31 30 31 34 31 39 76 40 16 17 24 20 21 30 42 48 49 47 41 39 38 37 36 36 35 34 35 34 34 33 33 32 32 34 33 33 32 32 32 35 20 24 32 30 29 30 32 36 36 36 39 40 39 39 39 38 38 39 39 39 39 38 41 39 38 37 36 34 33 35 35 34 34 35 33 34 34 34 35 34 36 35 34 36 34 34 36 35 35 33 35 36 36 38 39 38 40 42 45 42 38 43 107 136 51 36 34 33 32 31 33 35 33 30 31 30 30 31 30 30 30 30 30 30 29 28 28 30 28 28 29 30 30 30 30 28 30 30 31 34 36 35 34 35 32 36 43 29 22 27 32 34 36 37 39 38 36 38 38 38 39 40 42 44 46 48 47 46 46 48 48 46 38 34 39 39 37 38 38 37 40 40 41 38 36 37 39 44 45 45 44 43 44 42 34 35 38 38 46 59 79 99 123 143 177 208 227 242 251 235 185 123 57 39 36 30 29 27 28 27 28 30 28 27 28 29 30 30 31 30 30 30 31 31 32 31 30 30 29 28 30 30 30 33 35 33 24 24 27 28 62 40 37 36 37 38 37 39 39 41 42 43 44 47 53 51 53 56 60 62 62 65 65 65 62 57 57 62 69 93 76 69 63 62 66 65 64 64 65 66 64 66 73 70 49 44 41 40 33 33 31 30 30 28 28 28 30 29 28 28 27 28 29 29 27 26 28 27 27 30 30 28 28 28 29 29 29 27 28 29 35 72 80 38 35 35 35 36 35 36 32 32 30 31 31 25 24 34 87 108 183 219 228 231 225 213 193 126 20 24 30 34 28 28 39 54 60 60 56 54 48 41 38 36 39 40 38 38 35 32 30 30 30 31 31 29 29 31 31 28 28 29 30 30 30 28 29 30 29 31 31 30 30 28 27 27 31 32 31 30 30 30 28 28 30 33 72 86 29 29 32 63 103 118 129 118 43 42 39 40 43 66 84 78 68 61 52 49 47 48 29 16 21 27 25 30 44 63 64 60 60 57 53 49 40 17 20 30 26 21 23 30 44 49 46 42 38 37 36 35 33 31 32 31 32 32 34 33 31 30 29 33 34 33 31 31 30 30 29 29 31 31 32 33 34 34 32 30 29 30 30 30 30 29 30 30 33 33 29 27 31 31 31 32 33 34 33 33 70 47 15 18 25 21 24 31 42 49 48 48 43 40 38 36 37 38 34 33 35 36 36 34 32 32 32 33 33 34 33 31 34 36 19 25 32 30 28 29 33 36 36 37 38 39 39 39 39 39 40 39 40 40 38 38 39 38 36 34 35 34 33 34 34 33 33 34 34 33 34 35 35 35 36 35 33 34 33 33 34 35 34 33 35 34 35 37 38 37 37 36 37 36 37 38 42 85 91 41 36 34 32 33 33 34 32 31 30 30 31 30 30 30 30 30 31 30 29 29 29 29 27 29 31 30 29 30 29 29 31 31 30 34 39 37 34 35 34 34 25 21 25 30 30 30 30 33 40 42 42 42 39 39 41 41 40 40 41 44 44 44 44 45 46 44 38 34 34 36 36 36 33 34 37 37 38 36 34 33 36 41 43 42 39 38 39 38 40 41 39 38 38 35 35 35 37 42 52 66 84 108 139 144 154 176 160 82 35 32 29 29 28 30 28 29 28 28 26 29 31 31 30 30 31 31 32 34 35 33 32 32 30 29 30 31 31 34 36 35 25 24 28 25 59 42 39 37 39 40 39 38 41 43 50 69 100 120 141 139 139 141 143 146 148 149 151 152 152 151 149 146 142 148 145 139 133 130 134 142 141 140 139 141 137 133 134 137 47 45 42 39 37 34 33 32 31 30 30 29 30 28 28 26 27 27 28 29 27 27 28 27 27 30 32 29 28 30 31 31 30 27 26 27 29 45 95 51 35 35 34 36 36 36 34 33 32 31 30 29 24 25 64 95 140 201 183 169 154 148 147 132 27 24 30 35 31 29 36 49 61 62 57 54 49 43 39 37 37 36 37 37 34 31 32 31 30 33 33 31 31 33 31 29 29 29 30 31 31 31 30 31 31 31 32 31 30 29 28 28 30 31 30 28 27 28 28 29 31 33 45 104 41 28 29 42 94 109 143 141 76 50 50 47 50 82 106 85 63 55 47 45 43 46 33 18 22 26 26 30 45 64 64 62 59 56 51 46 38 19 21 33 27 21 24 31 42 48 47 44 39 36 37 34 35 33 33 31 31 32 35 32 31 32 32 33 32 32 30 31 30 30 33 32 32 30 30 31 34 34 32 32 29 28 30 30 29 30 31 32 34 35 31 28 31 30 32 32 30 32 34 34 58 58 14 18 25 22 22 31 43 49 49 47 42 40 36 35 40 38 35 33 37 37 36 33 33 32 33 32 33 34 32 31 34 39 20 24 30 31 28 28 35 38 38 36 37 37 39 39 39 38 39 38 38 38 37 35 36 34 35 33 34 34 33 34 33 34 34 32 32 32 33 33 34 34 35 36 35 33 32 32 33 34 34 33 34 33 34 33 35 35 36 36 36 35 33 34 35 37 79 61 36 35 31 34 34 34 33 32 31 31 31 30 30 30 30 31 31 30 28 28 29 30 29 30 29 29 31 32 29 30 32 32 31 35 37 36 34 34 33 31 17 23 29 30 25 27 30 31 39 43 43 43 40 39 38 37 34 33 32 34 36 35 37 38 41 39 36 33 32 32 31 31 31 31 32 34 33 31 31 30 33 34 36 33 33 30 32 33 35 36 36 38 38 38 39 39 43 42 43 44 47 47 45 37 32 41 89 136 67 31 30 29 31 30 28 29 28 28 28 30 30 29 29 30 31 31 32 33 34 32 31 31 31 30 28 29 31 34 37 36 27 23 28 28 53 48 40 36 37 38 40 42 58 100 140 144 132 123 117 114 106 96 86 87 80 76 70 63 56 50 42 40 36 37 38 35 33 36 38 34 34 33 34 33 33 31 37 38 52 45 42 41 36 34 34 33 30 29 30 30 29 28 28 28 29 28 28 28 29 27 28 28 29 29 31 30 28 29 30 30 30 28 27 28 27 35 80 78 37 35 36 36 37 36 36 34 31 32 32 32 26 23 43 86 114 150 160 155 150 157 160 148 36 24 29 36 30 28 35 46 63 63 59 53 50 45 37 37 36 36 36 35 34 33 34 33 32 34 35 35 33 34 33 32 30 30 30 30 30 31 30 30 30 31 33 32 31 30 31 31 30 30 33 32 30 29 28 28 28 30 34 84 74 32 29 37 81 109 222 236 168 67 62 61 59 83 120 91 59 50 46 43 44 47 33 17 21 27 27 30 45 65 67 62 58 56 52 49 37 19 22 34 29 21 23 30 40 46 49 44 40 38 36 36 36 33 32 30 29 31 33 31 31 30 31 32 32 32 31 32 32 30 32 34 33 30 29 30 33 33 32 33 30 28 31 32 32 31 31 31 34 35 32 29 30 30 31 30 30 29 31 32 46 78 12 18 24 21 25 31 43 49 48 48 42 39 40 39 39 38 34 32 35 36 35 33 33 32 33 32 34 32 32 32 35 41 21 23 29 29 28 28 35 37 38 37 37 39 41 40 40 40 37 37 37 38 38 37 35 34 35 35 35 36 33 32 34 36 36 34 33 32 32 33 33 34 35 35 35 34 32 31 33 34 33 34 33 33 32 33 33 33 36 35 34 35 33 34 34 35 50 70 36 34 31 33 34 35 33 32 31 31 32 32 31 31 30 31 30 30 28 29 29 29 29 30 29 29 30 33 30 30 31 31 30 36 39 37 34 34 35 29 18 22 29 27 23 25 29 31 38 42 45 47 41 37 35 33 30 30 30 32 33 32 33 33 35 35 34 32 30 31 30 29 29 30 31 30 31 29 30 31 33 33 36 33 31 29 29 28 30 31 31 32 34 33 32 34 37 39 44 43 42 42 41 40 35 34 34 60 100 41 31 29 28 30 28 27 28 28 29 30 31 30 31 32 31 32 33 34 34 32 32 31 30 29 29 28 30 34 38 39 27 20 25 28 50 56 39 38 38 40 39 53 97 100 72 57 45 39 33 33 34 33 30 33 38 43 43 44 41 39 39 39 37 35 34 34 35 35 35 36 36 35 35 36 37 37 37 36 54 50 44 42 38 36 34 33 32 31 31 30 29 26 27 26 27 27 28 27 26 26 29 26 28 29 29 30 29 29 32 32 30 28 27 26 26 29 55 98 50 37 37 35 35 36 34 32 32 31 31 30 28 24 27 62 101 140 202 190 184 185 186 175 58 22 27 32 32 29 32 42 63 65 60 55 52 47 41 38 37 36 34 34 34 34 34 33 33 32 34 33 30 31 30 30 31 30 28 28 29 30 29 30 30 32 33 33 32 31 31 30 29 31 32 31 29 29 27 27 29 29 33 45 115 44 31 32 64 92 215 253 239 167 112 119 154 194 189 103 65 54 46 42 41 46 35 17 19 25 25 29 44 63 66 61 57 55 50 47 37 18 19 32 28 22 23 30 40 46 49 45 40 37 36 37 38 33 31 31 31 31 32 30 31 30 31 31 34 32 31 29 29 32 33 35 34 33 30 30 32 32 32 33 30 30 31 31 32 34 36 34 35 36 31 29 31 30 32 31 30 29 32 32 39 87 22 17 25 20 25 33 45 49 48 45 41 39 40 40 39 38 34 34 34 37 36 33 33 32 32 31 35 34 31 33 34 43 23 23 29 29 27 29 34 37 39 37 38 39 41 41 39 39 38 38 36 37 36 37 34 34 34 33 34 34 33 32 33 33 31 33 33 33 32 33 34 34 35 35 35 34 33 33 32 33 34 34 33 33 33 33 33 33 36 36 34 34 33 33 35 34 35 60 50 35 33 34 34 37 33 33 31 30 30 29 33 31 31 30 29 28 28 30 28 28 28 29 28 29 29 31 30 31 31 30 29 32 37 38 33 34 38 28 18 26 31 26 22 25 30 32 37 44 44 45 43 38 34 33 30 30 30 30 32 31 32 32 31 32 33 31 30 29 29 29 29 29 30 30 29 29 30 31 30 31 32 31 31 30 29 28 27 28 30 31 29 28 29 30 34 37 37 36 36 39 40 40 39 39 30 27 57 69 31 31 30 29 30 31 29 29 30 31 30 30 32 32 30 31 34 35 33 32 31 30 29 29 27 26 29 35 37 36 28 21 24 28 47 76 36 38 38 38 43 53 41 28 26 27 25 25 27 27 27 29 32 34 41 42 40 40 39 41 39 41 42 40 38 36 35 37 36 37 38 38 37 34 36 35 35 35 54 49 47 42 39 36 33 34 31 31 29 29 28 27 27 27 27 28 28 26 26 26 29 28 30 29 29 29 28 31 32 32 30 30 26 26 25 28 43 93 71 38 38 34 35 36 34 33 34 33 33 31 28 24 23 42 89 116 232 244 242 241 242 240 91 22 26 33 33 29 31 39 59 64 60 57 54 48 41 38 37 37 35 34 33 33 34 33 33 33 33 31 30 30 31 31 30 30 29 28 30 31 29 29 31 32 33 32 33 31 30 29 29 31 32 31 29 29 28 28 28 29 34 33 103 71 31 32 52 83 178 250 251 245 234 236 247 244 209 111 77 69 52 47 44 48 38 17 18 24 26 31 44 61 66 63 57 56 51 45 35 18 20 33 29 22 22 33 43 45 48 46 41 37 38 37 35 33 31 32 30 30 31 29 29 30 32 31 32 33 32 31 32 33 34 36 33 31 32 33 33 31 31 32 31 31 32 33 32 33 34 34 35 36 33 29 30 30 31 32 31 31 32 32 35 73 48 19 24 20 26 33 44 48 49 48 41 40 39 39 38 38 34 33 36 38 37 35 32 31 31 30 32 33 32 33 36 43 22 23 30 30 27 29 35 39 40 39 40 39 40 40 41 41 39 37 36 36 36 35 35 34 36 34 34 35 34 32 33 33 30 32 34 33 32 33 34 34 35 35 34 33 34 32 34 34 34 33 33 34 34 34 34 35 36 35 34 34 34 34 33 34 33 49 60 35 33 33 34 37 34 34 33 32 30 32 32 30 30 29 30 29 29 30 29 27 27 27 29 29 30 30 30 30 32 30 31 32 36 38 35 34 38 27 18 26 32 26 23 29 34 33 37 43 46 45 43 39 35 32 31 30 29 28 29 30 31 32 32 33 32 30 29 30 28 29 30 30 30 31 29 28 31 32 31 31 32 31 30 30 30 30 30 30 31 30 29 28 28 29 33 36 34 33 34 37 40 41 41 40 34 29 34 62 41 32 30 31 32 33 33 32 30 30 28 30 32 32 31 30 32 36 34 34 33 33 31 31 26 27 31 36 38 36 29 22 22 28 37 85 34 38 39 39 36 29 22 23 27 27 32 35 35 33 31 32 37 38 41 39 36 32 33 32 34 34 37 36 37 34 32 31 30 29 32 33 31 31 32 33 32 30 56 51 48 44 41 38 34 34 33 35 32 31 30 29 30 29 28 29 28 27 27 28 27 28 30 29 28 28 28 31 33 32 30 29 27 28 25 26 33 60 99 52 38 34 34 35 36 34 33 34 34 31 29 26 24 25 74 93 177 246 245 246 244 247 101 23 25 31 32 28 30 38 58 64 63 57 53 48 43 39 36 37 36 36 34 33 32 34 32 34 34 34 33 31 30 30 30 31 31 31 32 30 29 31 32 32 32 32 32 31 31 31 28 30 31 32 31 28 27 27 26 28 34 35 67 107 36 31 39 76 129 232 254 250 244 244 239 164 90 58 73 83 71 59 54 54 38 19 17 21 27 31 46 65 66 62 58 56 52 47 34 16 19 31 29 22 23 33 44 47 50 47 42 38 38 37 33 33 34 33 31 31 30 28 29 28 33 31 31 33 34 33 32 32 32 33 33 33 35 34 32 32 32 33 31 31 31 32 32 33 34 34 35 35 34 32 30 29 30 30 29 29 30 32 34 46 84 21 23 21 25 34 44 48 49 47 42 41 38 39 40 36 36 35 37 38 37 35 32 32 33 32 33 33 33 33 38 41 21 23 31 30 27 29 33 36 41 40 41 39 41 42 40 39 37 37 36 35 35 33 33 33 35 34 34 33 33 32 31 32 32 32 33 32 33 33 33 33 35 34 35 34 34 32 33 33 34 33 32 33 35 34 32 33 34 35 34 33 33 33 33 34 33 38 68 39 33 34 35 35 34 34 34 33 32 33 31 32 30 29 30 29 28 28 30 29 28 29 29 29 30 31 30 30 30 30 30 32 36 37 35 34 37 25 18 26 31 26 24 31 39 33 38 44 45 43 40 38 37 32 30 29 30 30 30 30 33 36 32 32 31 30 28 29 30 28 29 31 32 28 27 28 32 33 32 31 31 32 32 31 31 30 30 29 31 29 29 29 30 32 35 35 31 31 34 36 39 41 40 38 37 32 30 39 59 34 31 33 32 31 31 31 30 31 30 31 32 33 32 32 32 36 38 37 35 35 32 30 29 29 30 36 39 39 31 22 21 25 29 71 43 40 41 37 28 19 23 27 29 32 38 40 42 39 38 37 37 37 37 34 32 28 28 28 28 28 29 31 34 31 29 27 26 26 27 28 27 30 31 30 30 28 56 52 49 45 41 38 34 34 34 35 33 32 31 31 30 28 29 29 28 28 28 28 26 28 30 30 29 29 31 31 32 32 32 31 29 28 27 26 29 41 97 74 37 36 37 35 36 35 34 34 35 33 32 28 21 25 52 92 120 187 189 195 189 196 86 23 23 30 33 29 30 36 58 66 63 58 55 50 43 40 39 37 37 36 34 35 33 35 33 35 35 37 34 31 31 29 29 31 32 31 32 31 31 32 34 33 33 33 32 32 32 32 33 31 32 33 33 29 28 28 28 29 31 33 44 119 54 31 34 61 115 194 253 249 247 250 206 99 113 91 48 84 104 67 58 55 37 18 18 23 27 33 45 62 66 63 60 56 52 48 36 18 19 31 29 21 23 33 45 48 51 47 43 39 36 35 35 33 34 34 34 33 32 29 30 30 33 30 31 33 35 34 33 32 31 33 35 36 37 37 34 34 32 33 31 31 32 33 33 33 34 36 38 37 34 32 31 30 32 31 29 30 29 30 35 34 92 28 24 21 26 34 44 50 50 47 43 41 39 39 40 37 35 35 35 39 37 35 33 34 34 34 34 34 33 34 37 41 21 23 32 31 27 28 34 38 42 42 40 38 40 40 41 40 38 38 38 38 33 30 30 31 33 34 34 33 34 32 31 32 32 32 34 33 32 30 31 32 34 33 35 35 33 34 34 34 33 34 33 33 34 34 32 33 33 34 35 35 34 35 33 32 34 33 72 48 33 35 38 36 33 32 33 33 34 33 31 31 31 29 30 30 29 30 30 30 29 29 30 31 31 33 32 31 30 29 29 32 36 36 34 35 36 24 21 28 31 24 24 33 41 37 41 45 45 43 40 38 38 35 31 29 29 29 29 30 36 40 34 34 31 30 29 28 29 30 31 31 31 29 28 30 31 33 32 31 32 32 32 31 30 29 30 30 31 30 31 30 31 33 35 34 30 30 33 36 40 40 39 38 38 37 31 35 62 36 32 33 33 32 33 32 31 31 31 32 31 33 34 34 33 34 38 37 35 34 32 30 30 29 30 35 39 39 33 21 21 23 26 59 49 40 39 38 24 19 26 30 28 30 33 37 40 41 42 39 33 33 32 30 28 27 27 27 26 26 26 27 30 30 29 27 27 26 26 27 28 30 31 31 30 29 57 55 50 47 43 39 38 38 36 37 34 31 35 34 30 29 30 29 29 29 29 28 27 27 27 27 29 29 29 30 32 33 31 30 29 29 27 26 27 29 74 97 44 36 37 36 36 35 32 33 33 35 32 30 23 20 32 70 101 119 140 142 142 142 89 26 23 28 34 28 30 35 53 65 63 60 56 50 43 40 37 36 37 37 35 35 34 35 33 33 34 33 33 32 32 30 32 33 32 32 32 32 32 33 34 34 34 34 33 31 31 32 32 31 32 33 34 31 28 29 30 28 28 31 33 84 106 35 32 41 92 138 247 250 248 237 141 70 97 151 57 109 227 151 54 46 37 21 18 23 26 35 47 61 65 63 59 56 52 47 37 19 18 29 30 22 23 32 47 48 51 47 43 40 35 36 34 34 34 35 34 34 33 30 29 32 33 31 33 35 35 33 34 32 31 34 35 35 34 35 34 34 34 34 32 32 34 34 34 35 35 36 37 36 36 32 30 31 31 32 31 31 28 29 33 32 72 48 24 21 28 36 44 50 49 47 43 40 39 40 39 38 35 34 36 38 35 33 33 34 33 33 30 32 33 34 37 43 22 24 32 32 28 29 34 36 40 41 39 38 39 41 40 40 38 39 38 36 30 29 30 28 30 34 35 34 34 33 30 32 34 33 32 32 30 28 28 30 31 32 34 34 34 34 33 35 33 33 32 32 34 33 33 34 34 35 35 35 32 32 32 32 32 32 60 62 34 35 39 37 33 32 31 31 33 33 33 33 33 32 32 31 29 30 30 30 29 30 29 28 30 33 32 32 31 29 29 31 35 36 34 33 36 25 20 29 33 23 22 31 41 39 41 46 45 45 38 36 35 34 31 31 29 29 29 29 30 33 33 34 32 29 28 28 28 27 29 27 28 27 28 30 30 32 31 32 31 31 30 29 29 30 30 30 30 31 31 31 31 33 35 32 29 29 30 34 38 38 41 40 38 36 30 30 52 39 34 33 30 30 34 34 32 32 32 33 32 33 33 34 35 36 38 37 33 34 31 30 30 29 32 37 40 40 34 23 19 23 24 43 61 37 39 37 20 17 30 29 29 27 28 28 35 41 40 38 36 35 31 28 26 27 26 25 24 25 26 26 28 28 27 28 27 25 27 28 28 27 29 32 33 30 58 58 52 48 44 41 37 38 38 37 33 32 35 33 31 31 30 30 30 29 29 28 28 26 28 27 29 29 30 30 32 34 31 30 30 29 28 27 26 27 51 99 61 38 36 35 33 35 34 34 35 36 32 32 25 20 25 51 93 107 134 147 146 147 100 26 22 26 33 30 30 35 53 66 65 62 56 52 45 41 39 39 37 35 35 35 35 35 35 32 33 32 33 31 31 32 33 34 33 33 32 32 33 32 33 33 34 34 34 34 32 32 32 33 33 34 34 31 30 30 30 29 28 30 33 49 136 51 30 34 78 108 223 250 247 211 116 72 77 116 101 73 216 233 119 37 38 22 18 23 28 36 45 60 64 63 61 57 51 48 37 18 18 31 30 22 25 36 49 48 49 47 43 41 38 37 35 33 35 36 36 35 34 33 31 33 33 33 33 35 36 34 34 34 33 36 35 35 32 34 35 34 35 34 33 33 34 35 35 37 36 36 37 35 36 35 33 31 31 32 33 32 28 27 31 33 59 69 22 24 29 38 44 52 51 48 41 41 40 39 40 38 36 35 37 38 35 34 33 35 33 33 34 35 33 35 39 42 21 24 30 30 27 28 33 34 38 42 40 40 39 40 40 40 39 40 37 36 31 28 31 31 30 32 34 35 33 33 32 32 33 33 32 33 29 26 30 31 31 33 34 34 34 35 34 35 36 36 35 34 34 34 34 34 34 34 33 33 34 33 31 31 35 33 44 66 31 34 38 38 35 34 32 32 33 33 32 33 33 31 32 30 27 28 29 30 28 28 28 29 30 32 34 34 31 30 31 32 34 37 35 34 34 22 21 31 32 23 23 30 40 40 43 45 45 44 38 36 37 36 33 31 30 30 30 29 29 32 32 31 31 32 30 29 28 29 31 29 29 29 31 31 31 32 32 34 33 33 32 31 31 31 30 29 29 32 32 32 32 33 34 31 28 30 31 35 39 39 41 39 38 36 32 29 47 43 35 33 32 31 33 33 33 33 34 34 34 35 33 32 35 38 38 36 33 34 30 30 28 29 32 37 40 40 36 27 19 21 24 32 70 39 40 36 18 20 30 31 28 25 27 27 34 39 40 40 37 34 31 29 26 27 25 25 24 25 27 27 27 28 25 26 27 27 26 27 27 29 29 31 31 28 61 59 54 50 47 45 39 37 37 35 35 33 35 33 31 30 30 29 31 30 27 26 27 28 28 29 28 28 30 30 31 33 32 32 29 29 27 26 26 26 35 78 94 47 36 38 36 37 35 34 35 34 33 34 28 21 19 34 73 97 115 137 146 146 114 32 21 22 33 29 28 33 49 63 66 63 58 54 47 44 41 38 38 37 35 34 34 34 32 32 34 34 33 33 32 32 33 32 31 33 33 33 32 34 33 33 34 34 36 35 33 31 32 33 32 33 32 31 30 29 29 30 30 29 33 31 120 95 25 31 56 98 164 244 242 179 108 67 77 177 173 97 138 221 171 49 45 22 18 23 29 38 46 62 65 63 59 57 51 48 36 18 18 28 27 21 25 35 51 52 51 48 44 42 39 38 35 35 38 37 38 34 33 32 33 33 32 32 32 34 31 31 30 29 32 35 33 31 32 35 35 35 35 35 35 36 35 35 35 35 37 38 38 35 32 31 33 31 31 32 30 30 28 28 29 34 43 87 26 23 32 39 45 53 51 48 40 40 39 40 40 39 36 36 37 38 36 33 35 34 32 31 34 35 34 35 38 36 20 21 30 29 26 29 35 38 39 41 43 43 42 42 39 40 39 38 37 36 31 28 29 31 29 30 33 34 35 33 33 30 32 33 33 33 32 29 30 32 33 34 33 34 35 34 33 35 35 34 35 34 34 33 34 35 34 34 34 33 33 32 30 30 31 32 36 68 37 36 39 40 36 34 32 32 34 33 31 32 32 32 31 30 29 29 29 30 30 29 29 30 30 32 36 37 34 31 30 30 33 37 34 34 34 23 22 33 31 23 24 31 37 41 43 43 42 41 39 37 37 36 33 32 31 30 30 31 32 37 36 31 30 32 29 28 29 31 31 30 29 30 32 31 30 31 32 34 32 31 33 31 31 30 30 31 31 31 31 30 32 33 33 32 29 30 32 34 39 41 43 42 38 37 34 29 38 44 34 32 32 33 32 32 33 33 34 34 33 34 31 32 33 35 37 35 35 35 33 30 30 29 31 36 40 41 38 28 19 20 23 27 71 46 40 37 17 18 28 30 30 26 25 27 31 36 39 38 36 33 32 28 27 26 25 25 25 27 26 26 27 26 27 27 26 26 24 25 24 26 28 28 27 27 61 61 57 54 50 49 44 41 39 38 38 36 36 34 32 31 32 33 35 33 30 29 27 28 29 28 28 30 32 31 32 33 33 31 30 30 29 27 26 26 29 54 106 66 34 35 36 36 35 36 35 36 34 32 27 20 21 24 55 93 103 121 150 158 132 35 21 23 32 31 28 32 48 64 67 65 60 53 48 44 41 38 40 38 35 34 34 34 34 34 33 34 34 34 33 32 31 32 31 32 34 34 33 32 34 33 33 34 35 35 33 30 32 33 32 33 34 33 32 31 30 29 30 28 30 33 82 129 31 30 42 90 132 223 233 157 108 68 109 228 225 162 149 164 141 100 56 26 19 23 28 37 44 59 66 64 60 57 52 48 37 18 18 28 27 20 25 37 50 53 52 47 43 41 41 40 37 36 37 37 37 36 34 33 34 34 34 33 33 35 32 31 29 31 31 34 34 30 31 33 34 36 35 35 35 35 34 35 36 35 36 37 38 38 35 33 34 33 33 34 31 31 31 29 26 32 36 88 41 21 32 38 44 53 50 46 40 40 39 39 39 39 37 37 39 38 36 34 36 34 32 33 33 35 34 34 37 36 19 20 31 28 25 29 33 37 38 40 42 43 43 40 40 39 39 38 37 36 33 30 29 30 30 31 33 34 34 32 32 29 30 32 32 31 31 28 29 31 33 34 33 33 33 34 34 34 35 34 35 34 34 34 36 36 34 34 34 34 32 31 32 33 31 32 33 62 52 35 39 39 37 34 33 33 33 34 33 33 33 33 31 31 31 31 29 29 30 28 29 31 30 32 34 37 36 34 33 32 33 36 34 35 33 20 23 33 30 22 23 29 37 41 43 43 41 40 38 37 37 36 34 33 33 31 32 31 32 36 33 29 30 31 30 30 31 31 31 29 28 29 31 30 29 29 30 31 30 30 31 31 31 30 31 31 33 32 29 30 32 34 34 33 29 31 33 34 39 42 43 43 38 36 33 30 34 47 34 33 32 32 32 32 32 33 34 34 33 33 32 32 32 35 37 36 35 34 32 31 28 29 32 36 41 42 41 30 20 20 23 24 72 51 38 36 19 20 30 30 27 25 24 27 32 35 38 36 35 33 31 28 26 26 25 26 25 25 25 25 27 27 27 26 25 24 23 23 23 25 26 26 27 27 82 78 73 68 63 60 52 48 43 40 41 38 38 39 37 36 39 39 38 35 34 32 30 31 30 28 29 28 29 30 32 34 34 32 30 28 28 28 27 27 28 34 94 92 41 34 35 34 37 37 38 36 35 34 27 23 21 20 37 76 99 105 127 161 203 58 20 22 30 32 29 33 47 64 69 66 62 57 49 45 42 39 37 35 35 34 35 34 34 35 35 35 35 35 33 32 32 31 32 31 33 31 31 32 33 32 34 35 35 32 33 34 32 32 32 33 35 35 34 33 32 31 29 30 29 31 44 130 69 29 34 68 110 174 215 136 102 60 155 248 249 230 182 165 159 159 75 23 22 23 28 37 44 61 70 65 59 58 52 48 34 19 18 30 29 21 24 37 50 54 52 49 44 42 41 39 38 37 38 39 38 35 33 33 33 32 34 35 36 36 34 32 30 32 30 32 34 32 32 34 35 34 36 36 35 35 36 35 37 37 39 39 41 39 37 35 35 34 34 35 32 31 30 28 26 29 34 72 69 21 34 39 46 51 50 46 41 40 40 39 39 38 37 38 39 39 37 35 35 33 34 34 33 34 34 34 39 40 19 21 30 28 25 28 34 38 39 40 40 42 43 40 40 40 40 39 38 36 33 30 29 29 30 30 31 30 31 32 29 26 26 27 28 30 32 31 31 28 31 34 35 34 34 34 35 36 36 34 34 33 32 34 36 36 35 34 34 32 31 30 32 31 30 30 33 45 74 35 38 36 34 34 34 34 34 33 35 33 32 33 31 31 32 32 29 30 31 31 31 33 32 34 36 37 37 34 34 33 35 35 35 35 30 18 25 36 29 23 25 31 37 40 42 42 42 40 36 36 37 37 35 35 32 32 32 33 31 32 32 31 30 31 32 31 32 30 31 30 28 28 30 30 30 29 31 31 31 30 31 32 32 32 32 31 32 32 31 32 33 35 35 34 32 34 34 35 40 41 42 41 37 34 34 32 31 48 35 34 32 32 35 35 34 35 34 33 35 35 34 33 33 36 38 38 35 33 33 31 30 30 30 36 41 41 40 31 19 17 20 25 57 58 39 32 17 21 33 30 25 25 25 28 32 35 37 37 35 34 31 28 26 26 26 26 26 26 27 26 28 27 25 24 23 22 22 20 23 24 26 25 27 28 148 147 150 149 142 138 129 122 117 108 95 83 68 59 48 44 43 42 47 49 41 36 31 32 31 29 29 28 30 31 32 32 34 33 31 29 28 28 27 28 26 30 71 101 57 37 38 38 39 41 39 37 35 33 28 25 21 21 31 59 95 102 110 124 159 52 23 22 28 31 29 33 46 64 70 67 62 57 52 47 42 40 37 35 35 35 36 35 35 35 34 34 34 34 34 35 34 31 32 31 32 31 32 32 33 34 35 34 35 33 33 34 33 34 34 34 36 36 34 33 33 31 31 30 28 29 35 94 116 35 30 47 93 129 184 134 92 58 175 251 251 251 237 215 201 202 99 27 23 22 28 36 43 62 72 65 59 56 51 45 37 17 18 30 28 21 25 39 50 53 52 47 43 41 39 38 39 37 38 38 38 36 34 34 34 33 34 33 34 34 33 31 32 33 31 31 32 31 33 35 35 33 35 37 35 35 36 35 36 36 37 37 39 38 36 35 36 35 35 33 33 32 30 29 25 27 33 50 87 25 34 38 45 52 49 46 41 40 41 41 38 38 37 39 39 40 36 34 35 33 34 35 34 34 34 34 39 39 19 22 29 28 25 27 34 39 39 39 41 42 42 41 40 40 40 39 38 36 33 29 30 31 31 32 32 30 32 31 29 27 27 30 28 28 31 30 29 29 31 34 34 35 35 36 35 35 36 34 34 33 34 35 36 35 35 34 34 32 33 33 31 33 30 31 33 38 82 42 38 35 34 33 34 36 35 33 35 33 35 35 31 32 33 32 31 33 33 31 33 34 34 34 37 39 38 34 33 32 33 34 36 35 27 18 25 35 27 22 25 31 37 39 43 42 41 40 36 36 37 36 35 35 33 33 33 32 32 33 31 30 30 29 30 29 30 31 31 31 30 30 31 31 30 31 31 31 30 30 32 33 32 32 33 32 31 31 32 33 33 35 35 34 33 35 34 35 39 41 41 41 39 34 33 33 30 44 38 34 33 33 34 33 33 35 36 34 34 33 33 33 33 35 38 39 36 34 33 31 30 30 31 35 40 40 40 33 20 17 20 24 48 63 38 29 17 23 32 27 22 24 26 29 31 36 36 37 36 33 31 29 26 27 27 25 25 26 26 26 26 26 24 25 23 23 25 22 23 25 26 25 28 29 40 49 59 67 79 93 105 115 123 134 149 157 170 172 169 168 162 148 130 112 69 46 36 34 32 30 29 29 29 30 32 34 34 35 32 29 29 29 27 26 25 26 48 98 83 48 42 41 43 43 40 38 33 31 28 27 25 26 28 40 85 100 106 106 109 56 19 20 29 32 30 34 45 62 69 68 63 57 53 48 43 40 38 36 36 35 35 35 34 33 32 34 34 33 35 34 31 31 31 33 34 33 32 32 32 33 33 35 34 34 35 32 34 35 35 34 35 36 34 33 32 32 31 29 29 28 30 44 141 61 29 35 72 104 132 145 80 62 176 252 250 252 252 253 253 252 133 29 23 22 26 35 44 59 72 66 58 54 49 47 37 18 16 27 26 21 27 39 51 54 54 49 43 41 40 40 39 40 38 36 34 35 33 33 33 33 35 35 34 33 32 32 33 30 29 30 31 30 32 34 35 33 34 35 35 37 36 36 36 37 38 38 39 40 38 36 34 33 34 32 32 31 31 29 25 25 32 34 96 40 33 37 45 51 51 47 41 41 39 40 38 38 36 38 39 38 35 33 34 34 34 34 34 35 34 34 42 39 20 22 29 27 24 27 34 39 39 39 41 41 41 40 40 40 41 40 38 37 34 30 34 32 29 30 30 30 32 30 29 26 26 29 28 29 31 31 27 27 30 35 36 36 32 35 35 34 36 33 35 35 35 35 36 36 35 35 34 34 33 33 31 30 30 30 32 34 73 52 38 36 33 33 34 36 36 34 34 33 35 34 34 34 34 32 31 32 33 32 32 33 33 35 39 39 37 36 33 33 33 32 36 35 25 19 26 36 26 20 25 32 37 41 44 42 38 37 36 34 34 35 35 34 34 33 32 31 32 32 31 31 30 27 28 27 29 28 29 33 34 33 30 30 28 28 29 31 32 32 33 31 31 31 33 31 30 32 33 33 34 35 35 32 32 31 34 35 36 39 43 40 39 37 35 34 30 39 41 34 33 33 34 34 33 34 34 32 32 33 34 32 33 34 37 37 34 33 34 31 29 30 33 37 40 40 42 35 20 17 19 24 39 73 34 25 19 26 31 24 22 26 30 30 32 36 36 36 34 31 30 28 26 25 26 26 25 24 24 25 25 26 25 26 24 25 25 27 25 25 25 26 28 31 34 34 35 35 34 37 39 40 42 47 56 62 78 88 105 126 162 194 239 233 184 109 44 37 31 30 31 29 28 31 32 34 34 34 33 31 28 29 28 26 24 24 34 76 102 65 41 39 37 36 37 35 34 31 31 32 35 35 34 37 66 94 101 101 103 59 20 21 28 31 31 34 45 60 69 69 65 59 52 49 42 41 39 38 38 37 35 34 34 35 33 33 34 33 34 34 33 32 32 33 33 33 32 33 34 33 33 36 37 36 35 34 35 35 36 35 35 36 35 33 33 32 32 30 29 28 30 32 117 101 30 32 55 94 120 128 94 74 163 248 252 251 250 250 251 250 143 31 24 22 27 35 45 59 72 65 59 54 50 45 38 18 17 28 25 21 28 37 52 55 55 50 44 43 41 42 40 39 37 36 34 34 33 33 32 32 34 35 35 33 32 32 32 30 30 31 31 30 31 33 34 32 33 34 34 36 37 39 37 38 39 39 39 39 38 35 33 31 34 33 33 33 34 31 26 23 30 32 83 61 32 37 46 50 51 47 41 40 39 39 37 37 36 37 40 38 35 33 33 33 32 34 34 34 33 35 39 35 19 21 29 27 24 28 33 38 40 42 42 44 42 41 40 40 41 40 38 37 34 30 30 30 30 30 33 34 32 29 29 26 26 27 28 30 31 31 28 26 31 34 34 34 34 35 36 35 35 33 36 36 35 35 36 36 36 36 36 34 32 32 32 30 29 28 31 32 62 62 40 35 34 33 35 38 36 34 35 35 35 37 35 34 35 33 31 30 32 31 32 33 34 36 39 40 40 38 34 35 33 34 36 35 24 19 27 35 24 21 27 34 39 41 42 42 38 37 37 36 36 35 35 34 33 33 34 31 31 30 31 33 29 27 26 25 27 27 27 29 31 33 30 30 30 29 29 31 34 32 32 31 31 31 32 31 31 32 32 34 34 35 34 34 32 31 33 36 36 39 43 43 42 38 36 33 30 36 43 34 34 35 36 34 33 34 35 35 32 32 32 32 33 34 37 36 34 35 35 32 31 28 32 37 40 41 41 35 21 18 17 23 33 81 35 25 19 28 31 23 22 26 31 32 34 37 36 35 33 31 30 27 27 26 25 25 25 25 22 23 24 26 26 27 27 26 27 28 26 27 28 28 28 28 29 29 29 31 33 32 32 33 33 32 34 35 35 35 38 41 43 62 147 202 224 213 153 76 34 33 29 30 31 32 34 31 34 34 34 33 28 26 28 28 27 25 25 44 98 88 45 36 32 31 32 31 29 30 30 30 37 41 41 40 45 71 94 99 100 65 23 19 30 34 32 33 47 61 70 69 64 61 56 50 46 42 38 38 38 38 37 35 36 35 35 35 34 34 37 35 36 36 33 33 33 32 32 33 34 34 34 35 35 36 36 35 36 35 35 35 35 36 36 35 33 34 35 33 31 30 29 32 69 132 47 25 41 75 108 117 136 103 139 237 251 252 250 252 253 251 152 29 26 22 28 34 42 57 69 64 58 53 47 43 35 18 17 28 24 21 28 37 53 55 53 49 43 42 40 40 39 37 37 35 32 33 32 32 32 34 34 34 35 35 34 32 33 32 32 31 30 30 32 31 33 36 36 37 34 34 35 36 36 37 38 38 37 38 36 36 35 34 35 34 36 34 33 31 29 24 26 33 67 91 28 39 44 53 51 48 41 38 39 39 37 38 38 39 38 36 35 33 34 36 33 35 33 33 33 35 38 33 19 21 28 27 24 30 34 39 40 40 41 44 42 42 41 41 40 39 38 37 35 31 28 29 30 31 33 33 31 29 28 26 27 28 28 31 30 29 26 25 30 33 36 35 35 34 35 35 35 36 36 37 36 35 36 36 36 35 34 34 34 35 34 34 30 28 30 30 50 79 38 35 34 34 34 35 36 35 34 35 36 36 37 36 34 33 32 32 34 31 32 33 34 36 39 42 41 38 36 36 33 34 35 35 24 18 28 33 22 22 27 34 38 42 44 42 40 36 37 36 36 37 36 34 33 33 31 30 31 29 30 31 29 28 28 29 29 28 28 30 30 30 29 28 30 31 32 31 32 31 32 32 33 32 33 32 33 32 34 35 34 33 34 34 34 34 35 36 38 39 42 42 43 39 35 34 31 34 44 35 33 34 34 35 34 35 36 35 34 32 32 32 33 34 36 36 34 35 34 32 32 32 33 37 41 41 41 37 23 19 16 21 28 75 42 20 20 29 30 21 22 27 34 34 36 37 35 34 32 30 28 30 27 26 24 25 24 24 22 22 24 25 26 28 27 26 28 28 29 28 29 29 29 28 30 30 31 29 30 31 29 29 30 29 28 29 31 32 34 37 42 43 50 68 87 109 166 169 74 35 31 31 32 33 34 31 35 35 36 34 32 29 30 29 29 27 24 33 85 103 61 37 34 30 30 30 28 28 30 34 40 42 42 40 38 49 83 100 104 75 23 25 30 38 36 36 48 64 74 72 69 64 57 53 48 46 44 42 41 42 41 38 38 36 38 39 38 38 38 39 39 39 36 36 35 36 35 36 36 37 37 38 37 37 36 37 37 37 38 39 38 38 38 38 37 37 36 34 35 32 30 35 47 122 85 27 34 63 103 112 131 125 122 214 248 247 245 246 250 250 151 31 26 22 31 38 41 54 69 65 58 54 47 45 36 19 20 28 24 23 27 37 53 56 55 48 41 43 41 40 38 37 35 35 32 32 30 33 34 36 34 34 33 34 34 33 32 33 33 33 32 32 33 33 33 37 36 35 35 37 37 36 36 37 38 39 40 40 38 37 36 36 35 36 34 34 35 34 31 25 25 31 51 108 31 37 44 51 51 44 42 41 40 41 39 40 40 41 37 37 36 36 37 37 35 35 33 32 33 35 37 32 19 20 28 26 23 30 35 40 40 38 41 43 42 41 41 41 39 39 38 37 34 31 30 29 29 29 32 33 31 28 27 27 27 28 28 29 27 26 26 25 31 34 33 33 34 35 34 35 36 37 36 38 37 36 35 36 36 36 35 35 35 36 34 34 32 30 30 31 39 82 44 37 34 33 33 33 34 34 35 35 38 38 38 38 35 36 33 34 34 32 33 33 34 37 39 42 41 39 37 35 36 36 36 37 20 18 29 31 22 22 28 34 39 41 44 43 40 36 37 36 36 35 34 32 32 34 32 32 33 31 31 31 29 29 30 31 30 29 29 29 27 28 28 27 28 29 32 32 32 32 33 33 35 33 34 34 35 34 34 34 34 35 35 33 34 34 35 35 38 39 42 43 43 38 34 36 31 29 46 39 34 33 32 34 33 34 36 37 36 35 34 33 33 35 37 37 34 34 33 32 32 32 33 37 41 39 39 37 26 20 16 17 26 55 41 19 20 29 28 20 22 29 35 37 37 36 36 35 30 30 28 29 28 27 25 24 23 22 22 23 26 26 27 27 26 26 27 28 30 29 30 31 30 29 29 31 29 29 30 28 30 30 30 29 28 27 29 31 29 30 31 32 31 35 38 40 60 108 156 79 34 33 33 32 33 31 33 34 35 32 32 30 28 28 29 27 22 26 58 101 90 48 37 34 32 32 30 32 35 41 45 44 42 38 37 44 58 83 104 86 40 53 72 84 83 82 88 98 108 106 105 105 101 99 96 94 92 89 89 86 83 80 77 77 74 75 78 76 71 71 64 60 58 58 55 54 51 51 46 46 47 45 43 42 42 41 41 42 42 43 42 43 38 39 39 40 40 40 42 41 39 37 37 82 134 45 29 45 92 105 113 122 153 188 211 208 198 201 207 214 118 28 26 23 28 36 41 52 68 65 57 55 50 47 37 18 17 25 26 24 27 36 53 57 54 48 43 40 41 39 37 37 36 35 33 34 33 33 35 34 37 38 36 37 35 35 36 35 34 34 33 33 33 35 35 38 39 36 35 37 37 37 38 38 40 40 40 40 38 38 36 36 36 37 37 36 35 34 32 25 25 30 40 95 55 35 43 51 48 45 45 42 43 41 41 41 40 40 36 38 38 39 39 39 37 35 36 35 35 35 40 33 17 20 29 25 24 28 36 39 41 40 43 43 43 41 40 40 40 40 39 37 35 34 32 28 30 30 30 32 32 30 31 29 31 29 27 28 28 27 27 27 30 35 34 34 36 35 34 37 38 37 38 37 38 38 37 37 37 36 36 35 35 34 36 34 32 30 28 33 36 70 60 37 35 33 34 35 33 33 36 35 37 40 41 43 40 38 33 34 33 35 34 33 34 35 40 42 43 40 36 35 36 37 39 37 21 19 29 28 22 23 29 34 40 42 44 43 39 37 35 35 34 35 33 33 34 34 32 33 32 31 31 32 27 30 29 27 29 30 29 27 26 28 28 28 28 30 31 30 31 34 34 33 34 32 35 36 34 35 35 34 36 36 35 34 34 32 35 37 39 40 42 44 44 38 32 34 32 30 48 46 34 34 36 36 34 35 36 37 36 35 35 35 35 35 37 38 35 35 36 33 32 33 36 37 40 40 42 38 27 21 17 17 23 34 32 18 21 30 26 20 22 29 36 36 38 39 36 35 30 28 29 27 28 27 26 25 24 22 23 24 25 25 26 27 27 27 29 28 31 31 30 31 30 30 28 28 28 28 29 30 29 28 28 28 28 28 28 29 28 27 28 29 30 31 30 32 37 46 103 135 51 32 33 34 34 31 33 34 35 34 31 30 29 29 30 28 24 22 40 85 103 66 41 38 37 35 35 37 43 46 47 43 39 43 55 67 74 66 72 95 121 142 154 157 153 150 151 151 148 141 135 127 122 116 114 116 117 115 116 117 125 127 119 124 130 129 133 135 140 145 142 139 142 147 150 151 148 146 141 138 135 134 134 128 123 120 117 113 108 105 102 99 91 86 75 68 59 52 48 48 45 45 42 57 142 75 33 38 79 102 108 111 123 132 146 177 158 150 145 145 93 34 30 27 30 37 40 50 68 61 55 55 52 50 40 18 17 24 23 22 26 36 53 56 53 49 43 42 40 37 38 38 38 37 35 35 35 36 39 37 37 38 38 40 37 37 38 39 38 37 38 38 38 40 40 40 43 42 40 40 40 41 42 40 41 44 45 43 39 39 39 36 37 38 37 38 38 36 36 30 24 27 37 75 81 37 45 49 50 49 46 43 42 42 43 42 41 39 39 40 41 40 39 40 37 36 37 36 37 36 40 32 19 21 27 24 26 29 35 38 41 41 43 42 41 41 39 40 43 42 39 37 36 36 36 31 30 30 31 32 32 28 31 29 31 27 26 29 30 29 28 28 30 34 33 34 36 36 37 38 39 39 39 38 39 40 39 39 39 38 39 37 36 36 35 34 31 31 27 30 36 55 73 37 35 33 35 37 34 34 36 37 39 42 42 43 41 42 39 37 34 35 34 35 35 36 39 42 44 41 36 35 37 36 38 35 21 20 31 26 21 25 30 37 40 43 44 43 40 38 34 36 34 34 35 34 33 32 34 35 34 31 31 31 30 30 29 29 28 30 30 26 27 29 29 29 30 32 31 29 31 35 34 34 35 34 36 37 36 35 34 37 35 35 36 34 35 33 35 37 39 41 43 43 42 38 30 31 33 31 48 51 35 35 37 36 34 35 36 36 37 36 35 36 34 34 36 39 37 35 36 35 33 33 37 37 41 41 40 36 27 21 18 17 22 28 26 17 22 31 24 20 22 28 35 36 37 37 35 33 30 27 26 27 26 26 26 25 25 23 22 23 25 25 27 27 26 26 27 27 28 29 30 31 30 30 29 28 28 28 27 27 28 28 28 29 28 28 27 27 27 28 30 29 28 29 29 31 31 33 42 85 114 42 32 32 34 33 33 35 35 35 31 31 30 30 29 29 25 22 26 63 103 88 48 43 43 42 45 48 48 49 49 54 66 73 68 59 54 57 80 88 69 62 54 52 50 50 46 45 46 47 46 41 39 40 37 37 38 41 39 40 40 43 45 49 51 48 47 48 48 45 43 46 47 47 55 63 70 73 78 84 90 95 109 115 122 132 139 149 160 168 177 182 189 195 199 200 198 195 188 182 169 139 82 54 115 122 39 40 56 97 110 108 108 110 114 125 122 112 110 115 88 42 38 36 35 38 41 51 62 54 50 55 53 53 41 19 16 25 23 21 25 35 52 57 51 47 43 41 39 37 37 37 38 39 37 39 57 73 89 98 100 100 100 102 102 103 101 100 99 100 97 92 90 89 86 84 87 83 80 81 79 74 74 72 71 69 65 61 54 52 53 50 48 45 41 40 40 39 38 32 26 26 36 49 115 48 46 49 52 53 50 45 46 46 46 46 45 43 45 45 45 43 41 40 37 38 38 37 36 37 41 31 19 21 26 24 26 30 34 37 39 41 43 44 41 41 41 40 39 39 41 39 37 36 36 34 34 32 33 33 33 32 32 32 33 29 28 30 31 29 30 31 31 35 36 37 38 39 41 40 39 41 40 42 44 44 41 42 41 40 40 40 38 39 37 37 37 34 28 30 36 42 85 42 36 36 34 36 33 35 39 40 41 42 43 43 42 42 41 40 39 37 36 36 35 36 40 42 44 41 39 39 38 39 46 34 19 21 31 28 23 24 33 41 43 44 44 43 39 36 36 35 35 35 36 36 36 36 34 35 34 33 32 32 29 30 28 27 28 27 27 26 27 28 30 30 30 31 30 29 31 34 34 34 34 34 35 34 36 36 35 35 35 35 33 34 35 36 36 37 38 41 45 44 43 38 29 28 32 31 41 51 36 34 37 37 37 38 38 38 38 36 35 34 33 35 38 40 38 35 35 36 34 35 35 38 43 42 40 36 27 21 16 17 21 30 27 18 25 31 22 18 21 27 35 37 38 38 34 33 28 29 27 28 28 27 26 25 25 23 24 24 23 24 25 27 25 24 25 25 25 26 29 29 29 30 27 27 28 27 28 27 28 29 27 29 29 29 28 27 27 28 30 30 30 29 28 29 27 27 33 47 106 73 33 33 33 33 33 32 33 32 30 30 30 31 31 31 27 23 23 41 97 101 60 46 49 52 54 60 65 71 75 81 71 66 69 80 102 90 59 40 34 37 30 27 32 37 37 40 49 50 51 46 42 39 39 39 38 39 37 40 42 45 49 51 53 53 51 49 45 42 39 38 41 37 37 36 36 37 39 39 40 40 42 43 45 51 56 61 65 68 73 80 94 102 111 122 136 148 173 215 250 245 208 152 111 139 60 46 51 88 113 105 107 111 113 111 110 107 110 120 96 51 48 44 41 42 46 57 60 54 53 53 51 50 40 18 16 26 24 21 25 34 52 57 52 47 42 41 40 37 34 36 38 40 61 106 138 144 148 146 142 141 140 139 135 134 135 134 131 129 129 128 126 131 132 133 134 134 141 146 145 141 142 145 146 146 150 155 156 152 145 142 140 138 131 123 113 106 98 89 75 67 62 62 116 71 47 50 53 53 50 48 48 50 49 50 52 51 51 52 48 49 48 46 41 41 40 39 38 37 39 31 19 21 27 25 26 29 34 39 41 43 43 43 42 42 41 40 38 40 41 39 38 36 37 37 37 36 37 37 36 36 33 35 35 34 34 34 34 34 33 34 33 36 36 38 40 39 41 44 51 56 59 58 59 55 47 46 46 42 39 39 41 39 37 35 37 33 25 26 32 37 86 50 39 38 37 40 39 39 42 44 44 43 42 41 43 43 44 42 42 39 37 36 38 38 40 42 44 43 41 39 38 41 45 34 19 24 34 27 24 27 36 43 45 47 46 44 39 37 37 37 35 34 37 38 35 35 35 35 34 35 34 34 31 32 30 30 29 28 28 27 28 30 30 30 29 30 32 33 34 35 37 35 34 32 35 34 36 36 36 35 36 35 33 35 36 36 35 36 38 39 43 45 44 40 28 27 32 31 35 53 34 34 35 36 36 38 38 38 39 38 36 37 35 36 38 40 38 37 37 36 35 34 35 39 43 42 40 35 27 21 18 14 19 31 23 18 27 30 20 18 21 29 35 37 37 38 34 31 28 28 28 27 27 28 26 26 25 25 25 25 25 26 25 27 27 25 25 27 26 27 29 29 30 29 26 27 28 28 28 28 27 28 27 28 29 29 29 29 28 28 27 29 29 29 27 27 27 27 27 32 59 102 44 34 34 34 33 33 32 33 32 30 31 30 29 30 28 24 23 29 75 103 86 50 54 57 73 82 83 81 82 87 92 104 129 154 183 115 27 26 29 35 29 22 26 36 40 41 40 44 53 53 49 46 41 41 40 37 39 42 44 45 44 43 42 42 43 43 43 40 38 37 37 33 34 33 34 34 33 33 35 35 34 37 37 39 44 45 46 45 45 45 44 41 36 35 35 37 43 60 121 149 158 182 188 167 103 54 49 59 96 111 113 109 110 114 114 119 125 119 128 81 67 60 58 54 54 64 71 60 54 49 44 44 40 18 16 24 21 19 25 33 50 57 52 47 41 42 40 37 35 35 39 60 80 68 52 49 48 48 49 50 50 50 43 39 36 39 37 38 36 37 37 38 39 40 45 50 50 46 45 46 45 41 39 37 39 41 55 61 68 68 79 88 102 111 121 129 138 148 153 158 164 169 179 180 175 175 172 170 166 163 155 148 139 130 116 107 98 86 79 73 58 51 47 44 42 41 38 38 41 31 18 21 27 24 26 29 34 38 42 44 43 44 43 41 41 40 39 38 38 37 36 36 37 36 37 38 40 38 36 36 36 35 35 35 34 34 34 35 35 36 34 37 37 46 80 119 154 166 170 170 172 171 172 170 169 161 160 159 154 153 153 150 145 141 137 134 128 125 120 119 132 122 97 91 82 80 78 73 69 66 64 58 52 49 46 41 40 43 42 39 38 39 41 42 44 47 46 46 42 39 39 39 41 34 25 30 37 28 27 29 39 46 48 49 48 46 41 39 38 38 38 37 38 38 36 36 36 36 35 34 34 35 32 33 33 31 31 32 31 30 30 32 34 31 32 32 33 35 36 36 37 36 35 34 36 36 35 37 37 35 35 36 35 35 35 34 35 37 39 41 44 46 45 39 30 23 28 30 31 62 36 34 34 33 36 36 37 39 42 38 39 38 37 38 38 40 39 39 38 35 34 36 37 41 43 43 39 35 29 23 18 17 19 28 21 17 26 28 20 19 23 30 35 37 38 37 33 30 29 28 29 28 27 27 27 25 25 25 25 25 27 26 25 27 27 25 25 26 24 26 29 30 30 28 28 27 28 28 27 28 26 27 27 27 29 29 30 31 29 29 29 29 27 27 27 28 25 26 26 29 40 88 79 37 34 33 33 34 33 35 35 33 32 30 29 31 29 26 22 26 51 95 100 57 44 52 61 63 81 122 143 138 133 154 199 229 246 137 25 25 30 37 30 21 24 40 45 39 40 42 45 49 49 48 45 42 40 40 40 40 40 37 36 37 37 35 36 39 38 39 37 34 34 32 31 31 29 28 29 29 28 27 29 29 29 32 37 40 39 38 37 34 33 35 33 34 35 35 41 43 45 46 51 66 106 165 142 67 51 59 74 104 126 120 118 118 123 120 144 107 210 163 80 68 67 68 64 78 89 72 53 45 43 43 38 17 18 25 23 20 25 31 51 59 54 48 42 41 40 37 35 35 42 57 34 26 28 31 26 28 31 37 42 49 47 43 36 33 32 32 30 29 32 32 33 40 46 49 50 50 49 50 46 38 36 33 35 35 36 36 34 36 33 34 34 36 40 42 45 51 54 55 62 71 82 88 98 102 112 123 137 152 173 191 206 215 221 221 220 215 202 183 125 76 50 47 45 43 40 38 43 28 18 20 27 24 26 30 35 38 42 43 43 44 43 42 41 39 40 40 39 39 37 38 37 36 37 38 39 37 37 38 37 34 34 35 35 36 35 35 35 36 36 37 52 100 125 104 86 82 76 76 76 75 73 74 79 79 79 78 78 83 82 83 82 87 93 95 97 100 102 108 117 123 126 131 139 142 144 150 153 155 162 159 152 146 140 133 124 115 105 94 79 72 60 54 49 46 45 45 40 40 42 41 46 39 29 36 42 33 34 36 45 51 54 53 51 48 44 42 42 38 38 38 39 39 38 38 37 36 36 36 35 34 32 32 34 33 31 32 32 33 32 32 34 31 31 33 34 35 37 37 37 35 34 35 37 35 36 37 37 36 37 37 36 37 36 35 37 39 40 42 45 45 45 42 33 25 27 32 30 64 40 36 36 36 36 35 35 39 42 39 39 38 38 39 38 39 40 41 40 39 37 38 39 41 45 43 41 37 31 25 20 18 19 30 21 18 29 28 17 18 24 31 37 37 39 35 32 32 29 31 29 27 28 29 30 27 25 26 26 27 28 29 28 28 27 27 26 25 26 28 29 29 30 30 27 27 26 26 26 28 26 26 26 27 28 28 29 31 30 30 28 27 26 27 26 25 24 26 24 26 32 51 105 56 33 34 32 34 35 34 34 32 30 30 30 29 28 27 24 24 36 73 102 85 53 64 97 139 175 160 149 171 217 246 254 253 251 155 26 27 30 36 32 20 23 31 53 45 39 39 40 45 45 44 43 42 42 41 35 32 31 29 31 32 33 33 34 34 35 34 32 33 34 31 30 30 29 31 30 28 27 27 28 28 29 27 34 36 35 33 30 29 29 28 30 31 28 31 32 34 37 40 43 42 45 57 123 104 72 76 78 75 94 105 102 104 90 77 77 110 219 230 122 82 80 89 122 164 134 83 53 42 41 42 34 17 17 25 23 20 24 31 51 59 54 47 41 39 38 38 35 35 42 29 18 22 26 27 20 24 27 31 36 42 48 51 45 39 33 33 33 33 33 32 35 39 43 45 45 45 45 46 45 43 37 36 34 35 37 35 34 36 38 38 37 39 37 39 40 42 42 44 44 47 45 43 44 44 42 41 42 43 47 52 61 74 90 110 148 186 228 241 232 207 139 72 45 44 41 41 43 27 17 21 27 24 25 30 36 38 43 43 44 43 44 43 40 40 42 41 39 39 39 39 39 38 36 36 38 38 38 37 39 36 36 37 36 36 34 34 34 34 36 41 62 53 36 37 39 38 34 33 36 36 37 37 36 35 37 37 38 38 37 39 41 42 42 41 41 42 42 42 38 33 34 32 34 38 37 36 41 44 50 57 67 74 85 97 112 123 137 150 159 166 172 175 174 175 171 165 152 139 124 114 103 89 82 77 73 61 55 57 58 63 63 61 58 53 51 45 43 41 39 39 39 39 38 38 36 36 35 36 34 34 34 32 34 33 32 32 32 33 32 34 34 32 33 34 34 35 38 37 37 35 33 36 37 36 36 37 38 37 37 37 37 36 35 35 37 38 40 41 44 46 45 42 34 28 27 34 32 57 53 37 38 39 37 36 37 40 42 40 39 39 40 40 41 43 43 43 42 42 42 42 42 42 47 45 43 38 32 27 22 19 21 29 20 21 31 27 19 18 24 32 38 39 39 37 34 30 28 30 30 30 29 28 29 28 28 28 28 29 29 31 32 31 30 29 27 27 28 28 29 28 28 30 26 28 26 25 28 27 27 25 27 29 28 27 28 31 29 28 27 27 28 28 26 27 24 24 24 26 29 35 95 88 35 36 34 34 36 34 35 35 31 30 29 29 30 30 26 24 29 51 101 101 131 159 170 165 151 172 215 242 252 254 254 253 253 183 30 29 30 36 32 23 21 28 50 52 42 40 41 46 48 44 41 39 42 42 35 30 30 29 30 30 30 31 31 32 34 35 32 33 34 34 32 33 30 29 31 28 27 28 29 29 30 29 32 33 33 32 30 29 29 29 27 27 27 27 29 30 33 35 40 39 40 40 63 107 89 67 61 55 51 64 95 149 167 124 105 183 251 253 219 182 182 204 234 247 203 99 67 51 42 43 35 16 18 26 24 21 26 33 51 59 54 47 40 40 38 38 35 37 36 21 18 22 27 25 19 20 30 33 34 36 43 48 47 43 39 37 35 35 36 34 37 37 37 36 36 35 36 36 40 39 34 31 29 28 28 28 29 29 29 29 30 31 29 30 33 33 35 36 40 41 40 38 40 37 37 34 34 35 34 34 35 37 38 41 48 60 89 109 114 140 185 174 71 39 39 37 44 26 18 20 27 25 24 31 36 38 44 44 42 43 42 42 42 41 42 41 38 40 39 40 39 39 39 39 39 39 37 36 38 38 37 37 37 37 35 34 33 35 38 42 44 38 39 39 37 36 34 30 33 34 35 37 36 34 34 33 34 34 35 36 38 39 41 41 40 39 39 38 36 36 36 37 33 36 36 35 36 39 35 34 31 38 38 38 36 38 42 47 54 60 67 74 86 96 115 129 154 173 185 194 202 206 208 207 202 195 182 170 153 142 123 108 82 65 54 51 46 42 39 39 38 39 37 35 37 37 36 36 34 34 35 34 34 32 32 32 32 32 33 34 34 31 32 34 35 35 39 39 37 35 34 36 37 35 38 39 38 39 37 37 37 36 37 37 36 37 39 42 44 46 48 47 38 32 29 38 39 52 64 43 41 42 40 39 43 44 43 41 42 39 42 42 40 43 46 46 46 47 48 48 46 46 50 47 46 41 35 30 25 21 25 33 21 23 32 26 22 22 28 35 41 41 40 38 35 32 31 31 32 30 30 31 29 28 29 27 30 30 31 33 36 35 33 31 30 29 29 29 29 28 28 30 27 27 27 27 28 26 27 27 26 27 27 28 28 29 28 26 26 27 30 29 27 25 24 24 26 26 25 30 62 112 53 37 35 34 33 33 35 35 34 33 33 32 31 30 28 26 26 34 89 110 135 156 172 189 232 251 254 254 252 254 254 254 253 215 41 29 29 34 33 22 21 24 40 58 47 42 43 45 46 44 39 36 42 43 39 33 30 30 30 31 29 32 32 31 34 36 33 34 43 50 53 40 42 32 30 28 30 31 31 30 30 31 32 33 32 32 33 33 30 27 27 26 26 27 27 28 33 34 35 38 37 40 42 55 94 68 76 93 110 118 132 176 234 244 202 215 254 254 253 252 252 253 252 247 182 91 76 71 52 47 36 17 19 25 21 19 25 33 50 58 53 46 39 39 39 37 35 40 34 17 17 25 30 21 18 21 37 38 35 34 37 44 48 45 40 40 35 33 31 29 29 29 28 24 25 26 27 28 32 34 31 29 27 27 26 28 25 27 25 26 27 25 26 26 27 28 30 34 38 35 32 32 31 28 29 29 30 30 31 32 32 35 35 37 39 39 40 43 40 38 50 99 149 71 33 35 41 27 18 21 27 24 26 31 35 40 43 42 44 43 43 42 41 39 40 41 40 40 39 38 39 39 38 38 39 37 37 36 38 36 36 36 36 35 35 34 36 36 38 36 30 34 36 37 34 35 35 30 35 36 35 37 37 37 34 34 34 34 35 36 37 38 40 40 39 38 36 35 35 34 35 37 35 36 37 37 37 40 38 37 37 35 37 37 37 38 37 37 38 40 41 41 42 43 39 36 37 44 49 54 67 83 108 128 155 182 210 224 240 249 254 248 229 193 122 75 47 44 42 39 38 39 37 37 35 35 35 34 36 34 33 34 33 32 34 34 32 33 33 35 35 34 34 34 35 37 38 39 37 35 34 36 38 39 39 39 38 37 37 38 39 37 35 35 36 37 36 43 46 50 55 62 72 77 91 99 104 108 113 104 106 107 108 109 104 106 105 103 105 103 101 97 97 96 94 92 93 92 85 84 83 81 78 77 71 70 60 53 46 43 48 46 34 34 39 31 25 26 32 41 45 45 43 43 40 36 36 35 36 36 35 36 32 33 33 34 36 37 36 38 38 37 37 36 34 34 31 29 29 31 26 27 27 28 27 27 27 28 28 27 27 27 26 27 28 29 29 28 29 28 29 28 26 26 25 24 25 26 25 27 43 99 82 38 34 33 33 34 31 34 35 33 33 32 31 30 29 27 27 31 68 108 124 196 237 249 254 254 254 255 254 253 253 251 250 223 49 29 26 32 33 23 21 21 35 52 54 45 41 45 49 46 37 35 38 44 44 44 35 37 35 35 36 39 38 36 36 40 43 41 46 57 53 48 41 35 31 30 31 32 32 32 30 30 32 32 30 30 33 35 33 29 27 26 26 26 26 28 31 35 39 39 34 37 41 43 73 106 112 123 146 121 128 135 163 196 229 226 254 253 252 252 250 251 250 220 136 90 65 73 70 61 34 17 17 24 22 22 26 34 50 59 54 45 40 40 40 38 36 39 36 18 17 24 28 21 17 20 39 41 35 33 36 42 45 44 39 41 36 32 30 26 26 26 26 24 24 25 27 30 30 32 32 32 30 31 31 30 27 28 26 26 25 24 24 24 24 27 31 32 33 30 28 28 28 26 27 27 26 26 27 28 29 28 30 32 37 37 38 41 40 36 36 35 79 115 41 37 43 25 18 21 27 24 27 32 36 40 43 43 42 42 43 42 41 42 40 39 40 39 40 38 38 39 40 40 40 39 38 37 35 37 37 38 35 35 36 36 36 37 38 29 26 31 35 36 33 34 35 31 34 34 35 36 38 37 35 35 34 34 34 33 34 35 38 37 35 35 36 34 35 36 36 35 36 35 34 33 37 38 35 31 31 31 31 31 33 32 33 33 34 36 37 36 38 40 39 40 39 41 38 37 34 34 36 42 49 57 71 88 112 141 186 219 243 243 218 183 99 45 44 42 38 40 37 38 37 35 35 35 36 35 34 34 34 35 36 36 35 35 34 35 36 35 34 34 34 36 39 39 38 37 36 38 38 38 39 40 38 38 37 38 37 35 34 35 36 37 39 44 53 81 132 156 164 168 169 166 164 159 157 153 154 157 156 152 149 146 146 147 150 149 150 149 150 154 152 149 154 155 156 157 157 155 155 155 157 158 159 159 156 155 155 149 138 132 125 119 107 99 94 88 81 73 62 55 47 44 41 39 37 38 42 45 43 41 40 42 43 44 42 43 45 46 42 43 40 37 34 33 32 30 28 26 28 28 27 28 26 26 27 26 28 27 27 27 29 29 29 27 27 29 27 30 29 26 24 24 26 27 26 24 30 62 111 53 34 34 36 34 34 33 33 33 33 33 32 31 30 29 26 27 43 92 115 201 254 254 254 254 252 251 251 250 247 247 250 238 66 31 26 31 35 24 22 22 31 43 61 51 42 46 51 45 39 36 38 46 54 125 138 123 108 96 85 79 74 70 65 65 66 59 58 54 51 49 52 50 51 44 34 31 31 28 29 28 29 30 30 30 31 36 35 30 27 27 27 27 26 28 31 34 34 34 35 34 38 42 50 101 101 122 192 156 127 124 153 160 164 191 237 252 247 249 243 239 226 157 94 107 63 52 72 74 34 17 17 23 23 22 27 36 51 59 54 47 41 41 39 37 37 39 37 18 15 21 27 21 15 17 32 44 38 34 36 42 44 41 37 38 38 34 31 26 25 26 26 27 27 28 27 28 28 34 68 79 77 74 71 68 56 35 30 28 27 28 26 25 26 27 30 30 29 27 26 26 25 25 25 26 25 23 23 24 27 26 26 28 34 35 37 39 37 37 37 35 35 64 81 38 41 25 17 22 26 25 27 33 37 40 44 45 45 43 43 42 42 41 39 41 42 41 39 38 38 38 40 40 41 40 39 39 36 36 37 37 36 37 37 37 37 37 37 25 24 28 33 35 34 33 32 32 32 32 35 36 39 38 38 37 35 36 34 33 32 32 32 34 33 33 33 33 33 34 34 34 34 32 32 35 34 36 34 32 33 35 33 31 30 29 30 30 30 33 34 34 36 38 38 37 36 33 33 33 31 34 35 36 37 39 40 41 45 47 45 50 61 72 90 125 171 138 50 40 41 39 39 38 37 36 36 36 37 36 33 35 34 33 37 36 35 34 34 34 36 35 34 32 34 37 38 39 38 37 36 35 36 36 36 37 36 36 36 36 36 35 37 36 37 39 43 57 115 136 113 90 70 63 54 51 50 50 47 47 46 46 44 43 42 42 42 38 35 38 37 37 37 37 35 35 36 33 36 38 39 39 37 41 48 46 46 48 56 68 76 82 94 100 109 117 129 140 152 161 168 176 180 180 180 178 174 167 154 144 134 123 111 100 96 95 91 85 82 79 72 68 65 60 55 50 44 41 34 34 31 29 28 28 29 29 28 26 27 27 28 27 28 28 30 29 29 27 28 29 28 29 29 27 25 25 25 27 27 26 28 41 105 81 34 35 36 34 34 33 32 32 34 33 33 31 30 31 27 28 33 71 106 149 251 254 249 248 247 248 250 250 249 247 250 246 87 30 26 31 38 29 21 21 29 40 61 57 43 44 50 45 40 38 37 42 50 130 170 169 166 166 161 161 157 155 151 150 143 138 133 131 127 128 123 123 129 97 32 32 29 26 28 27 28 28 29 30 32 35 35 30 28 27 26 26 25 26 30 32 33 32 34 34 35 38 43 74 108 132 244 240 160 112 186 200 162 144 189 242 241 240 211 195 165 105 83 104 92 47 86 128 31 17 18 24 22 22 30 36 51 58 54 47 43 44 40 40 39 40 37 20 15 21 29 22 17 19 28 41 42 36 36 41 45 41 36 35 39 37 33 29 27 27 26 28 26 28 29 30 31 30 98 128 132 125 134 136 123 46 31 30 29 30 30 31 30 29 32 32 30 29 29 28 27 27 26 26 25 25 23 22 25 27 26 30 34 35 35 35 35 38 40 37 34 35 77 58 38 25 18 22 27 24 25 32 37 40 43 44 44 43 42 41 42 42 41 42 40 39 40 40 41 39 40 40 40 39 39 37 35 37 38 37 38 38 38 38 38 37 37 26 23 25 32 34 33 30 30 33 34 33 34 35 38 38 38 36 35 35 33 33 32 32 32 32 32 31 30 30 31 31 33 34 33 32 32 35 35 36 35 35 35 34 34 33 34 32 31 32 31 32 33 34 34 37 36 37 37 31 28 28 31 31 33 36 36 36 38 38 39 40 43 43 42 40 39 44 75 126 113 44 39 39 38 38 38 37 38 38 37 35 34 35 34 33 36 35 35 35 35 35 34 35 36 35 36 38 38 40 39 39 37 36 36 38 35 37 37 36 37 35 37 35 36 36 35 37 49 71 69 49 36 34 33 31 33 33 35 35 34 36 36 34 35 37 35 35 37 37 39 40 38 39 39 39 35 36 37 35 34 35 35 35 36 34 34 33 34 33 34 35 32 33 34 34 39 39 40 44 49 53 59 67 77 82 93 106 127 144 167 189 202 210 217 207 222 226 222 217 208 195 181 171 155 136 107 83 58 49 43 37 33 30 28 28 27 26 26 26 24 24 26 27 25 26 28 29 27 26 27 28 28 28 28 27 25 26 26 27 26 25 28 30 73 107 46 35 35 35 33 33 32 32 34 32 32 31 30 30 28 25 30 43 99 112 212 250 249 246 249 249 249 249 249 249 249 250 115 32 26 29 41 32 21 22 26 37 51 63 45 42 50 48 39 37 37 38 42 106 170 159 155 164 167 168 165 166 167 168 168 167 167 166 165 164 163 162 167 143 31 32 29 29 29 28 27 28 28 29 31 36 35 29 26 25 26 26 26 27 31 31 30 29 29 33 34 34 41 47 103 111 226 252 211 117 166 239 189 155 149 216 190 190 187 183 140 98 93 93 124 69 61 141 30 18 18 22 22 23 29 34 49 59 53 46 44 46 45 42 40 40 37 20 15 21 28 23 18 18 25 35 48 40 35 41 45 38 32 31 37 38 34 28 26 26 25 25 25 27 28 27 31 27 99 131 126 93 141 141 139 59 31 30 30 31 31 32 31 33 33 33 31 32 32 32 32 29 26 25 25 24 24 22 25 24 26 30 33 32 29 30 32 37 37 39 37 34 50 84 39 25 19 22 26 23 25 31 37 42 45 44 43 43 41 42 41 40 42 42 40 40 39 38 38 39 40 39 40 40 41 39 39 39 37 38 38 37 37 37 36 38 40 25 20 25 32 32 29 28 29 33 35 34 33 34 37 38 36 35 34 33 33 32 32 30 32 32 31 29 26 28 29 28 30 31 32 30 30 30 34 33 36 37 38 37 33 32 33 32 32 31 31 31 32 32 30 32 34 35 36 34 29 32 33 34 32 31 34 32 34 36 38 38 39 40 40 38 37 39 38 50 98 92 38 38 38 37 38 39 39 38 37 37 35 35 35 34 34 33 33 35 35 35 36 35 35 35 36 38 40 41 37 36 35 36 35 37 36 37 38 37 36 34 36 36 34 36 35 37 43 37 31 27 29 30 28 28 27 30 33 34 32 32 30 31 32 34 33 31 34 35 36 37 35 36 37 37 36 35 37 38 38 37 35 34 34 35 34 35 35 35 36 35 33 34 33 36 37 37 36 36 36 39 39 40 43 43 41 41 35 33 35 42 47 58 75 85 119 151 174 199 218 231 240 248 254 253 247 232 182 128 71 45 37 33 29 29 28 27 26 27 24 24 27 28 27 27 28 27 28 28 28 29 29 29 29 29 29 29 30 29 28 26 26 31 49 102 71 37 38 36 36 34 33 33 34 33 33 32 33 32 29 27 27 34 80 109 153 238 250 248 246 246 249 248 248 246 248 250 131 34 27 29 40 32 22 22 26 36 47 64 53 42 50 47 38 37 36 40 45 82 169 148 149 163 168 168 168 169 164 158 158 161 162 167 165 165 165 160 163 156 45 30 29 29 28 27 27 28 29 29 31 36 37 31 27 27 27 26 27 28 30 31 27 27 27 29 31 31 39 42 85 108 201 251 230 128 149 217 195 164 173 198 175 180 182 167 131 101 97 99 150 89 61 97 33 17 18 21 22 23 30 36 48 56 53 50 46 47 47 45 42 40 38 20 15 20 29 23 18 16 22 32 47 43 35 41 43 35 30 28 33 37 35 30 27 26 25 25 28 32 32 32 34 31 96 141 140 107 120 141 141 75 33 32 31 32 32 32 31 31 30 30 30 30 30 31 34 31 27 27 26 25 24 25 25 24 26 30 32 29 27 28 29 33 34 38 35 34 35 82 52 24 19 22 25 22 26 31 35 41 45 43 42 43 43 44 42 40 41 42 41 41 41 41 40 40 38 40 40 41 41 39 39 39 39 39 37 38 37 37 37 39 39 25 20 25 31 30 29 26 29 34 37 35 33 34 35 38 36 35 35 35 35 31 31 30 31 32 30 27 25 25 27 27 28 29 32 30 29 30 31 31 34 33 34 34 32 32 33 33 32 31 31 32 32 33 30 30 32 34 36 33 29 31 36 34 32 30 32 35 33 33 35 37 37 38 38 38 38 35 38 38 51 93 52 37 39 39 38 39 39 37 36 36 34 35 36 34 34 34 35 35 34 36 38 35 35 36 37 38 40 41 38 37 36 36 36 37 37 36 36 36 35 35 36 37 35 34 36 35 33 28 28 29 30 29 28 28 29 30 32 34 33 34 32 31 33 32 35 34 33 32 33 34 33 33 35 35 36 37 36 33 35 34 33 34 32 33 32 33 34 33 34 33 31 31 31 32 33 32 34 33 34 35 36 37 37 37 36 36 37 38 35 37 38 37 37 38 42 46 53 66 79 96 109 129 166 194 220 229 221 208 173 105 41 37 28 29 27 27 27 26 25 26 25 27 28 26 26 25 26 28 30 29 28 27 27 30 29 29 31 31 29 28 27 29 36 77 98 50 34 36 35 35 33 31 33 34 33 32 33 32 31 28 26 29 56 98 118 192 250 249 248 251 249 251 249 248 247 248 155 37 27 28 37 35 22 21 23 33 46 57 58 44 46 49 42 36 34 38 45 60 168 140 154 142 139 148 146 147 151 138 136 158 159 151 158 157 149 132 159 170 63 30 31 31 28 27 29 29 29 29 30 35 35 30 29 28 27 26 27 28 30 31 28 27 28 29 30 32 35 41 60 108 161 230 214 144 125 177 189 178 155 162 166 179 181 147 125 121 79 131 169 123 95 81 32 19 18 23 21 23 31 37 50 58 55 52 49 48 46 45 42 42 35 18 14 19 28 23 17 16 20 29 43 48 37 41 40 34 31 29 31 35 34 30 26 26 25 30 98 92 78 67 56 53 97 143 141 124 115 143 143 89 35 35 37 38 34 34 33 33 33 31 30 28 28 29 37 35 28 27 26 25 24 25 25 26 27 30 30 26 24 25 26 29 34 36 36 34 31 56 75 20 18 22 25 23 28 30 35 42 45 44 43 43 41 41 42 42 40 41 41 41 41 41 40 41 39 40 38 39 40 40 39 38 38 39 38 38 37 37 37 38 38 24 21 24 31 30 26 25 28 34 36 36 33 35 35 35 36 36 34 35 33 31 31 31 30 30 30 27 27 26 28 27 30 30 32 32 30 30 32 29 32 33 31 32 30 30 31 33 33 32 31 31 33 32 34 32 32 31 31 30 29 31 34 33 29 30 32 34 32 32 35 35 35 34 36 37 37 34 36 36 33 48 78 42 40 38 37 37 37 37 37 36 36 37 36 35 35 34 36 35 35 36 35 34 36 35 36 38 40 41 39 38 38 36 35 37 38 37 37 35 37 36 35 35 34 34 36 35 26 25 29 30 30 26 25 28 29 29 30 32 34 35 35 34 34 33 32 30 30 30 30 29 31 30 30 31 32 31 32 31 33 31 31 33 32 32 31 30 31 30 30 31 30 29 28 30 30 30 30 30 31 34 35 34 33 34 33 35 35 35 35 35 36 37 36 38 40 40 41 43 42 43 48 51 48 49 49 49 56 69 108 152 116 48 27 27 26 27 27 27 26 26 25 25 26 26 27 27 27 27 28 29 29 28 26 29 29 31 29 29 28 27 25 26 30 54 105 76 32 34 35 34 33 33 33 31 34 35 33 31 32 29 27 27 43 77 111 138 235 248 248 249 249 248 249 248 248 249 175 42 26 26 36 36 24 21 22 30 45 53 60 47 47 52 43 38 36 38 44 44 161 162 156 138 141 148 140 142 131 142 132 162 145 138 144 137 139 131 156 167 84 28 32 31 29 29 29 29 29 30 30 33 34 32 29 28 28 26 26 27 28 30 28 26 27 27 29 31 33 37 47 94 143 187 186 161 115 168 186 168 164 158 156 176 179 136 126 118 69 154 183 159 134 123 29 18 17 23 21 23 30 36 50 58 57 53 50 48 46 46 45 43 37 18 14 19 28 24 16 16 21 30 42 51 40 40 42 35 30 27 28 34 35 30 27 26 27 26 159 170 165 162 153 146 146 156 151 140 137 143 142 111 67 64 59 56 52 46 44 43 39 34 32 29 27 28 35 36 27 26 25 24 24 25 25 26 27 29 29 26 24 26 25 28 32 33 34 33 33 39 73 24 17 20 24 23 27 33 37 41 45 44 43 43 42 43 43 43 40 40 40 40 41 41 39 39 38 39 40 40 41 40 40 40 38 37 38 36 36 39 38 38 37 24 19 23 31 30 26 26 29 32 36 36 35 35 35 34 37 36 34 35 34 31 30 32 32 31 30 28 29 28 33 33 33 34 37 36 35 35 35 34 36 39 34 33 32 33 33 33 34 36 33 33 31 32 35 34 33 31 30 30 30 33 32 32 29 27 31 32 31 31 32 33 34 33 35 35 35 34 36 36 33 34 70 47 38 39 38 37 37 39 38 36 35 37 37 37 36 34 36 36 36 36 36 36 36 36 37 39 40 41 41 39 38 36 36 37 37 36 38 37 38 36 35 35 35 35 36 34 24 24 30 31 28 27 26 27 28 30 31 32 34 35 35 35 34 33 31 29 29 29 30 29 30 30 30 30 30 28 30 30 31 29 30 31 29 30 32 31 31 31 31 32 31 30 28 30 31 32 31 29 30 32 34 32 32 33 33 33 33 33 33 34 35 36 36 37 36 38 39 40 42 42 45 44 46 45 45 45 42 41 40 56 115 90 26 27 26 28 27 28 27 28 26 25 26 26 29 30 28 28 29 29 28 27 26 30 29 31 30 28 28 27 26 26 28 36 89 103 40 32 36 37 35 35 33 33 34 35 33 33 31 31 27 26 29 50 105 114 182 245 246 246 245 242 249 246 247 246 198 52 27 25 35 37 26 21 23 28 43 49 61 52 48 53 45 40 36 36 43 39 133 175 168 161 164 170 167 165 165 163 163 164 161 157 150 151 150 149 158 166 113 33 32 30 30 28 28 30 31 30 30 32 34 33 30 30 29 28 27 28 30 31 29 28 28 27 28 29 30 34 40 66 138 173 185 179 122 150 184 155 176 154 136 171 166 131 119 106 72 178 191 183 158 116 29 20 18 23 23 24 31 36 50 58 57 55 52 50 48 48 46 44 37 18 14 20 29 24 19 18 21 28 41 52 45 38 38 35 31 29 29 33 33 29 27 27 27 21 145 172 168 168 170 173 174 173 173 171 172 173 173 172 172 169 166 167 164 162 159 160 115 36 30 29 28 28 33 35 29 26 24 24 23 24 23 25 26 29 30 27 24 25 28 30 31 31 32 32 32 32 69 40 20 21 25 23 28 34 40 42 46 45 43 41 40 42 42 41 40 41 41 41 40 41 40 39 39 40 40 39 39 39 39 39 38 39 40 38 36 37 37 37 37 22 17 22 30 29 26 28 30 33 35 36 35 34 35 35 36 34 33 34 35 33 32 32 31 31 31 28 75 111 95 86 76 65 59 59 60 57 50 44 40 41 38 39 38 38 38 37 38 40 39 37 36 35 34 33 33 32 31 30 31 30 31 28 28 26 30 30 29 30 31 32 32 34 36 37 37 36 35 34 33 29 49 52 39 36 37 37 38 38 36 38 37 36 36 35 34 35 36 36 36 36 35 35 36 36 35 38 39 40 41 39 38 37 36 37 37 39 38 37 35 37 35 35 36 36 37 32 21 22 29 32 27 26 26 27 29 31 30 32 34 35 34 33 33 32 31 30 29 28 31 31 31 30 29 27 26 26 28 28 28 30 31 30 29 29 30 31 30 33 32 33 31 31 29 29 30 32 31 31 33 33 32 32 33 32 32 31 30 32 33 33 34 33 34 35 35 35 36 37 38 41 43 42 42 42 43 42 38 38 38 36 44 72 26 27 27 28 28 28 28 28 26 25 26 26 28 29 29 29 29 29 30 28 27 28 28 30 29 28 28 27 27 27 27 28 70 100 69 35 36 35 35 33 33 34 32 33 35 35 32 32 28 27 27 36 89 115 131 212 247 244 248 246 248 247 248 246 214 64 28 26 31 37 27 20 23 28 43 47 60 57 48 51 47 39 36 35 41 37 113 175 170 170 172 172 170 168 170 167 171 171 171 170 166 167 166 167 166 169 131 38 33 31 29 29 27 29 30 29 30 32 32 32 31 30 28 28 28 30 32 32 30 30 30 29 28 27 30 32 36 45 122 166 183 178 140 141 182 152 175 138 129 151 169 142 115 94 77 173 192 189 191 144 26 21 19 22 22 25 32 38 51 58 59 55 53 53 50 50 48 47 37 20 14 20 30 25 17 17 20 27 38 51 48 40 39 34 30 29 28 32 32 29 29 29 27 19 133 165 151 150 168 174 173 173 172 171 170 171 171 170 172 173 172 171 172 172 171 172 137 38 30 29 28 28 31 34 30 24 24 25 25 24 26 26 25 27 28 27 24 26 27 30 31 30 30 30 30 32 58 62 17 22 22 24 29 34 41 44 45 46 42 42 43 42 41 39 39 40 41 41 39 39 39 40 41 40 40 39 40 38 40 38 38 39 39 38 37 37 37 39 38 22 17 23 31 30 26 28 31 32 35 37 35 35 35 36 35 35 32 32 35 34 32 32 30 30 32 26 95 173 171 170 161 156 151 147 139 134 122 112 105 96 87 81 76 71 64 60 55 52 53 48 46 38 36 34 34 34 32 32 32 30 31 28 27 26 28 30 29 32 34 33 34 35 37 36 36 37 35 35 32 28 42 61 38 39 36 37 39 40 38 39 37 36 37 36 35 36 37 37 36 36 35 35 37 37 37 38 39 40 41 41 38 36 36 38 38 39 37 38 36 36 37 38 37 35 39 34 20 22 29 32 26 24 24 27 30 31 29 31 34 34 35 35 32 31 31 29 30 30 31 31 32 30 26 26 25 25 27 28 30 32 31 30 29 29 29 30 29 32 32 31 30 31 31 29 31 31 30 31 32 32 33 33 34 33 33 32 30 31 34 34 34 33 33 34 35 33 36 36 36 38 38 41 42 42 41 40 41 37 34 34 32 40 29 28 26 27 26 27 27 27 27 28 26 26 27 28 29 29 29 28 30 30 28 28 28 29 30 28 29 27 28 26 26 29 48 86 100 47 34 37 37 33 32 33 33 34 34 34 33 32 29 26 25 28 62 104 113 138 228 246 248 248 245 248 243 244 227 86 26 24 30 37 29 22 23 28 41 46 54 62 51 53 47 38 35 37 41 44 86 173 172 168 168 170 164 152 165 170 171 170 170 169 168 166 166 166 166 166 152 50 33 31 29 30 30 29 29 29 30 31 33 34 30 29 27 27 29 29 30 31 29 29 30 30 29 30 30 31 34 38 92 149 184 183 159 130 179 156 162 133 120 124 187 152 104 81 83 170 206 203 203 163 21 23 20 22 21 26 32 38 52 60 59 55 54 53 48 48 46 45 38 19 15 20 28 25 18 18 21 27 35 45 51 43 40 34 31 32 30 31 31 30 29 28 28 20 118 168 141 157 155 160 166 168 167 168 163 141 148 161 171 172 172 172 170 162 162 165 147 41 31 31 28 26 30 33 28 24 25 25 24 23 25 26 26 28 28 26 25 27 26 26 28 30 28 29 29 31 41 78 19 21 23 23 30 38 42 42 45 45 43 41 41 43 42 41 40 41 40 41 41 40 39 41 42 41 39 40 40 38 39 39 39 38 39 37 38 38 37 40 37 24 21 26 33 31 27 29 29 29 34 38 35 36 36 37 35 33 31 32 32 32 32 32 32 30 31 28 87 171 171 173 173 173 172 174 175 173 173 172 173 173 175 172 171 171 171 167 164 164 160 162 119 42 35 33 33 34 30 29 29 29 29 30 28 29 29 31 31 35 37 35 35 35 36 36 35 36 35 35 34 30 33 57 43 38 37 36 38 39 37 37 37 38 38 37 38 37 36 37 36 36 36 36 37 36 38 39 39 39 41 41 38 38 38 37 37 39 38 38 38 36 36 36 37 36 37 31 23 23 29 29 25 23 24 27 29 30 29 31 34 35 36 35 32 32 32 31 31 31 31 31 30 30 29 29 26 26 26 29 33 33 33 32 33 30 30 30 29 30 30 30 29 31 31 30 30 29 29 30 29 29 30 30 32 32 32 31 31 30 30 32 33 33 33 32 34 33 34 34 37 38 39 41 41 42 42 42 40 37 35 33 30 29 29 27 27 28 27 28 26 26 26 27 27 27 25 26 29 29 29 28 28 29 27 29 29 30 31 29 30 27 28 27 25 29 37 73 105 69 30 33 34 33 33 33 33 33 35 35 34 32 29 27 25 24 46 87 112 120 161 225 248 244 242 247 246 246 230 92 27 23 29 38 29 22 23 29 41 48 51 62 54 52 49 41 37 38 41 44 71 166 165 149 156 156 161 125 167 162 161 162 164 164 164 167 132 143 133 161 163 62 32 32 31 30 29 29 29 30 30 31 35 37 32 30 27 27 27 27 29 31 30 27 27 27 27 29 29 29 35 39 69 129 207 233 201 129 184 172 149 134 119 118 180 154 97 88 93 166 240 243 245 201 27 24 20 22 22 26 34 38 53 62 59 55 54 54 48 47 47 44 38 17 13 20 29 26 18 17 21 26 34 43 51 43 41 34 30 31 31 30 31 31 27 28 29 22 106 171 147 160 138 142 153 149 149 149 149 137 136 161 163 156 160 164 158 143 147 165 155 44 31 29 28 27 30 33 29 27 25 25 24 24 23 25 27 28 29 27 25 25 26 28 28 29 29 28 30 31 33 72 31 21 22 22 31 38 42 43 43 45 43 43 41 43 43 42 41 41 40 40 42 39 38 39 43 41 40 40 40 39 41 41 39 38 37 37 38 39 38 39 33 22 21 27 33 31 26 28 32 31 32 36 37 37 36 37 35 33 32 32 31 33 33 32 32 31 33 28 81 173 155 165 149 172 173 175 174 175 174 172 172 174 173 173 172 173 174 173 175 173 173 175 139 46 35 33 35 36 31 30 30 29 30 29 30 30 30 30 32 34 37 35 34 35 35 36 36 36 35 35 34 33 33 53 53 35 37 38 37 37 38 38 37 37 38 36 38 36 36 36 35 37 37 37 38 38 39 40 41 41 41 41 39 38 36 36 37 35 37 38 38 36 35 36 35 36 39 31 21 22 30 28 23 23 25 28 29 29 31 33 36 36 35 34 33 33 32 30 30 30 30 30 30 30 29 29 28 30 30 33 34 35 35 36 35 34 32 32 32 31 31 32 32 31 31 31 31 29 31 30 29 30 32 30 32 32 32 31 31 30 29 29 32 33 32 32 34 34 35 36 37 36 38 40 41 41 41 42 40 36 34 34 31 28 29 29 29 27 27 27 27 26 26 27 27 26 26 26 28 29 28 27 27 28 28 30 30 32 31 30 30 27 27 27 24 26 29 50 95 97 39 30 33 34 34 35 36 35 36 35 36 34 33 30 24 22 34 63 116 116 121 133 197 230 242 245 244 246 234 98 24 21 25 37 32 22 23 27 40 48 50 60 57 52 51 43 36 39 40 44 53 154 170 164 154 151 162 143 172 145 148 143 145 145 147 165 137 153 114 162 166 87 28 32 30 30 28 29 30 32 32 33 37 38 34 32 29 29 28 28 28 30 30 27 30 27 26 28 29 27 33 37 48 102 188 248 234 148 167 162 156 137 121 112 143 153 94 107 88 149 252 254 254 210 28 24 19 22 21 27 34 38 52 60 59 55 52 49 47 46 43 43 37 19 14 19 30 26 18 18 21 27 33 39 49 44 40 33 28 30 30 30 33 31 30 30 29 25 92 175 170 161 141 149 162 152 148 149 149 149 143 163 149 141 148 145 142 149 143 166 161 51 32 30 28 29 29 32 30 26 25 26 25 24 23 24 28 30 31 28 27 26 25 27 27 27 27 25 29 30 31 49 58 22 21 22 31 38 42 43 45 46 42 42 43 42 40 41 40 41 39 40 40 40 40 40 42 41 39 40 40 40 39 40 40 40 38 37 38 38 37 39 33 19 21 27 33 31 28 28 30 31 32 35 37 35 37 38 36 32 33 32 31 33 33 31 30 31 32 29 75 177 139 156 157 161 167 170 171 172 171 171 148 147 168 168 174 174 175 174 172 162 167 170 145 68 35 34 33 35 32 32 32 29 29 29 31 31 31 30 32 32 35 34 34 35 36 36 38 38 35 35 36 35 33 40 67 37 36 36 36 37 38 37 37 35 36 36 35 35 35 36 36 38 38 37 38 39 38 39 41 41 39 39 39 38 36 36 37 37 38 37 36 37 36 36 36 37 40 30 21 23 32 29 23 23 25 29 31 31 31 31 34 35 33 33 32 32 34 31 29 29 28 30 29 27 27 26 59 80 77 72 62 60 53 48 45 43 40 42 39 38 37 39 36 38 37 37 38 35 35 35 36 35 36 31 32 31 29 31 31 32 31 29 30 31 34 34 32 32 33 35 37 38 39 39 39 41 41 42 39 37 35 35 33 28 30 30 29 28 28 28 28 27 27 27 27 27 26 28 29 29 27 28 29 31 30 31 31 32 31 31 29 28 27 27 25 25 28 37 79 101 64 32 34 35 35 38 39 37 36 34 32 31 30 29 25 21 29 48 108 116 115 118 131 157 195 211 214 213 208 86 24 19 24 36 32 21 22 28 42 50 49 60 60 54 51 43 36 37 40 43 46 144 173 173 174 172 170 168 171 168 166 165 164 165 163 169 161 159 144 164 171 108 28 32 32 30 28 29 31 32 33 36 39 40 34 32 32 31 31 31 30 30 32 29 30 28 26 28 28 29 30 35 43 82 161 243 246 173 147 168 159 171 157 102 145 152 114 175 84 114 236 254 253 207 28 25 21 23 21 26 34 37 51 59 57 54 52 50 45 44 42 39 37 21 14 18 28 25 18 18 22 28 36 37 47 45 39 32 29 30 31 31 32 30 29 30 30 27 78 174 174 171 168 169 174 174 172 171 170 168 164 167 166 165 162 161 162 161 161 163 164 62 33 29 27 28 29 32 31 27 26 26 25 25 23 25 29 33 32 28 27 26 25 27 28 28 28 26 28 27 31 37 68 26 21 23 30 36 43 43 45 46 43 40 41 42 42 42 41 41 40 41 39 38 39 38 40 41 39 40 41 41 38 39 39 40 39 38 38 39 38 40 33 18 22 28 31 29 27 27 30 32 33 35 35 36 36 37 36 33 32 33 32 32 34 32 33 33 33 35 70 175 143 158 148 144 143 156 151 148 159 158 135 127 165 168 164 162 169 171 162 137 162 169 152 69 37 35 34 35 34 32 31 29 30 30 32 31 31 32 32 32 36 36 34 34 37 37 37 37 36 34 35 34 33 34 68 41 36 36 38 38 36 38 39 36 37 38 36 35 35 37 37 38 38 38 38 39 39 40 40 40 40 41 40 39 36 37 37 37 38 37 37 37 37 34 36 37 38 28 20 24 32 29 22 22 24 28 31 33 31 30 32 34 34 33 32 30 35 33 31 30 29 29 30 30 28 26 97 167 161 157 154 149 140 132 124 114 108 101 94 91 86 81 79 72 64 67 62 59 55 55 51 47 44 34 30 31 30 30 30 30 30 29 30 31 34 34 33 33 35 35 36 39 42 40 40 41 41 42 41 39 36 36 34 29 32 32 29 28 28 29 29 27 26 28 27 28 28 28 28 30 30 30 30 31 30 32 32 33 33 31 30 29 26 26 25 24 26 32 59 92 91 45 38 37 37 39 38 38 37 34 32 30 32 31 28 27 29 35 77 115 112 115 121 125 138 152 160 159 151 77 22 19 22 34 32 23 22 27 42 52 50 57 59 55 52 44 39 37 40 41 41 114 176 172 171 172 173 173 172 171 172 173 172 172 173 172 169 172 171 169 173 132 30 33 32 29 31 31 32 32 34 35 36 41 37 32 32 30 32 30 33 34 33 32 29 30 27 28 28 30 31 31 38 57 128 219 251 205 125 172 152 191 202 103 147 146 133 231 106 80 197 253 252 199 25 25 19 22 23 26 34 37 50 55 57 55 50 46 44 44 40 40 38 19 14 19 27 24 18 18 22 28 35 37 45 47 40 33 31 30 31 31 30 31 30 30 30 27 67 170 173 173 172 174 174 175 175 174 177 173 173 173 174 174 175 175 174 173 171 173 171 68 32 29 26 27 30 32 31 27 26 26 26 26 25 25 28 31 30 27 26 26 24 25 27 30 31 29 25 28 33 31 66 39 21 25 30 34 41 43 45 46 45 41 40 41 42 42 41 39 40 41 40 41 40 40 40 40 40 40 41 40 39 40 40 40 39 39 39 38 39 41 32 19 23 30 31 29 26 27 30 32 33 36 38 37 36 40 35 34 32 33 33 33 33 32 33 34 33 33 63 170 166 168 143 144 155 161 148 148 151 141 146 131 167 157 144 143 154 145 144 134 157 168 152 53 39 34 33 33 33 32 32 31 31 32 34 33 32 32 31 32 36 37 34 33 35 34 36 36 35 35 34 35 33 31 57 46 37 36 37 37 36 37 39 38 38 38 37 38 37 39 38 39 39 38 39 40 40 40 39 39 40 40 38 39 37 35 37 38 39 36 37 37 37 35 37 37 38 27 20 23 30 27 22 22 25 29 32 31 31 31 32 33 35 33 31 31 33 31 31 30 29 28 31 31 30 29 97 170 171 172 173 175 175 175 174 175 173 175 177 172 173 173 170 172 171 168 168 165 163 160 161 163 99 35 31 29 29 30 27 28 30 30 30 30 33 33 34 35 35 36 35 38 40 43 40 39 41 42 41 40 38 37 35 31 31 31 28 26 28 30 30 28 28 30 29 30 28 29 28 29 30 31 31 30 32 31 31 33 34 31 31 29 28 27 26 24 26 30 44 82 101 64 41 36 36 36 39 39 38 36 35 35 35 35 37 39 37 36 52 99 112 114 119 119 124 126 128 125 122 77 21 20 21 32 33 24 24 26 44 53 49 57 61 55 54 46 40 38 39 41 38 95 176 173 173 172 174 174 171 171 173 172 172 172 172 173 171 170 172 169 172 152 29 32 31 31 32 32 31 32 34 35 36 40 36 32 31 31 33 32 34 34 34 32 29 29 28 29 30 30 31 31 37 42 96 163 220 201 135 182 144 192 213 116 155 142 146 243 146 100 175 232 219 152 20 24 20 23 24 26 33 38 49 55 58 55 50 44 44 44 42 42 37 19 15 18 27 24 19 18 22 28 34 37 44 46 41 33 30 31 31 30 30 31 28 29 28 29 58 167 170 167 170 173 174 163 152 169 176 175 175 174 173 175 175 175 174 173 175 172 172 74 30 30 28 28 28 31 31 28 26 27 27 27 27 26 29 32 32 29 28 27 26 26 27 31 32 32 28 30 33 31 58 52 21 24 30 34 41 44 45 47 46 42 41 41 42 42 41 39 39 41 41 43 40 41 40 39 42 41 42 40 40 40 40 39 37 39 40 40 40 40 30 18 23 30 32 29 26 27 32 32 33 35 38 37 36 37 36 35 35 35 34 34 33 31 33 31 32 32 55 165 176 176 162 162 170 175 171 170 169 165 160 156 165 163 163 159 156 154 157 147 163 161 158 52 41 37 33 34 34 31 31 31 31 31 32 33 32 32 31 30 35 36 35 34 35 34 35 35 34 34 35 35 32 33 49 49 38 38 38 37 37 38 38 38 38 37 37 38 38 37 37 37 39 39 39 39 40 39 38 39 41 41 39 39 38 36 36 38 38 37 36 37 36 37 36 35 38 24 20 23 30 26 22 23 25 31 33 31 31 30 32 34 33 32 32 30 31 31 30 29 28 27 30 30 30 28 95 169 164 165 159 176 175 175 173 174 174 175 176 174 174 174 175 175 175 175 175 175 176 174 173 176 109 36 33 30 28 29 30 30 31 31 30 32 32 32 32 34 34 37 37 39 42 43 42 40 40 42 41 40 39 37 34 30 32 30 31 29 30 30 31 29 28 30 31 30 30 29 30 30 29 29 29 31 33 31 31 33 34 33 31 30 30 28 25 24 26 27 36 65 98 93 38 32 31 31 31 32 34 33 32 36 37 42 47 51 47 42 40 63 118 118 117 117 117 120 122 117 114 83 23 19 18 29 35 24 22 24 41 55 52 54 60 55 53 45 40 39 40 40 40 59 129 133 147 152 160 165 166 168 168 170 170 171 173 170 170 170 169 170 171 164 44 33 31 30 32 32 33 35 34 34 37 39 38 34 32 31 33 34 35 35 36 33 29 29 30 29 30 31 31 31 33 39 65 124 149 171 164 187 147 167 171 142 170 161 169 206 193 190 191 185 175 117 26 24 23 28 32 28 31 35 46 53 56 54 49 47 44 42 42 41 36 19 12 17 26 25 18 19 22 28 36 37 42 45 39 33 31 31 30 29 30 31 29 28 29 30 48 162 170 151 151 164 155 172 122 165 160 162 165 165 166 168 171 164 146 151 143 170 174 87 29 29 28 28 32 32 33 29 27 27 27 26 28 29 30 33 32 30 28 26 27 26 28 31 33 32 28 28 32 31 45 71 18 25 28 32 37 44 45 47 45 42 41 42 42 42 43 40 40 40 40 42 41 41 39 39 40 42 39 39 41 42 39 39 40 40 41 41 37 39 27 18 21 30 30 26 25 29 32 31 33 35 39 40 38 36 34 35 34 34 33 33 32 31 30 30 31 33 51 161 176 177 176 176 178 176 176 177 176 176 173 171 171 173 176 177 177 176 176 176 175 174 160 57 40 35 34 35 32 31 32 31 30 29 32 29 32 31 32 32 32 36 36 34 32 32 34 34 35 34 33 31 31 31 45 60 36 39 40 39 40 39 38 36 37 35 37 37 37 37 37 37 37 38 36 38 38 38 39 40 42 42 41 40 37 37 36 36 37 37 38 38 38 37 38 39 36 23 20 27 30 27 20 21 25 31 36 34 29 30 33 35 34 32 30 29 30 32 30 28 29 28 28 27 31 28 92 175 131 158 146 168 173 175 176 173 175 175 169 158 161 168 173 174 175 175 174 174 168 167 167 175 115 39 35 32 30 30 29 31 32 30 31 31 30 32 33 34 36 36 37 41 42 42 40 41 41 40 41 40 39 37 35 33 35 34 34 32 31 31 32 30 30 32 30 30 30 29 29 31 29 31 32 33 35 33 33 36 35 33 33 31 30 29 26 26 28 27 32 47 92 104 61 32 31 30 30 31 32 31 31 34 39 41 47 50 48 43 39 45 110 128 118 118 118 119 121 116 113 91 24 19 17 27 35 25 22 24 40 58 53 52 59 56 53 47 42 39 41 41 42 39 40 45 54 57 75 85 86 96 108 118 126 129 135 138 143 146 148 149 149 149 51 32 32 31 31 33 34 35 35 36 38 40 37 34 32 32 33 33 35 36 36 33 31 31 30 29 30 31 31 31 32 35 49 107 140 147 170 187 187 196 199 196 197 195 187 178 170 166 151 140 138 96 30 26 24 28 34 29 30 33 42 52 56 55 49 48 45 43 43 42 37 19 13 17 26 23 19 19 23 28 36 38 41 46 39 33 30 31 32 29 29 31 32 31 29 30 42 157 174 166 159 157 154 171 143 174 148 151 147 147 155 152 160 169 128 128 123 166 176 98 31 31 31 29 31 31 32 30 29 29 28 26 28 29 30 32 31 30 28 27 27 28 30 30 31 33 30 27 28 32 38 76 26 26 29 32 40 45 45 44 44 42 40 42 43 43 42 40 41 40 40 42 42 42 40 41 41 41 41 40 40 40 41 40 38 38 40 39 38 40 27 18 21 29 30 26 25 27 32 32 34 34 38 40 38 36 34 35 33 33 33 32 33 33 30 31 32 33 49 160 175 176 177 177 177 177 171 174 178 179 176 174 174 177 176 178 177 178 178 177 176 178 164 56 40 35 34 34 33 32 31 30 32 30 30 30 32 32 31 32 32 35 35 32 34 33 36 35 33 34 33 32 33 33 38 69 37 39 41 40 37 37 36 35 36 35 37 36 35 36 35 36 36 36 34 36 36 38 37 37 39 41 41 40 39 38 38 38 38 37 38 39 38 38 38 38 34 23 21 28 31 27 21 21 24 31 39 36 30 30 34 35 35 32 30 29 30 32 30 29 27 26 26 28 31 29 92 181 126 157 151 147 148 153 161 163 162 165 160 137 137 166 170 173 168 172 170 169 155 155 164 178 115 36 34 31 30 31 31 31 30 30 30 31 31 32 34 35 36 36 37 39 41 41 39 40 41 41 42 41 39 37 34 33 40 38 33 36 36 38 37 36 37 35 36 36 35 35 33 33 35 34 35 36 38 39 37 38 36 33 33 31 30 29 28 28 27 26 26 34 78 95 96 42 33 30 31 33 33 34 33 36 41 44 47 50 46 40 36 38 64 95 123 125 125 121 121 121 122 106 29 18 17 24 33 26 23 24 38 59 54 52 60 58 51 49 43 42 42 44 43 38 35 36 36 36 40 38 35 35 39 44 38 35 34 32 34 31 33 33 34 38 39 37 36 37 37 36 37 38 38 39 40 41 39 36 35 36 35 36 37 39 38 36 35 33 30 30 29 31 31 30 32 34 38 78 137 138 141 149 163 165 158 152 147 140 139 141 142 142 137 132 132 94 30 28 27 30 39 34 27 31 42 50 55 56 51 47 44 44 44 44 36 19 14 18 27 23 19 19 22 29 37 38 42 47 41 35 32 31 31 31 32 31 30 30 31 29 40 148 175 174 174 176 174 174 175 176 173 170 165 162 164 164 161 174 155 157 136 169 177 108 27 33 32 29 30 30 32 30 29 28 28 29 28 30 30 32 31 30 28 26 27 29 27 29 31 31 30 29 28 30 32 67 50 25 30 34 41 44 46 46 45 42 40 42 43 42 42 38 38 38 38 39 41 41 41 40 41 41 39 40 41 40 41 40 38 39 39 38 39 40 27 17 21 27 32 27 22 24 30 32 35 35 37 39 37 36 35 36 35 35 35 33 35 33 33 31 30 33 46 155 176 158 158 164 172 172 145 126 179 173 172 174 171 174 175 174 176 160 176 163 173 179 167 61 41 36 35 34 35 33 30 31 32 32 32 31 30 32 32 32 32 32 33 31 36 33 35 35 33 34 32 34 34 33 33 72 41 38 35 35 35 35 34 34 35 35 36 37 36 36 36 36 36 34 36 35 35 35 36 36 38 40 39 39 36 37 39 39 40 40 39 39 40 40 39 38 34 21 20 26 30 25 20 21 24 29 35 36 32 32 34 34 34 32 29 30 30 31 29 29 29 27 27 27 30 28 88 175 150 166 137 147 151 160 147 142 151 126 157 145 131 168 160 149 143 154 152 133 157 146 168 178 116 36 34 30 30 31 30 30 31 30 31 31 31 32 34 36 39 38 38 42 42 43 41 42 42 42 43 43 39 37 33 32 105 99 91 80 72 68 64 58 51 46 43 40 38 37 33 35 39 40 41 42 44 45 40 41 40 36 34 33 31 29 28 28 27 25 26 30 57 92 103 66 34 34 34 37 37 37 38 41 44 47 49 49 42 38 40 46 63 73 99 128 134 132 131 129 112 92 35 21 16 22 33 28 22 24 39 61 54 50 59 59 54 48 42 43 44 43 44 39 36 36 35 35 34 33 34 34 33 33 34 35 34 37 36 33 30 32 31 30 34 38 39 39 41 42 40 41 41 41 42 44 41 38 36 36 35 36 37 39 40 37 38 34 32 32 32 33 32 32 34 34 36 57 127 141 137 134 136 135 133 131 137 138 141 142 145 140 135 126 118 86 32 31 32 31 42 40 30 34 45 48 51 53 50 47 45 45 44 43 35 19 15 17 27 24 18 19 21 28 39 40 42 48 42 36 34 32 32 32 31 30 31 30 28 28 38 145 175 174 174 174 173 175 177 176 176 175 177 175 174 174 176 176 175 174 173 174 177 121 23 34 31 29 29 30 32 31 28 26 27 29 29 29 29 30 31 31 31 28 27 28 28 30 29 30 31 29 26 29 32 51 77 27 30 34 40 44 46 47 46 46 41 41 42 42 41 39 40 41 40 39 42 42 42 41 43 41 41 41 40 39 37 38 39 40 39 38 40 38 26 18 21 27 30 25 23 25 31 33 36 35 37 39 37 36 34 35 34 33 32 33 33 32 30 30 31 34 42 153 178 160 159 151 156 158 159 149 171 144 153 154 153 156 157 161 174 125 171 123 151 180 170 68 42 34 37 34 34 33 31 32 32 31 32 32 32 32 35 33 31 31 31 30 33 32 32 35 35 35 34 35 33 32 32 61 52 36 35 34 33 33 33 33 35 34 36 37 37 36 34 35 33 35 36 36 35 36 36 35 36 38 39 38 37 39 38 39 39 40 40 40 40 41 39 38 31 21 21 27 29 23 19 20 24 28 33 36 35 33 35 35 35 32 29 31 31 31 29 30 30 28 27 27 30 28 82 172 171 172 154 156 164 171 165 160 163 152 162 156 149 168 156 154 151 152 147 141 156 156 164 178 116 35 34 30 28 30 30 30 29 31 31 31 31 32 34 36 37 36 38 40 42 42 41 42 42 42 43 42 40 37 33 32 133 140 147 150 158 160 165 168 170 169 165 162 158 154 142 134 120 106 95 89 78 73 62 51 44 41 36 34 32 30 27 28 27 27 26 27 38 77 99 101 41 40 39 42 42 41 44 47 50 50 50 44 43 54 70 81 87 83 80 81 95 98 104 116 111 103 47 22 19 21 33 29 22 24 37 58 59 52 59 59 53 50 48 58 86 111 134 142 142 142 141 139 139 139 135 136 134 134 133 129 127 123 120 120 119 118 117 117 118 113 106 98 89 82 79 75 67 62 56 55 49 46 42 40 38 38 37 39 44 43 40 38 37 35 35 35 36 36 36 34 38 39 102 138 137 136 136 137 136 136 139 142 142 140 134 133 127 115 138 106 30 39 36 35 38 39 34 40 54 49 50 51 50 49 46 46 45 43 37 20 14 18 26 24 16 20 20 27 39 39 40 47 41 36 32 30 31 32 31 30 30 29 28 28 32 134 177 174 174 173 173 174 175 175 176 174 176 175 175 175 177 176 173 175 175 175 176 129 22 32 30 30 29 30 32 29 28 26 28 31 31 32 31 31 30 29 29 28 27 25 29 30 30 29 31 31 27 27 32 35 91 40 29 34 39 45 46 45 47 46 42 42 42 43 41 40 41 41 41 42 44 41 42 42 43 41 41 41 40 39 38 40 40 39 37 37 41 38 24 20 20 26 29 24 23 25 30 32 34 34 36 39 37 36 36 36 34 34 33 34 32 31 29 30 32 33 43 150 178 178 177 175 175 176 168 173 174 168 161 155 154 160 156 154 181 146 164 126 145 178 172 66 41 38 37 36 34 33 33 32 30 31 32 32 32 33 35 33 32 32 31 31 30 31 31 36 35 34 31 31 31 32 30 42 70 36 37 35 34 34 34 33 35 33 34 37 37 36 35 35 35 35 37 35 35 35 36 37 37 37 39 36 36 38 37 37 39 40 42 42 42 41 39 38 28 18 22 27 28 22 19 21 24 27 31 35 37 34 34 36 35 31 30 30 30 31 30 29 29 28 28 28 31 30 80 175 176 176 172 175 177 178 176 178 177 175 176 176 176 176 175 176 174 174 173 174 172 172 174 181 117 37 32 31 29 30 29 30 31 31 31 32 32 31 34 36 36 37 38 39 41 42 42 43 42 42 41 40 38 36 31 31 60 62 64 67 76 82 86 94 102 103 116 122 128 139 155 166 172 182 193 196 196 192 154 103 55 46 40 36 33 31 31 29 28 26 25 25 31 58 94 114 67 47 46 47 46 47 51 51 48 46 44 50 70 84 84 82 76 75 75 59 55 60 85 118 164 168 61 23 18 19 31 28 23 24 37 55 61 53 58 59 53 55 98 119 133 134 128 126 125 119 117 119 121 117 115 108 107 103 99 97 97 93 97 96 95 93 91 94 103 105 112 122 135 143 146 151 153 154 151 150 141 135 125 117 107 95 83 73 66 56 45 42 40 36 34 35 37 40 39 37 38 39 81 128 136 134 137 138 136 136 142 144 138 133 150 182 115 101 144 115 34 46 45 41 38 39 39 45 64 56 50 50 50 48 46 46 46 43 39 19 13 16 25 23 17 18 19 27 40 39 40 46 42 36 31 30 30 31 31 29 30 31 30 27 29 103 155 164 171 176 176 177 176 176 176 176 174 174 174 174 174 176 173 174 176 174 177 139 17 31 31 31 30 32 32 30 29 28 29 30 33 33 33 33 31 30 29 28 27 25 28 30 31 31 33 33 27 27 31 31 87 58 29 34 41 46 47 45 45 45 45 44 42 42 42 41 41 41 40 42 43 41 43 42 40 41 40 40 41 40 39 40 39 39 40 38 40 38 24 18 20 26 27 23 22 25 30 32 34 34 36 39 38 37 37 36 35 35 33 33 32 31 32 31 32 34 40 147 179 177 181 179 179 178 180 180 179 177 176 176 173 174 172 170 180 172 178 170 169 177 175 71 40 37 36 39 35 32 33 33 31 32 31 32 33 35 35 35 33 34 31 30 31 31 34 37 35 32 31 29 32 32 31 35 72 40 35 34 34 34 36 35 34 35 35 36 38 36 34 35 37 36 37 37 36 35 35 37 35 36 39 38 37 36 35 37 38 39 42 43 42 42 39 38 26 17 22 28 28 23 19 20 24 28 31 34 37 36 34 35 33 32 30 30 29 29 30 28 28 28 28 28 30 29 77 172 177 178 178 179 179 178 179 177 176 179 177 179 179 178 178 177 178 179 177 175 178 178 177 181 117 37 34 32 29 30 29 32 32 31 32 31 33 33 35 36 36 38 38 38 41 42 42 43 42 41 41 41 40 36 34 33 47 45 45 46 44 43 44 46 49 53 53 55 61 67 72 75 84 95 114 139 208 249 253 240 173 102 47 38 34 32 30 28 28 27 26 25 29 40 83 98 112 57 53 53 51 56 57 59 64 68 79 88 92 85 72 61 58 60 73 86 95 104 121 149 232 251 122 22 18 17 28 26 22 24 35 57 63 54 58 59 57 75 71 55 49 47 48 47 48 50 51 49 48 47 47 48 51 51 49 48 46 44 43 47 47 50 48 47 47 44 46 44 45 46 50 51 55 67 77 81 90 94 103 108 121 130 142 149 154 158 161 158 154 148 144 133 122 112 99 88 81 77 89 123 142 140 146 133 137 140 142 157 138 92 171 173 96 93 141 133 42 54 58 53 46 43 40 48 72 70 50 49 45 42 41 41 44 46 40 19 13 14 26 23 17 18 20 26 40 40 41 46 44 38 32 32 31 33 31 30 30 31 30 30 26 26 27 35 53 67 85 97 112 119 130 138 147 150 157 164 169 170 170 171 172 172 176 146 21 31 29 30 30 31 32 30 30 30 30 30 32 32 34 34 33 33 29 29 27 26 28 30 33 32 34 34 29 26 29 31 71 94 29 35 41 45 46 45 43 45 43 41 42 44 42 41 41 41 42 41 41 40 41 41 40 41 39 39 39 42 41 39 40 41 39 37 40 39 21 17 19 26 26 23 22 25 30 32 33 34 37 40 40 38 37 36 34 34 33 33 33 32 30 30 33 33 37 140 180 177 179 179 178 177 178 176 175 175 176 176 176 175 177 178 177 178 177 180 177 177 174 78 42 37 36 40 37 34 35 34 32 33 32 34 36 36 37 36 34 34 32 32 34 35 36 36 34 34 32 31 30 31 29 32 68 45 37 36 34 33 37 36 35 37 36 36 38 36 35 34 35 36 36 37 37 35 37 38 36 38 39 37 36 35 36 37 37 39 42 42 41 41 41 38 23 17 21 28 27 22 19 19 24 28 32 35 40 39 35 35 31 31 31 30 30 29 28 28 30 29 29 28 28 28 74 173 176 171 173 176 178 177 158 146 175 177 179 179 178 175 176 178 178 177 174 177 173 175 176 183 114 38 35 32 30 30 29 32 31 31 33 34 34 36 35 35 38 39 38 37 40 41 41 41 42 42 40 40 39 36 34 32 49 50 50 50 50 49 50 50 50 50 49 50 49 48 49 50 53 56 58 68 97 143 193 215 220 201 130 58 40 34 30 28 29 29 27 26 27 32 67 91 116 67 58 71 78 78 94 97 93 89 92 93 86 73 66 75 96 109 120 131 139 135 127 125 144 184 95 21 18 18 29 28 22 26 36 55 66 56 58 60 56 51 42 38 37 39 38 39 39 42 47 45 44 45 46 48 50 50 49 47 45 44 44 43 45 44 44 44 46 44 46 48 51 52 52 53 54 57 55 57 55 55 55 48 49 52 52 54 63 68 74 80 92 99 111 122 141 153 169 175 178 181 182 186 191 190 188 178 173 170 161 184 119 92 122 80 89 99 134 148 58 51 60 63 56 49 47 60 83 80 56 46 42 42 39 39 44 49 40 20 14 16 25 23 18 18 21 26 40 40 41 45 43 39 32 31 32 32 31 31 31 31 29 28 26 26 26 28 31 30 32 31 33 36 39 44 48 50 54 62 69 72 82 88 97 104 110 97 28 32 31 30 30 33 32 31 30 31 31 31 33 33 33 34 34 32 29 29 27 27 29 28 32 33 34 37 27 22 28 31 52 113 36 39 44 47 45 45 44 46 45 44 43 42 43 42 42 43 43 42 43 43 42 41 42 41 40 40 42 42 41 42 42 41 41 39 40 38 21 17 20 26 24 21 23 26 30 32 33 35 38 41 40 38 37 36 34 34 34 33 32 31 30 32 32 32 35 139 179 179 178 180 180 177 179 179 176 176 176 177 176 175 174 177 177 179 178 179 177 178 175 84 41 38 37 41 37 35 35 34 33 34 33 34 36 35 36 35 35 34 32 33 36 36 35 36 36 35 32 30 29 29 30 32 66 55 38 36 36 35 37 38 36 36 37 37 37 37 36 35 36 37 37 37 37 36 38 39 39 39 38 37 36 34 35 36 37 39 41 42 42 42 40 37 22 18 21 27 26 20 19 20 25 28 31 33 39 39 35 33 30 30 30 29 31 31 28 28 32 30 30 29 28 30 76 173 172 149 155 166 165 171 158 123 177 165 167 168 169 170 170 173 176 168 130 151 130 152 179 184 115 37 35 33 29 30 28 29 31 32 32 34 35 35 35 35 38 39 39 39 40 42 39 40 42 42 42 41 39 38 34 32 50 51 51 51 52 54 52 51 49 50 50 49 48 48 50 52 51 52 54 54 60 68 59 61 79 119 176 165 67 35 32 29 30 29 28 26 24 29 50 91 107 104 57 67 66 74 77 72 69 67 73 77 87 98 114 131 150 173 212 232 239 238 221 201 158 134 78 28 21 18 26 29 21 25 32 49 67 58 58 60 51 33 27 31 35 38 36 35 35 38 44 43 42 42 42 45 51 52 56 55 52 50 47 46 45 46 47 50 50 51 52 53 56 55 53 52 53 54 54 54 54 54 52 51 49 51 48 49 50 49 50 47 46 45 47 46 45 48 54 56 69 76 87 102 122 136 152 161 173 186 202 208 209 211 210 178 163 150 146 159 98 49 53 58 59 63 86 119 113 102 69 44 40 42 40 38 40 45 40 19 14 15 24 23 17 18 23 27 40 41 42 45 41 38 33 34 33 31 32 30 32 29 29 27 26 27 24 26 30 30 28 27 30 32 31 30 27 28 27 27 28 31 30 31 32 29 29 30 32 31 32 31 30 32 32 30 30 29 29 30 34 34 34 35 34 34 30 28 29 29 29 29 32 33 34 35 28 21 25 31 37 110 62 44 50 50 46 45 44 45 45 42 42 41 44 44 43 43 43 43 42 42 42 42 41 42 41 40 41 40 42 41 40 42 40 40 42 39 23 19 21 27 24 21 22 26 30 31 34 35 39 41 40 38 38 36 36 34 32 31 33 32 29 30 30 31 37 76 113 124 139 150 158 166 172 170 171 174 173 174 174 173 176 176 177 176 178 177 177 176 175 82 38 37 36 39 36 35 35 34 30 31 32 33 35 35 35 35 35 35 31 34 36 35 36 37 38 36 34 31 26 27 30 30 55 67 37 35 35 36 34 35 35 34 37 37 36 35 35 35 35 35 36 37 38 38 39 40 39 39 38 38 36 35 35 35 37 38 39 41 42 41 40 36 21 18 24 28 25 19 18 21 24 28 31 33 37 39 33 33 31 28 29 30 30 29 29 29 30 29 29 30 28 28 75 175 176 166 163 159 152 160 159 154 176 148 150 153 144 157 151 154 158 171 131 128 126 132 182 182 118 37 36 33 30 31 29 30 32 32 32 34 35 36 34 36 37 39 41 39 41 41 41 41 41 41 42 42 40 37 32 31 52 50 49 49 54 54 52 52 48 51 48 50 50 48 49 50 50 50 52 52 55 55 51 53 54 58 80 140 144 63 33 31 31 30 29 29 26 28 35 76 100 118 57 40 47 52 55 55 70 106 125 121 121 124 156 194 230 243 249 249 246 246 247 245 234 195 88 27 22 19 24 29 21 25 34 48 64 59 56 62 41 25 24 30 36 40 35 32 31 35 44 46 43 43 44 45 47 53 56 56 58 57 54 53 52 52 51 52 53 53 55 56 57 56 54 53 54 53 54 54 55 55 53 55 52 52 53 54 52 53 56 55 53 53 52 53 52 52 53 52 52 52 49 51 53 57 64 68 82 91 107 125 152 164 201 235 246 242 223 196 141 65 46 66 106 131 148 154 131 100 80 56 42 41 38 38 38 42 38 20 15 14 25 22 16 19 22 28 40 43 42 47 39 37 33 32 32 31 31 30 31 29 28 28 27 26 26 27 27 29 28 29 29 31 30 27 26 27 27 26 27 27 28 28 28 28 29 30 31 30 30 30 29 30 32 29 28 30 30 31 31 33 34 35 33 33 31 29 29 29 29 30 32 32 34 34 27 21 22 30 31 86 92 50 54 53 47 46 46 44 45 42 44 43 45 44 44 44 44 43 44 42 42 42 41 42 40 41 41 42 43 41 41 43 42 42 41 40 23 19 20 25 24 21 22 27 31 32 35 36 39 40 38 38 37 36 36 35 33 32 33 33 32 31 30 30 31 37 37 39 42 54 69 80 88 88 97 111 119 127 136 149 156 161 165 167 171 173 174 176 173 82 37 37 38 38 35 33 32 32 30 31 33 34 34 33 34 35 34 33 31 34 35 34 35 36 37 36 34 30 25 26 29 30 44 77 35 36 35 35 33 32 32 33 35 35 35 33 33 33 34 35 35 34 36 37 38 38 40 38 36 36 36 35 36 35 37 36 39 39 40 42 39 34 20 18 23 28 24 20 18 22 23 28 31 32 36 38 36 33 31 28 27 29 30 29 31 30 28 27 28 28 29 27 73 173 176 178 176 175 175 176 174 173 177 171 169 164 161 164 166 163 163 166 125 154 126 146 181 184 120 38 35 33 32 32 29 29 29 30 31 34 35 34 35 34 37 38 39 39 39 39 40 41 41 41 42 43 41 38 30 29 54 54 51 51 52 51 50 50 51 49 53 51 50 49 48 49 49 50 48 49 49 51 52 51 49 47 49 47 108 130 53 31 32 31 29 30 26 26 30 52 92 106 99 51 54 66 95 132 159 144 133 145 174 204 234 239 241 240 240 242 241 241 242 245 246 245 136 32 21 17 21 30 22 24 34 47 66 59 58 61 34 22 22 28 38 38 31 28 28 33 41 45 47 47 46 47 47 49 54 59 60 60 59 57 56 55 55 55 56 55 54 55 56 55 55 56 53 51 54 55 54 53 55 56 51 51 51 52 49 54 56 55 55 55 54 54 54 55 55 55 54 54 54 53 55 53 52 52 54 53 52 53 51 55 65 96 176 212 232 236 219 185 146 147 151 149 124 94 77 70 85 79 57 45 40 38 39 43 39 21 14 16 23 21 18 19 23 28 38 41 43 45 39 38 34 33 33 31 29 31 32 30 27 27 29 27 27 28 27 29 28 29 30 30 29 30 28 29 27 25 25 26 28 28 28 28 29 28 31 31 31 31 30 32 33 32 30 30 30 31 31 33 34 33 34 32 30 29 29 28 29 31 32 31 34 36 31 21 20 25 28 49 116 63 58 57 50 47 46 44 43 43 44 45 46 46 44 44 46 46 45 45 43 41 41 42 41 43 41 42 43 43 39 40 43 42 40 38 19 17 21 27 25 21 22 26 32 34 35 37 39 40 38 37 35 35 35 33 32 32 34 32 31 31 32 32 32 36 35 29 31 33 34 34 35 32 32 30 28 28 29 33 32 39 43 47 54 57 63 66 73 55 38 34 36 34 33 33 31 32 33 31 33 35 32 32 35 36 36 32 32 33 33 33 35 35 38 36 34 30 24 25 28 30 37 81 37 34 35 34 33 32 30 32 32 33 34 32 32 33 33 33 32 34 35 35 36 37 40 39 35 38 38 36 36 36 35 35 39 38 38 39 38 32 18 17 23 26 22 20 19 22 23 27 31 33 36 37 36 34 32 29 28 29 29 29 31 30 31 31 31 29 30 30 71 173 177 176 178 178 179 180 180 178 178 177 178 179 178 178 177 178 179 179 177 180 176 176 178 182 119 40 36 33 32 31 30 31 32 32 33 35 36 36 34 35 38 37 38 38 38 40 39 41 41 41 43 40 38 37 28 26 54 53 52 53 52 52 51 52 52 50 51 49 49 48 47 48 49 49 49 50 50 51 51 51 49 47 49 49 55 99 102 39 33 30 29 29 28 25 26 40 80 93 115 99 130 151 164 150 139 144 184 217 244 247 245 246 244 243 243 243 244 241 241 244 241 244 139 35 22 17 20 30 22 25 35 47 66 60 58 64 35 21 23 28 37 38 30 25 27 32 38 42 49 48 45 46 48 52 55 58 59 60 59 58 55 56 54 55 55 55 54 56 57 57 57 56 52 51 52 54 53 52 53 53 49 51 51 51 51 52 53 54 55 54 53 53 54 55 54 55 52 52 51 52 54 53 51 52 54 54 53 53 55 53 54 56 72 88 107 123 155 189 196 168 145 143 123 83 45 43 64 77 75 60 45 42 42 46 41 20 15 16 24 21 18 18 23 29 38 42 42 45 37 37 33 33 33 32 31 30 33 31 28 27 27 27 28 28 28 30 28 29 29 28 28 29 29 29 28 28 25 27 30 30 30 29 31 29 32 31 31 30 33 31 31 31 31 30 31 33 33 33 35 33 34 33 29 29 30 28 29 30 32 32 34 37 34 24 20 23 29 38 112 79 66 61 54 50 45 44 44 42 42 43 46 45 45 45 45 46 44 44 43 41 42 42 43 41 40 41 41 42 40 39 41 41 42 38 20 17 24 27 23 21 21 25 33 35 36 36 38 40 39 39 36 35 34 32 32 32 33 32 31 30 32 31 31 34 32 30 32 33 31 31 32 32 29 29 30 30 28 29 30 30 31 31 31 31 33 34 37 40 36 34 33 33 32 31 31 31 32 32 33 34 31 33 36 35 35 31 31 33 34 34 36 37 38 38 36 31 24 23 26 30 33 80 49 33 33 32 32 31 32 31 31 32 32 31 30 29 30 33 32 34 34 35 37 37 40 38 36 37 38 36 36 36 34 35 37 37 38 39 39 32 19 18 23 26 21 20 19 22 26 28 31 34 35 36 37 35 33 31 29 31 30 30 30 30 30 30 31 30 29 29 73 174 177 178 178 179 179 179 177 177 178 178 178 179 176 177 177 179 179 180 179 179 180 180 179 184 121 40 35 33 32 31 31 32 32 32 35 37 36 35 36 35 35 34 36 37 38 39 39 41 41 42 41 39 38 36 27 23 53 51 51 51 52 52 51 51 52 51 52 50 50 48 47 49 48 47 48 50 51 51 50 48 50 49 47 48 46 48 100 79 35 31 31 29 28 25 25 30 61 87 110 153 156 143 152 165 204 237 249 251 250 251 251 251 250 251 251 251 250 250 250 250 250 248 144 40 20 18 20 29 23 24 34 46 66 61 58 60 42 24 24 26 36 42 32 24 27 29 38 41 47 50 48 48 50 53 56 58 59 59 60 59 58 59 58 57 57 55 56 56 55 56 56 54 54 52 52 53 52 52 52 52 50 52 51 51 53 50 50 51 55 54 54 53 55 52 54 53 52 52 52 51 52 52 53 53 53 52 51 52 53 53 53 53 54 55 57 57 59 69 123 163 189 188 110 103 81 48 41 56 78 76 65 55 56 58 42 21 12 14 24 20 17 18 23 28 39 43 43 44 39 38 35 32 32 34 32 31 31 30 29 27 28 28 27 27 29 29 29 28 29 28 28 27 26 26 28 28 26 29 31 31 33 31 31 32 35 34 32 32 34 34 31 30 31 31 32 32 32 34 36 38 37 34 32 31 32 31 31 31 32 33 36 39 37 30 20 21 27 35 86 114 74 70 59 51 47 44 44 45 44 44 45 45 45 45 43 44 43 42 42 42 42 40 41 41 40 41 42 41 40 40 40 42 43 37 20 18 26 28 23 21 22 27 32 35 38 39 39 40 38 38 37 37 34 33 32 32 32 32 31 31 31 32 32 32 32 32 31 32 32 31 33 34 32 30 32 32 31 31 32 31 30 31 32 32 30 32 34 34 33 33 32 32 32 33 34 33 33 33 32 30 31 34 35 35 35 31 30 31 32 36 36 38 38 38 38 34 26 24 25 31 32 60 75 34 34 31 31 30 30 31 32 30 31 32 30 30 30 34 33 33 34 35 35 37 37 37 39 38 36 35 36 35 35 36 36 38 39 37 37 30 18 19 25 26 20 19 20 23 29 30 32 33 36 35 35 35 33 31 31 33 32 29 30 31 29 29 30 30 30 27 70 171 176 176 178 178 179 177 176 180 178 175 177 177 177 176 176 176 178 178 178 179 178 179 180 185 119 39 36 33 33 33 32 32 31 33 36 36 36 36 36 36 36 35 35 36 37 39 39 42 44 41 41 42 39 35 28 23 54 50 50 50 52 52 51 50 52 52 52 50 50 49 49 48 48 48 49 50 51 50 49 49 51 49 49 48 45 45 65 92 50 32 31 31 30 29 27 29 47 78 102 125 137 170 212 237 249 251 250 251 251 250 249 249 250 251 249 249 249 251 249 248 249 244 146 44 21 19 19 29 25 25 34 45 64 63 57 59 49 26 24 26 35 44 35 25 26 28 37 41 43 50 52 50 54 55 56 58 60 60 59 60 61 60 60 61 60 59 57 57 57 56 57 57 56 53 53 53 52 52 54 51 53 53 52 51 51 51 51 53 55 55 53 54 55 54 54 54 53 52 52 51 51 52 53 52 52 53 51 51 50 50 52 50 52 51 53 51 51 52 62 89 155 125 70 71 98 76 44 43 92 84 66 65 63 62 44 21 14 14 24 20 16 18 25 29 41 44 44 44 39 37 34 32 33 33 32 32 33 32 29 28 28 28 28 28 28 29 29 30 29 29 28 27 28 28 28 30 29 32 32 32 35 34 36 36 37 35 36 36 36 35 34 34 35 34 35 35 35 36 38 39 40 37 36 33 32 33 33 34 35 34 36 38 38 33 22 21 27 36 64 145 101 74 65 56 49 47 45 44 43 45 46 45 46 46 44 43 41 40 42 41 40 40 40 41 39 40 41 40 40 41 40 40 42 36 20 20 25 27 24 22 24 27 33 37 39 41 39 41 38 37 38 39 35 34 32 32 32 35 33 31 32 32 30 32 31 31 33 33 33 31 32 34 32 32 33 33 33 34 33 31 32 34 34 31 31 33 33 34 34 33 33 33 33 32 31 31 31 32 33 32 33 35 35 36 37 34 32 31 34 36 36 38 38 37 37 34 27 24 24 29 32 46 88 36 33 31 31 31 31 32 32 32 32 31 31 31 32 35 33 34 34 35 34 36 36 37 40 37 36 37 36 34 36 37 37 37 39 40 37 29 17 19 26 26 21 19 19 23 31 32 32 33 35 35 34 34 31 31 30 32 32 30 30 31 29 29 30 29 30 30 53 125 142 152 161 165 171 174 176 177 178 177 176 178 177 177 176 177 176 177 176 177 178 178 180 184 120 35 36 34 31 32 32 32 32 34 35 36 37 36 35 36 36 35 34 36 37 39 42 42 44 42 41 42 39 35 29 24 53 49 51 51 51 52 52 52 51 51 49 49 50 47 47 50 48 47 49 48 50 47 49 47 48 50 48 47 47 48 48 66 84 42 32 31 32 30 27 26 35 60 96 111 191 248 250 250 250 251 250 249 251 252 251 252 251 251 250 248 249 250 251 249 249 241 148 47 23 19 18 25 25 26 31 42 62 62 56 58 53 27 22 25 31 43 36 26 25 27 35 39 41 49 56 53 55 56 58 55 56 58 57 59 61 61 63 62 60 61 63 62 61 60 59 56 55 53 52 52 51 51 52 51 51 51 51 50 51 54 53 54 54 54 53 53 53 54 51 53 53 50 48 50 51 51 50 50 50 52 51 51 51 49 50 48 51 51 52 52 51 51 49 55 79 119 75 46 82 135 66 47 83 163 154 92 57 54 41 22 13 13 23 19 18 20 26 30 39 42 43 42 39 37 34 33 31 31 31 31 31 30 28 27 28 28 28 27 27 28 29 29 29 29 30 28 27 28 28 31 31 33 43 49 55 59 57 55 52 52 52 52 49 48 47 46 44 43 43 43 41 42 44 46 42 39 38 36 34 35 36 37 36 36 39 40 43 37 26 23 27 35 46 135 103 75 69 62 53 50 50 48 46 46 45 46 47 46 43 40 41 42 41 40 39 39 40 40 41 41 41 40 39 40 39 39 43 37 21 20 27 30 25 23 25 28 34 37 38 40 40 41 39 39 38 36 35 34 32 32 31 34 32 30 31 31 30 30 32 33 30 33 31 29 31 33 30 32 33 34 33 33 33 34 33 33 34 31 30 33 33 32 35 34 33 31 31 30 30 31 32 32 34 34 33 35 37 36 36 32 32 35 37 36 36 37 39 38 38 35 28 23 23 28 31 34 94 44 33 32 33 32 33 33 33 34 32 31 32 33 33 35 34 34 33 32 34 36 36 39 38 36 34 36 36 35 34 34 35 36 38 38 33 27 19 21 26 24 20 18 20 24 31 33 32 34 33 35 34 35 32 32 30 31 31 31 31 30 31 28 28 28 29 30 29 26 33 39 45 54 62 70 78 87 97 104 109 113 123 125 132 136 147 145 151 152 156 158 158 165 104 35 34 32 30 31 32 32 31 33 35 37 35 34 37 36 36 34 36 37 38 38 40 42 41 40 41 40 37 36 29 22 52 50 52 51 52 53 55 54 52 52 50 49 49 48 47 50 49 47 48 48 47 46 49 47 46 48 50 49 46 47 48 48 85 60 32 32 32 31 27 25 31 44 88 102 161 242 250 249 251 251 251 250 251 253 251 251 250 251 250 249 250 249 250 249 250 237 145 55 23 20 18 24 26 25 32 41 62 61 57 58 56 32 20 22 30 44 37 27 25 25 33 39 41 48 58 57 54 55 59 60 57 56 57 58 61 60 62 61 64 67 72 67 65 64 62 60 58 57 58 56 54 53 53 53 50 51 53 53 54 54 51 54 53 55 54 53 54 53 51 52 52 50 48 49 51 51 50 49 51 53 51 51 51 49 48 49 51 51 52 52 52 51 50 49 55 83 93 51 157 190 91 65 59 191 241 204 93 51 49 21 16 15 23 19 19 21 25 30 42 43 43 41 37 37 34 34 31 30 30 32 33 32 28 26 27 27 28 28 28 29 29 29 29 28 29 29 28 28 30 35 59 97 135 152 162 167 167 165 162 162 160 158 155 154 148 145 143 143 138 133 131 126 123 119 112 105 97 95 85 76 74 70 62 57 51 47 46 42 33 29 28 33 42 109 92 75 80 73 63 58 53 52 50 49 49 49 48 47 47 43 42 43 43 44 42 41 41 40 41 42 40 40 41 42 42 41 44 36 22 22 29 30 26 25 27 29 33 36 41 41 41 42 39 39 37 36 35 32 33 31 31 34 32 31 31 32 31 30 31 31 32 32 31 31 30 33 30 30 33 34 33 33 33 34 34 33 34 32 30 32 34 34 35 34 32 32 31 31 31 32 32 33 35 33 32 35 34 37 36 33 34 35 36 36 37 37 39 39 39 35 29 25 21 25 30 30 84 58 40 36 37 36 34 34 37 38 36 36 36 36 36 35 35 34 35 34 35 35 35 37 38 36 34 35 35 35 33 34 34 35 37 38 34 25 18 20 25 23 19 17 19 24 30 31 33 33 32 35 34 36 33 32 32 32 32 32 32 30 33 32 29 28 31 29 28 29 32 34 34 35 33 30 32 34 35 35 35 39 43 45 45 51 55 54 56 60 62 59 59 62 51 35 32 30 31 32 32 32 32 33 36 36 38 36 35 36 39 37 36 36 37 38 39 42 40 40 40 40 37 34 29 23 50 52 50 52 49 51 53 54 55 53 51 50 49 50 48 49 50 50 49 49 48 48 46 46 48 49 49 46 48 46 45 48 65 85 35 31 32 32 27 26 28 35 69 97 125 207 250 249 251 250 251 252 250 250 250 250 251 249 246 247 248 249 248 251 251 230 148 62 21 18 17 22 26 24 31 40 59 62 58 57 60 35 18 20 28 43 40 29 26 27 31 38 40 41 54 58 55 56 58 57 55 56 58 59 61 59 63 62 65 70 77 68 67 66 65 64 63 61 63 66 65 63 61 59 58 57 60 58 57 57 56 56 54 56 55 54 54 52 51 51 52 51 49 50 50 48 50 49 50 50 51 51 50 50 48 49 51 51 53 52 51 49 50 51 50 56 85 130 245 244 150 92 58 106 237 249 223 126 36 22 15 15 24 21 19 20 23 30 40 46 45 41 35 36 34 36 33 32 32 33 32 32 28 28 28 29 29 27 27 28 28 29 31 29 28 25 27 30 53 99 132 126 108 102 96 93 98 97 99 101 105 105 108 111 113 117 115 117 120 123 124 130 139 145 145 143 151 153 155 161 167 170 168 170 168 176 171 166 160 157 150 149 144 152 149 118 119 113 103 96 85 77 69 65 64 60 55 51 50 48 44 43 45 46 45 45 45 47 46 45 44 45 44 43 44 45 48 38 28 27 33 34 29 28 30 32 36 39 42 42 42 43 40 40 38 37 34 32 32 32 32 33 31 31 31 31 30 31 30 31 32 32 30 32 30 32 31 32 34 34 33 33 34 32 33 32 31 32 32 32 34 35 36 34 33 32 30 32 31 32 33 33 33 32 33 34 34 36 36 35 35 36 37 37 37 38 40 39 37 35 28 24 21 23 30 32 67 78 45 45 43 44 42 43 44 44 44 42 41 42 41 41 40 40 39 39 38 38 38 37 38 39 36 34 35 34 34 33 34 35 34 36 34 25 17 21 25 21 18 17 18 24 28 31 32 32 34 36 34 34 31 31 32 32 32 31 31 29 30 28 27 28 31 28 29 30 31 32 34 34 32 30 30 29 31 31 32 30 30 32 33 34 33 35 33 33 33 38 35 32 30 31 32 33 32 33 31 30 32 32 34 36 38 38 37 38 38 37 37 39 38 38 40 41 41 40 40 38 37 35 30 23 48 51 52 52 52 51 53 53 54 52 50 50 50 51 51 51 50 50 50 51 49 48 47 47 48 49 49 47 48 47 46 48 54 83 60 34 34 32 29 27 28 32 55 88 113 160 249 248 250 250 251 248 249 248 252 249 250 249 246 247 248 247 242 231 221 205 150 67 20 18 17 21 26 26 31 42 57 60 56 59 60 41 17 21 29 41 40 28 26 25 30 39 40 39 51 58 58 57 59 57 56 56 59 60 60 61 62 65 71 72 76 74 72 72 69 67 67 67 68 70 68 70 69 68 66 63 63 66 64 64 63 62 61 62 60 59 55 53 50 51 50 49 48 49 52 50 49 50 49 49 49 50 51 51 50 50 51 50 52 51 49 48 51 52 51 56 62 139 246 244 205 124 90 66 186 244 249 203 36 21 14 15 24 20 19 22 25 31 40 46 43 39 36 36 34 35 40 32 30 32 34 31 29 30 29 29 29 28 29 29 29 29 30 29 29 27 29 50 77 73 56 55 51 52 51 50 52 52 54 56 55 51 50 52 52 54 55 57 55 52 54 58 61 61 63 60 65 67 71 73 79 82 82 84 87 98 103 101 99 107 110 122 140 140 149 150 156 166 174 174 174 176 172 166 160 155 148 138 128 119 107 97 88 77 67 62 54 54 53 48 47 44 41 44 51 53 54 43 33 35 40 38 35 33 35 37 38 40 43 43 42 42 40 39 38 36 33 32 32 32 33 33 31 31 31 31 29 30 30 32 30 31 31 30 30 32 31 32 35 34 32 33 33 32 33 32 31 31 31 32 33 35 37 36 33 32 31 31 31 33 32 33 35 34 34 35 37 36 35 33 35 36 39 38 36 38 40 40 39 36 30 25 24 23 29 33 58 91 44 45 44 43 43 46 47 47 46 43 42 44 42 45 44 43 44 45 43 43 43 43 44 42 40 37 35 35 35 35 36 37 38 40 35 24 19 24 27 23 20 19 20 24 29 32 32 32 34 36 34 34 31 31 31 32 32 30 30 30 31 29 29 29 30 30 30 30 31 32 34 33 33 32 30 29 31 31 33 30 31 31 30 31 31 32 31 32 31 34 32 29 31 30 32 34 33 33 32 30 34 34 36 37 37 37 36 37 37 37 36 37 37 39 41 41 41 41 41 40 37 36 31 24 47 51 52 51 53 52 53 53 53 52 51 50 51 50 51 51 49 49 51 50 49 50 49 47 48 48 49 48 48 48 49 46 47 66 87 44 34 33 31 29 27 30 40 71 106 123 217 251 251 250 250 250 250 248 250 248 250 247 242 235 218 201 186 178 172 178 148 75 20 16 16 19 24 22 31 41 55 59 57 58 58 46 19 20 29 41 42 28 24 24 27 35 42 40 46 55 58 57 60 61 59 58 58 59 59 62 62 63 90 140 128 116 105 92 83 78 77 76 69 70 69 69 71 70 71 69 70 69 68 67 68 67 66 66 63 61 57 54 53 53 52 51 50 50 51 50 48 49 47 47 49 50 49 49 51 50 50 51 51 52 49 49 50 50 51 54 57 77 223 244 244 189 127 124 117 158 191 155 35 24 15 15 23 20 18 21 26 32 41 46 44 39 36 34 33 33 35 33 32 34 34 32 30 30 30 29 29 29 29 28 30 32 29 29 28 28 35 53 43 34 31 34 36 32 30 34 37 40 43 47 47 45 44 43 40 41 42 43 42 43 42 41 43 43 46 47 53 56 61 62 65 61 53 55 54 51 50 48 46 47 46 45 47 46 51 56 61 59 64 69 74 83 95 104 116 125 137 145 154 161 171 177 186 189 194 192 193 186 181 178 171 165 157 149 136 126 109 95 81 70 64 59 50 45 43 42 44 41 46 44 42 40 39 38 38 37 35 33 32 33 34 34 33 32 30 31 32 33 32 31 31 33 31 30 31 32 31 31 35 35 31 30 31 32 32 31 30 31 31 31 33 35 36 36 33 32 30 31 29 30 31 32 32 33 33 34 37 37 33 33 33 35 40 39 36 38 41 41 39 36 33 26 21 21 27 31 44 101 37 37 35 36 37 37 39 40 38 37 36 38 39 39 41 44 45 44 46 47 47 46 47 47 45 43 42 40 39 39 38 41 42 42 34 21 17 22 25 21 19 19 21 27 31 32 32 33 35 34 31 31 29 28 29 31 31 30 31 32 31 29 31 29 29 29 30 31 33 34 32 33 34 32 30 30 30 30 31 31 31 32 33 32 33 31 31 30 32 31 31 32 31 30 33 33 32 32 32 32 34 33 36 38 39 39 37 36 37 37 36 35 37 39 41 40 41 41 41 40 38 35 32 25 48 52 51 50 51 53 53 53 52 52 52 51 51 51 50 50 51 49 50 50 50 50 50 49 48 49 47 48 49 47 50 48 48 51 89 60 35 34 31 29 28 29 34 54 101 119 172 245 250 251 250 250 248 245 247 247 235 220 201 189 180 179 178 174 177 176 132 76 19 17 15 19 24 23 33 41 54 61 58 57 59 46 22 20 27 41 45 30 24 24 25 33 40 40 45 52 59 57 59 61 60 60 59 60 60 60 61 66 93 195 201 198 191 185 174 163 155 148 126 113 102 95 87 80 76 77 76 71 70 69 70 70 70 70 66 63 56 56 53 53 52 50 51 50 49 49 49 49 49 50 50 50 51 51 50 51 50 50 51 52 50 49 49 49 51 54 58 58 175 246 245 236 168 145 152 160 165 144 48 21 15 15 25 22 20 21 27 32 40 44 43 38 36 34 33 33 32 32 32 34 34 33 31 30 30 29 29 28 28 29 30 31 29 28 31 31 39 40 27 25 26 32 34 30 28 33 36 36 39 42 45 48 51 50 46 43 42 44 45 46 45 45 45 45 49 52 60 62 61 61 66 64 58 57 55 54 53 50 48 48 48 47 47 47 47 46 49 49 52 49 48 49 49 51 54 56 60 63 67 72 78 85 99 107 115 110 129 142 153 162 178 190 205 216 223 225 225 217 211 201 186 171 144 114 70 49 46 47 45 45 41 38 39 38 37 37 36 33 32 34 37 35 33 31 32 32 33 33 32 31 31 32 31 31 32 32 32 33 33 33 32 32 32 32 31 31 32 31 30 31 33 35 38 37 35 33 30 30 30 32 32 34 35 35 34 36 37 36 36 36 36 38 39 39 36 40 40 41 40 37 35 29 22 22 24 29 38 96 46 34 32 31 32 31 34 32 34 34 34 35 34 35 35 36 38 39 43 47 48 47 47 49 48 46 48 45 42 41 40 41 42 42 34 20 17 21 26 21 18 19 21 27 32 32 33 34 34 35 33 32 31 30 31 31 32 32 32 32 32 30 31 31 30 31 30 31 34 35 33 33 32 32 30 31 30 31 32 32 30 31 34 34 33 33 32 31 33 32 31 31 32 31 33 32 33 34 32 33 33 33 37 37 39 40 37 35 35 35 35 34 36 39 41 40 41 41 41 41 39 37 32 27 49 52 52 51 51 52 51 51 52 50 51 52 52 52 52 52 50 50 51 52 51 50 49 51 50 48 45 44 47 46 48 47 48 49 70 84 41 33 33 33 29 27 31 38 83 106 133 209 247 249 244 240 230 219 207 196 181 182 181 180 178 178 177 186 202 155 56 55 27 18 15 17 24 23 34 43 54 61 58 58 57 45 22 20 25 38 48 35 24 25 24 30 43 41 42 49 58 59 59 61 59 59 60 60 60 59 63 66 79 184 203 203 203 203 202 204 205 205 206 206 203 201 198 194 187 183 173 163 153 146 140 135 126 120 90 63 57 54 53 54 52 51 50 49 50 50 51 48 49 50 50 51 51 50 50 49 49 48 50 49 49 49 50 50 50 53 57 59 105 226 246 246 235 189 135 129 142 138 51 21 16 17 24 20 19 21 26 34 40 44 44 38 36 35 31 32 32 33 31 32 32 31 30 29 28 29 29 28 29 30 30 29 29 29 30 32 42 29 20 21 29 35 34 28 30 34 35 37 37 40 43 46 51 53 55 53 52 54 52 51 52 50 51 52 57 59 62 63 62 61 62 61 56 56 53 53 51 51 53 53 54 53 56 57 55 56 54 56 60 59 56 59 59 58 59 59 61 59 59 59 60 60 57 56 57 57 55 63 66 76 80 83 95 103 116 135 162 173 192 210 236 250 253 248 222 180 102 58 48 48 40 38 37 39 37 35 35 33 33 34 38 35 32 31 32 31 32 31 32 31 31 31 30 33 33 33 32 33 33 33 32 33 33 32 33 31 33 33 33 33 31 33 37 37 37 34 30 30 31 32 32 34 35 35 36 37 36 37 37 36 37 38 36 39 36 39 40 42 40 38 35 30 24 21 23 29 33 78 79 31 28 27 30 29 31 30 30 30 30 30 33 32 31 31 32 33 34 38 43 46 48 50 48 47 48 46 41 39 36 35 32 35 33 22 19 24 25 21 19 20 22 27 31 34 35 34 35 36 33 31 31 31 32 29 32 30 31 33 31 30 31 30 31 31 31 31 31 33 33 34 33 32 32 30 28 30 31 31 31 30 30 33 32 34 34 34 32 31 31 31 31 32 32 32 33 33 34 32 32 34 36 37 37 39 38 37 35 35 37 36 38 41 44 43 42 41 40 41 42 39 33 27 49 51 52 51 51 50 50 51 53 51 49 50 51 53 52 51 50 51 50 50 50 49 50 49 49 49 46 45 47 46 48 48 48 48 54 87 59 35 33 33 32 28 29 32 62 96 119 162 249 239 216 198 189 184 178 181 181 183 180 179 178 179 175 171 149 102 88 82 24 16 14 18 25 26 35 43 52 58 56 59 54 47 17 18 22 34 48 36 25 26 26 30 40 41 43 46 56 61 60 60 60 60 62 58 60 61 63 66 74 175 201 199 189 197 204 204 205 205 205 204 204 202 204 204 204 204 204 204 203 201 204 203 199 201 130 58 58 56 54 54 52 52 50 51 51 51 51 49 49 51 51 52 52 51 50 49 49 48 50 50 49 51 50 51 51 52 54 59 73 189 242 237 242 240 207 184 165 143 48 18 15 17 23 20 20 22 27 33 40 45 44 39 36 35 32 33 32 31 31 33 33 32 31 31 29 27 29 30 29 28 28 28 30 31 30 36 42 23 19 23 33 39 32 26 25 30 33 36 40 41 42 43 49 53 55 56 59 58 56 58 57 55 56 57 61 59 62 61 61 60 61 58 54 54 53 53 52 51 53 53 52 52 54 56 53 55 55 56 57 60 58 60 62 59 60 60 60 59 60 59 60 61 63 61 62 59 61 57 53 51 49 47 49 52 55 55 63 71 83 98 122 156 200 225 230 225 210 163 66 47 42 40 38 38 37 37 35 34 33 33 38 36 32 31 31 32 32 31 33 32 32 31 31 33 32 33 30 32 35 34 32 33 32 31 33 32 32 32 33 32 32 33 36 36 36 34 31 30 32 32 30 33 37 37 38 39 37 36 37 36 39 38 35 39 37 39 39 43 42 40 37 31 24 22 23 27 32 62 102 33 29 28 29 28 29 29 29 30 30 29 31 32 30 28 28 31 31 34 37 40 45 47 47 47 47 46 42 37 35 33 29 33 32 21 21 25 25 21 20 20 24 28 30 33 35 35 35 34 32 31 32 34 32 30 32 30 30 33 32 30 32 32 31 31 32 32 33 33 33 33 33 34 33 31 31 30 30 29 30 31 30 31 32 33 35 34 32 33 32 32 32 34 33 33 34 34 35 33 33 35 37 38 38 38 38 36 35 36 37 37 38 43 45 45 43 42 40 42 43 38 33 27 48 49 50 50 49 51 52 52 52 52 49 49 51 51 50 49 50 49 49 48 49 50 50 48 48 49 49 46 46 46 45 49 48 48 49 67 85 45 33 31 31 29 25 29 46 78 109 123 191 187 180 179 184 182 182 179 181 177 176 176 173 174 171 165 161 156 156 122 21 17 15 16 23 26 33 42 52 57 54 59 55 52 18 16 20 32 48 38 27 25 27 31 39 40 41 46 56 60 61 60 60 59 60 58 61 61 61 63 66 157 195 185 184 193 204 204 205 204 204 205 203 196 199 200 201 204 204 202 203 203 202 200 201 203 149 64 58 57 54 51 53 51 50 51 51 50 50 49 48 49 50 51 49 48 48 48 48 48 49 50 51 52 52 51 50 50 54 56 59 105 152 154 160 162 168 174 184 190 52 18 16 16 24 21 21 23 28 33 41 43 43 39 35 34 32 33 31 31 31 34 34 32 31 31 29 29 29 30 31 29 29 30 29 27 30 35 40 22 19 24 34 38 32 27 26 31 36 38 40 40 40 40 47 53 56 57 58 58 59 58 57 56 57 59 59 58 58 55 56 55 55 54 52 53 53 50 52 53 53 52 51 52 51 52 52 51 51 52 54 57 55 56 57 58 58 59 59 60 59 57 58 56 58 57 57 55 57 57 56 54 53 52 50 50 51 48 48 47 46 47 53 60 58 66 80 99 139 181 182 98 42 40 39 38 37 35 33 34 31 34 38 36 32 30 31 33 32 32 32 33 33 32 31 31 31 34 31 32 33 33 31 32 30 29 31 31 32 32 32 33 33 33 34 38 37 35 33 32 31 30 31 33 33 36 39 38 36 36 37 38 37 36 38 39 41 41 41 42 42 42 39 34 26 23 22 25 33 46 113 42 31 31 29 29 30 30 30 30 31 32 32 30 30 32 30 32 32 32 33 33 38 41 45 46 44 47 48 42 36 32 29 34 29 19 20 25 24 21 21 21 26 30 31 34 36 36 36 36 33 34 34 34 34 32 34 32 32 34 32 31 30 29 29 31 31 32 34 34 32 32 31 32 33 32 31 32 33 31 30 30 29 31 30 32 33 33 33 34 32 32 33 34 34 35 35 36 35 33 33 35 37 38 39 40 38 36 33 34 35 35 38 41 41 42 43 42 42 40 39 39 34 28 49 53 49 47 49 51 51 51 51 50 50 50 50 50 51 50 51 49 50 49 49 50 47 47 47 48 48 45 45 45 44 48 49 50 48 52 89 64 34 33 33 29 26 28 38 63 103 116 138 176 177 177 180 180 178 180 177 178 176 173 171 171 165 160 165 168 173 144 19 17 15 15 23 24 32 42 50 58 56 59 56 55 18 16 21 32 48 39 26 25 26 29 39 43 42 45 53 60 60 60 62 60 60 58 59 59 61 61 66 142 202 175 194 187 182 187 196 199 202 205 203 176 177 195 197 203 204 203 203 202 197 190 194 201 162 68 60 56 55 52 53 52 51 50 52 52 51 49 49 50 50 50 49 48 47 47 47 49 51 50 51 50 53 52 51 50 51 51 59 82 130 135 136 135 133 133 135 131 47 20 16 16 24 21 21 24 27 34 42 44 43 39 35 35 34 33 32 32 31 33 34 34 34 31 30 30 30 30 31 30 31 32 31 29 29 35 43 23 20 25 34 38 34 26 25 30 38 40 40 40 41 40 46 53 58 58 59 59 59 57 56 57 57 58 58 56 56 54 55 53 53 53 51 54 53 53 54 54 53 53 54 52 53 54 52 51 52 53 52 53 53 54 55 56 56 57 58 58 59 57 58 57 57 55 55 54 56 56 57 58 57 54 54 53 55 52 54 54 53 52 48 49 49 49 44 47 56 79 133 163 75 41 41 40 37 36 35 35 32 35 36 35 32 32 33 32 32 34 32 32 32 33 32 31 31 34 33 32 32 33 33 31 31 30 31 32 32 32 33 33 32 31 35 39 38 34 33 31 32 31 33 33 32 36 38 38 36 36 38 38 37 38 37 39 41 43 42 43 45 42 41 36 29 26 25 27 33 35 114 55 32 32 33 30 30 31 31 31 30 32 34 32 31 33 31 31 33 32 31 32 35 36 37 41 43 44 48 45 40 36 33 38 27 19 20 27 25 21 21 21 26 29 33 33 35 36 36 33 35 35 32 34 34 32 33 32 32 34 34 34 32 31 32 31 32 32 34 34 34 34 32 31 32 31 32 31 32 32 31 32 30 32 30 32 31 31 32 34 34 34 34 33 33 35 35 37 35 33 33 35 37 39 40 40 37 36 36 34 35 36 36 40 40 42 42 41 41 39 37 38 34 29 52 53 49 48 48 48 48 50 52 50 50 48 50 49 49 50 51 51 50 49 47 47 46 47 47 46 48 48 44 46 46 46 47 47 47 43 76 87 45 33 30 30 25 25 29 43 97 106 115 154 180 175 179 179 178 174 173 175 174 172 171 172 169 167 175 177 177 152 25 17 15 15 22 24 34 46 46 55 57 59 58 58 19 16 21 31 44 38 25 25 27 28 37 44 43 43 53 60 61 61 63 60 60 58 61 61 63 62 62 117 206 182 199 173 180 182 182 174 178 176 183 175 173 184 202 193 183 194 194 193 184 171 196 199 178 77 61 56 55 53 53 52 50 50 52 53 52 49 48 49 50 49 50 49 49 50 46 48 51 52 51 51 53 53 52 53 51 51 56 59 119 130 131 134 134 134 139 137 46 20 16 16 23 20 19 22 29 35 42 44 41 38 38 34 34 34 31 32 33 33 33 33 33 32 32 31 29 30 31 31 32 31 30 32 31 36 44 21 18 23 34 40 33 28 27 29 41 45 43 40 41 41 45 53 59 58 56 57 56 56 56 56 55 57 56 56 55 54 54 52 53 54 51 52 52 52 54 55 54 53 53 54 54 54 55 54 53 53 51 52 52 53 55 55 56 56 57 58 57 56 58 58 54 55 55 57 57 56 57 59 58 57 59 55 55 56 57 55 56 53 50 50 49 52 48 45 44 43 54 94 137 69 41 39 36 36 34 34 34 35 36 35 33 34 33 31 32 32 32 31 33 32 32 32 33 33 32 31 33 31 32 32 32 31 32 32 32 33 33 32 33 34 34 37 39 36 33 31 33 32 31 32 34 35 37 38 37 37 39 38 40 37 39 42 42 43 44 47 48 47 45 43 36 33 27 28 33 37 94 84 34 34 35 33 32 34 37 36 35 34 35 35 34 33 34 34 34 33 32 33 34 34 36 37 39 41 45 48 44 44 40 42 28 21 23 28 24 21 21 22 27 28 33 34 35 36 36 35 33 34 34 33 33 34 34 34 34 35 37 34 33 31 31 30 31 31 32 34 33 35 34 33 33 34 33 30 31 31 30 31 30 31 30 29 31 31 32 32 31 31 34 33 34 36 38 38 36 33 34 35 37 38 39 38 37 36 37 36 36 35 35 37 40 42 43 43 41 38 38 38 37 31 48 47 48 47 49 50 48 49 52 51 51 49 50 50 49 49 50 50 50 49 46 48 48 48 49 47 48 48 44 45 45 46 48 46 47 46 58 89 67 35 33 32 25 23 28 33 77 99 105 126 174 174 174 175 174 173 173 174 174 171 174 178 181 180 183 183 180 160 26 18 16 15 20 25 31 41 46 53 57 60 59 57 20 18 20 29 42 40 27 27 27 27 36 43 44 47 52 61 63 62 60 61 61 60 60 58 62 62 63 104 212 201 198 178 182 191 191 177 181 179 178 182 169 187 197 176 170 187 177 182 178 166 193 199 185 81 60 55 54 52 53 50 51 50 52 53 51 48 49 48 49 50 49 49 50 49 48 48 51 51 52 52 53 53 54 53 52 50 54 53 103 130 132 135 134 147 186 207 45 20 16 16 24 20 18 21 31 36 42 43 42 39 37 34 34 33 34 35 33 32 32 33 33 33 32 31 30 31 31 31 31 30 31 31 32 35 44 22 18 22 33 41 33 25 27 29 40 48 43 39 42 42 44 51 59 58 57 59 57 56 54 55 54 54 55 59 57 57 56 54 53 55 55 55 52 52 53 56 55 52 54 56 55 54 55 55 53 52 52 53 53 54 55 54 56 57 57 59 59 58 58 56 55 57 56 58 58 56 57 56 57 58 59 54 56 58 57 57 56 53 50 48 50 49 52 48 42 45 41 47 97 108 46 36 36 35 36 35 36 36 36 34 33 35 33 32 32 32 32 33 33 32 32 32 32 32 32 31 33 33 33 33 33 31 32 31 32 33 32 33 32 33 34 36 38 35 32 32 33 33 34 32 33 34 37 38 38 37 37 37 38 39 40 40 58 79 106 119 127 128 127 123 112 107 101 94 90 86 114 118 72 67 64 58 50 47 44 42 40 36 38 38 37 37 35 34 32 32 32 35 36 36 39 38 38 39 42 48 48 48 47 45 30 23 26 30 25 21 22 24 29 30 35 36 37 37 36 36 34 35 35 35 35 35 35 35 35 37 36 34 33 33 32 32 32 32 35 35 34 36 35 33 33 33 34 32 33 33 32 31 32 32 31 30 31 30 30 31 32 31 33 33 33 34 36 36 34 33 33 33 36 38 39 39 39 37 35 37 36 36 36 38 42 41 42 42 40 39 40 41 39 33 51 51 50 47 47 49 48 49 52 52 52 51 51 52 51 50 49 48 50 48 46 47 48 47 47 46 46 45 44 43 46 45 46 45 47 49 49 73 93 46 34 33 30 25 25 31 49 81 98 107 154 172 176 176 172 176 175 171 173 181 178 177 182 182 183 181 182 158 38 17 15 14 18 22 28 39 47 52 58 62 58 57 22 18 22 29 41 39 26 26 27 28 37 43 43 45 50 56 62 62 61 61 61 62 61 60 63 64 66 87 211 207 206 197 200 206 207 208 205 204 200 198 195 198 189 195 190 184 185 185 182 175 198 188 195 91 59 56 54 53 53 50 50 50 51 51 51 48 49 49 50 49 49 48 48 48 47 50 51 52 51 51 52 53 53 53 51 52 55 56 79 129 135 149 193 233 243 225 45 19 17 17 22 20 21 23 31 36 41 42 43 41 38 35 34 33 33 34 33 33 34 34 33 33 32 31 30 29 32 31 31 31 31 32 29 33 47 24 18 23 35 43 33 26 26 26 34 48 46 40 40 41 44 49 57 58 57 59 58 57 55 55 56 55 56 61 64 66 67 67 66 73 78 67 61 60 61 60 60 58 57 56 55 56 57 54 54 53 53 52 54 55 55 56 58 58 58 57 55 57 57 57 56 57 57 58 58 58 57 57 57 57 57 57 57 57 55 55 55 53 48 49 50 47 47 45 47 47 45 40 46 85 84 37 35 35 36 35 35 37 37 35 34 34 32 33 33 33 34 33 34 34 33 32 33 33 33 32 33 33 33 33 33 31 31 30 31 29 32 33 31 33 34 35 36 34 32 33 32 32 33 32 33 34 37 38 38 39 38 39 39 48 86 134 164 164 157 150 146 147 148 148 151 152 155 158 159 160 165 166 168 169 168 167 170 168 167 167 164 160 161 160 155 151 149 144 134 129 122 111 96 88 82 75 66 60 56 57 58 55 52 49 33 25 31 34 28 27 29 29 33 33 37 39 40 40 38 39 37 36 37 38 37 37 34 35 36 38 37 36 36 36 35 35 35 35 36 37 37 38 36 33 34 33 33 32 32 31 32 31 30 30 29 31 30 30 29 31 32 31 31 31 31 33 33 35 34 33 33 32 37 39 40 39 40 38 35 35 35 37 37 39 41 41 41 42 40 41 43 40 36 32 51 51 51 50 49 51 50 48 50 50 51 51 53 50 50 48 50 50 50 48 48 48 48 47 47 45 44 44 45 46 45 45 45 46 46 48 48 59 101 65 36 34 30 25 24 28 40 66 93 99 127 167 180 178 173 177 183 184 180 182 184 184 187 184 181 181 182 169 46 17 15 14 16 21 28 40 46 51 58 60 58 59 26 17 21 27 40 41 27 26 28 29 36 45 44 43 48 53 59 60 61 60 61 63 63 62 61 63 67 76 204 208 207 206 205 206 207 207 208 206 206 208 207 207 204 205 204 203 202 203 200 199 198 199 197 99 59 56 54 55 53 52 50 51 51 50 51 47 49 50 51 51 50 49 48 48 48 49 48 51 51 51 52 53 53 52 52 50 53 55 63 116 166 214 236 245 239 221 40 20 15 16 22 21 21 24 33 37 43 42 41 40 37 34 33 32 32 31 33 33 34 33 32 32 32 30 31 30 30 30 31 30 32 33 30 34 50 25 18 24 35 45 34 25 23 25 32 43 49 42 38 40 43 51 57 58 58 60 59 58 57 57 55 55 55 63 67 68 71 73 73 72 76 71 68 69 69 67 70 65 64 67 65 61 60 59 62 59 60 57 58 59 58 58 58 58 58 59 57 56 58 58 56 56 56 58 58 58 58 56 56 56 56 56 57 56 54 55 54 51 49 49 49 44 46 45 47 48 48 43 39 49 88 48 37 34 33 34 35 36 37 36 35 32 32 32 32 31 32 32 33 33 32 31 33 32 32 33 34 33 32 31 32 30 32 30 32 33 33 31 33 33 34 36 35 35 32 32 33 32 33 32 33 35 38 39 37 39 38 40 54 93 124 107 87 78 75 71 71 71 71 70 70 71 73 74 78 79 78 81 83 89 86 89 87 85 90 98 102 95 96 103 105 103 107 110 124 134 150 160 161 161 166 168 168 167 162 161 154 147 134 121 102 85 73 62 46 37 36 37 35 33 40 42 44 45 42 42 42 39 38 39 37 37 38 40 39 40 39 38 37 37 36 40 38 37 39 40 40 42 40 38 38 36 36 35 33 31 32 33 32 30 31 30 31 30 30 31 31 33 31 33 34 34 35 34 34 33 33 32 37 38 41 40 40 39 36 36 34 36 38 38 40 41 41 42 40 42 41 38 35 33 52 51 51 51 50 49 48 47 50 49 50 50 50 50 49 49 49 48 47 49 49 50 49 49 49 45 45 46 46 45 45 46 46 45 45 47 49 46 84 90 46 33 30 27 25 26 31 46 84 92 100 132 175 183 184 183 184 180 182 181 183 184 183 182 179 180 178 173 56 19 16 14 16 22 29 39 44 49 56 59 59 60 26 19 20 25 39 42 27 26 28 27 35 50 46 44 46 53 60 58 56 58 59 62 62 62 62 62 69 71 192 208 208 206 207 206 208 205 205 205 207 206 206 205 206 205 206 205 204 204 203 203 203 200 201 116 57 56 56 55 52 51 51 51 52 52 52 49 48 50 51 50 50 50 49 49 48 47 49 49 51 51 52 52 52 54 54 51 50 53 54 93 165 174 191 194 184 166 30 21 15 17 23 21 20 23 32 36 42 42 43 41 37 34 34 32 34 32 32 33 34 32 31 31 30 29 32 31 30 30 31 30 32 32 31 58 57 26 19 22 35 50 36 24 23 25 30 38 49 45 40 41 45 51 57 59 59 62 59 57 56 55 56 56 54 64 69 84 89 86 79 78 77 76 76 74 71 70 73 70 69 69 70 69 66 66 68 69 68 66 66 66 61 62 63 64 61 62 61 56 56 57 56 56 55 56 56 56 56 57 55 55 57 57 57 57 54 52 54 52 51 49 46 44 45 46 48 48 47 48 42 40 68 75 36 36 35 36 34 35 41 41 34 32 33 33 34 33 33 32 33 33 33 33 32 33 32 31 31 34 34 32 32 31 32 31 31 33 32 31 31 32 33 34 34 35 32 32 32 33 34 32 33 35 38 39 38 38 41 48 69 61 48 43 45 46 44 42 41 41 43 43 43 43 44 46 44 45 47 46 49 51 50 48 48 50 52 52 57 56 52 50 51 57 51 48 52 50 45 48 50 52 53 56 65 72 84 91 107 116 132 148 154 158 164 168 172 170 170 164 155 143 131 118 106 94 85 78 66 61 56 51 48 47 43 43 45 43 43 44 43 43 45 44 44 43 44 45 44 46 46 45 43 42 40 38 37 35 32 31 31 31 31 31 30 29 30 31 33 33 31 34 34 33 32 32 33 32 33 34 36 40 40 41 40 39 38 36 36 36 38 40 41 41 41 42 40 40 39 37 38 36 53 52 51 51 50 50 49 49 50 49 49 49 51 52 48 49 49 50 48 49 48 48 47 46 48 46 47 47 45 44 47 45 46 45 45 45 47 49 67 96 67 34 31 28 24 27 28 37 75 90 92 99 151 183 183 181 180 179 180 182 182 184 181 184 183 185 186 178 62 18 16 14 16 22 27 38 45 48 56 61 57 60 30 19 19 23 38 40 25 26 27 27 33 49 49 44 45 51 62 63 60 59 58 58 59 60 62 63 67 65 176 211 199 196 205 206 208 184 169 199 205 206 205 205 204 206 206 207 206 206 204 205 202 202 204 132 55 58 56 55 53 52 51 52 52 51 51 50 49 50 49 50 51 50 50 50 48 49 50 50 50 51 52 52 50 52 51 49 52 54 55 72 179 225 229 228 230 214 35 21 16 17 23 22 22 26 35 37 41 43 43 40 37 34 35 34 34 33 34 33 33 32 32 30 30 30 30 31 31 31 31 32 32 32 30 76 58 24 19 22 35 50 36 24 23 22 28 36 47 49 43 43 46 51 57 59 59 61 60 59 56 57 57 56 57 62 69 129 180 166 153 143 124 115 104 92 81 79 78 76 73 70 69 72 71 73 71 74 73 71 70 70 69 66 69 66 64 62 60 55 54 55 56 55 54 56 55 55 56 56 54 55 56 55 56 56 57 55 56 54 53 51 47 46 44 46 47 48 48 50 44 39 54 90 35 36 36 36 36 35 40 43 35 33 33 33 34 33 31 32 33 33 33 32 33 35 34 32 31 33 33 31 31 32 31 31 32 32 33 33 32 34 33 35 36 37 35 33 34 34 33 33 35 36 37 37 38 39 44 49 48 38 30 31 38 40 38 39 41 41 41 43 40 41 42 43 43 41 41 41 42 46 46 45 44 49 50 50 50 53 52 53 54 53 49 47 44 43 42 43 43 42 41 45 47 49 49 45 45 46 48 54 58 63 69 72 79 89 99 106 120 131 151 166 172 178 185 185 181 175 167 160 145 133 117 103 88 77 67 60 56 53 50 51 52 53 55 56 56 56 55 53 51 50 45 41 39 38 34 33 33 32 32 32 32 29 30 32 32 34 34 34 34 33 32 33 33 33 35 35 37 39 40 41 40 40 39 37 36 37 40 41 41 41 42 42 39 40 41 39 38 37 54 55 53 51 50 48 50 48 48 49 50 49 51 50 48 49 49 48 50 50 47 47 47 45 45 47 48 45 42 44 44 45 47 44 43 45 47 49 56 80 87 48 32 30 26 27 27 33 60 90 88 89 104 142 176 178 182 180 179 182 178 181 186 188 188 187 180 181 70 19 16 14 14 20 23 34 45 50 55 60 56 62 30 18 18 22 36 41 27 26 27 28 33 46 52 46 46 50 60 62 62 61 58 57 58 58 59 62 63 65 157 216 193 184 181 198 184 211 163 205 191 194 197 198 199 198 203 203 195 166 179 171 185 203 206 150 53 57 56 55 53 51 50 50 50 51 52 51 49 51 49 50 49 49 48 49 49 51 51 49 49 52 52 52 50 50 50 50 50 52 58 58 146 241 241 242 246 218 34 20 16 15 21 21 22 28 36 38 39 43 44 42 35 33 34 33 33 33 33 33 33 32 32 32 32 31 31 31 31 31 30 31 32 32 33 38 53 25 18 21 36 51 38 25 22 23 27 35 45 51 46 45 46 50 57 59 57 59 59 60 56 56 54 56 59 62 68 126 212 205 206 205 206 207 204 200 193 189 181 171 160 154 147 141 131 128 119 117 115 114 108 108 104 103 102 98 69 62 63 55 52 54 52 54 54 56 55 55 55 56 55 56 55 55 57 56 55 55 56 54 53 49 49 46 45 45 45 47 48 46 45 42 46 82 62 32 38 36 37 36 36 38 35 33 33 33 34 33 32 32 34 33 32 32 32 34 33 32 33 33 30 32 32 33 32 31 33 32 31 32 33 32 33 35 38 38 36 35 33 32 32 31 33 36 39 38 38 38 40 39 30 29 35 37 41 41 39 39 42 43 43 43 42 43 41 44 44 44 43 44 44 47 47 49 49 53 52 51 50 50 51 53 51 52 52 50 47 47 48 46 43 44 43 43 45 44 43 44 44 43 44 42 41 40 41 43 42 42 45 47 50 52 53 55 64 69 73 81 96 113 138 158 168 185 209 207 209 213 217 212 204 198 185 173 161 150 136 126 115 103 93 84 75 65 58 54 46 40 38 34 33 32 31 30 31 32 29 30 31 33 35 33 33 31 31 33 31 33 35 34 36 40 40 42 42 41 41 38 38 39 40 40 40 42 42 42 41 41 40 39 39 36 53 53 53 52 51 49 50 49 47 47 49 48 48 49 48 47 49 47 49 47 48 49 48 46 47 47 47 45 43 43 44 46 46 44 43 43 46 47 49 64 92 68 35 30 27 29 29 29 48 81 93 90 94 106 149 173 181 181 182 181 180 182 183 182 183 183 176 175 87 20 16 15 14 20 24 35 43 49 53 60 55 61 29 17 19 23 36 45 28 24 27 28 34 46 57 46 48 50 61 62 63 64 60 59 59 59 60 60 62 65 145 213 205 204 187 186 186 206 167 213 174 177 188 178 183 182 186 185 204 169 162 179 156 204 207 161 54 56 56 56 54 52 52 50 49 50 51 50 49 50 51 51 49 51 48 47 50 50 48 49 49 52 51 53 51 50 50 50 49 51 57 58 110 225 245 246 245 202 27 19 14 15 20 20 23 30 36 38 38 41 44 44 37 33 34 33 32 34 33 35 35 34 32 32 33 31 30 30 32 32 31 31 33 33 34 37 50 25 19 23 35 52 40 25 23 25 27 35 42 50 47 47 47 51 59 59 56 57 58 58 60 58 58 58 57 64 69 114 213 205 207 206 206 206 206 206 206 206 205 203 204 202 204 202 201 200 200 199 197 195 195 192 190 189 190 177 74 63 63 56 52 52 52 53 54 56 57 57 54 56 56 56 56 58 56 56 56 54 54 54 53 51 49 47 48 45 44 47 47 47 46 41 42 63 86 37 35 37 36 36 36 36 33 33 33 33 34 33 32 33 34 34 33 33 33 34 34 33 33 33 32 34 34 33 33 33 33 33 33 31 31 32 35 36 39 39 39 35 34 34 33 32 35 37 39 38 38 38 39 31 27 32 38 40 41 41 38 37 41 40 40 42 43 45 43 42 44 44 43 44 46 49 50 50 52 53 53 51 50 51 53 54 52 53 52 53 51 50 50 49 49 49 47 47 47 46 47 48 46 46 46 47 44 44 44 44 44 43 45 44 46 45 48 49 51 52 53 52 50 53 56 64 72 85 109 107 112 131 158 181 203 228 245 247 247 245 243 239 232 225 211 194 171 143 106 79 52 47 40 36 34 33 32 32 31 32 30 30 31 31 35 35 34 31 32 32 32 32 32 33 35 40 41 42 42 41 41 42 39 40 41 40 39 42 42 42 40 40 41 39 38 37 51 51 51 51 51 52 49 49 49 49 48 49 49 50 48 49 48 49 48 46 46 45 46 45 47 47 45 44 44 45 47 45 44 44 44 43 44 45 47 52 87 89 45 29 28 30 32 31 37 61 91 90 90 92 106 126 163 179 184 187 186 185 176 173 172 172 170 178 106 22 17 16 15 19 27 34 41 48 55 61 56 62 34 17 20 21 35 43 29 23 25 27 33 44 56 49 46 48 58 63 63 61 61 62 62 61 62 60 60 67 123 211 207 207 210 208 205 206 203 209 203 203 187 187 186 195 193 183 197 142 181 148 175 205 204 180 52 55 56 56 54 52 52 51 50 51 50 50 50 51 48 47 49 49 49 47 48 49 49 48 50 51 51 51 51 49 51 50 50 50 54 56 72 167 221 200 168 116 25 18 16 14 21 19 22 29 34 37 36 41 45 42 36 34 34 33 34 34 34 34 34 33 32 31 31 30 30 30 31 33 32 32 33 34 34 36 48 25 20 21 35 51 43 26 22 24 25 33 39 48 52 49 47 52 59 61 58 60 58 59 61 62 60 59 58 67 79 103 215 191 197 183 198 207 207 207 206 206 206 205 203 204 204 204 205 204 204 202 203 201 203 202 202 202 203 199 71 67 67 59 51 52 53 53 55 56 55 57 58 58 59 57 57 58 58 56 56 56 54 54 55 53 52 48 47 46 47 47 47 48 51 45 37 50 91 47 38 37 36 34 35 36 33 32 33 33 33 34 33 32 34 33 32 32 33 34 31 32 32 34 33 34 35 35 33 32 32 34 34 34 32 34 33 36 37 39 38 34 33 34 33 33 34 36 38 38 38 40 35 25 27 32 38 39 40 39 37 35 39 39 40 41 42 46 47 44 45 45 43 46 48 50 52 52 51 51 52 50 50 51 53 54 52 51 51 51 51 51 52 52 52 51 50 50 50 49 49 49 48 48 49 49 51 50 49 52 50 49 49 50 49 48 51 51 52 52 51 50 47 49 49 51 48 46 47 48 50 52 56 55 65 75 93 110 143 167 191 214 230 241 251 254 254 254 241 214 162 107 57 40 37 34 34 32 31 31 31 30 32 32 34 37 35 34 31 32 31 32 32 32 35 37 38 43 42 42 42 41 40 41 41 40 39 40 41 40 41 42 41 40 39 37 52 51 53 53 50 50 50 49 49 48 47 48 49 51 49 49 50 49 47 47 47 45 46 44 46 47 46 46 45 46 46 46 46 45 45 45 43 41 48 50 70 91 66 31 29 32 34 33 33 47 84 91 88 89 94 97 117 140 165 181 189 191 186 182 178 176 169 160 101 23 17 15 18 19 34 40 39 47 54 60 56 59 38 18 17 20 32 41 30 25 26 26 34 40 53 50 44 48 56 63 62 61 62 63 61 60 61 61 61 68 110 207 208 208 207 208 207 208 207 207 207 207 206 206 205 207 202 201 205 193 195 188 190 202 202 191 57 56 57 55 54 52 51 50 49 50 50 49 48 50 49 48 48 49 49 48 49 48 49 47 49 49 51 51 50 47 51 51 50 51 52 53 60 118 163 145 138 111 24 16 15 15 21 20 24 29 33 33 40 42 45 43 36 35 34 34 34 34 35 34 34 33 32 31 31 30 30 31 31 32 31 32 32 33 35 37 45 25 19 22 33 48 43 25 20 23 27 35 38 47 55 51 47 52 59 61 62 61 61 62 61 61 61 60 60 62 75 92 213 179 195 188 196 206 205 206 205 206 205 206 203 190 190 198 198 205 204 202 204 204 202 204 204 203 203 204 78 74 72 59 52 54 53 53 53 54 55 56 58 60 60 60 57 59 59 58 57 56 56 54 53 53 52 50 49 50 49 49 49 49 49 46 38 46 83 60 40 36 36 36 35 36 34 32 32 33 34 34 33 32 34 35 33 33 34 33 33 33 33 33 32 34 34 35 34 32 33 35 34 35 34 34 35 36 38 39 39 35 33 34 34 33 33 34 36 38 39 42 35 25 25 29 35 39 37 36 35 34 37 38 39 42 44 47 47 48 46 47 46 47 50 51 51 51 51 51 50 49 49 50 52 53 52 51 50 51 51 51 52 51 51 50 50 51 50 50 49 51 50 48 49 49 50 49 51 51 49 48 49 49 50 50 52 53 52 51 52 50 47 50 49 50 47 46 45 44 45 44 45 46 46 48 52 51 54 62 75 91 110 128 151 179 215 235 245 247 226 203 159 94 37 38 35 34 32 29 31 30 31 32 32 35 34 33 33 32 32 32 33 34 34 36 39 41 41 42 42 41 39 42 40 41 39 41 41 42 42 43 42 41 39 38 52 51 51 52 51 49 50 49 49 47 48 49 48 48 47 49 49 47 47 48 47 46 45 45 47 47 46 46 44 43 43 46 45 45 45 44 44 44 43 47 57 83 86 45 33 37 38 36 34 37 67 93 91 88 91 90 93 100 108 118 124 117 112 108 101 100 99 100 82 32 19 18 20 20 32 39 36 46 55 57 55 58 41 17 17 20 30 38 30 24 25 26 30 42 51 53 45 46 56 62 62 61 61 63 63 62 61 60 63 66 95 201 206 207 207 206 208 207 208 207 207 207 207 205 206 206 206 206 205 207 204 205 204 204 206 199 64 67 59 53 53 52 51 50 49 50 50 49 49 50 50 50 49 48 49 49 49 48 46 46 47 48 51 51 51 48 49 50 51 50 48 51 58 85 125 137 140 104 23 18 13 14 19 20 25 30 31 32 40 43 46 43 36 35 33 34 31 32 33 33 34 33 33 33 32 31 32 32 32 31 31 31 31 35 36 38 49 24 20 21 33 47 40 24 21 23 29 35 38 46 57 55 48 52 60 60 63 64 65 65 65 63 61 61 59 61 74 82 204 188 176 200 182 181 183 188 193 196 191 194 201 169 174 190 194 202 201 199 203 203 202 192 169 190 198 207 93 67 66 57 54 54 54 53 54 54 54 55 57 59 58 58 57 58 60 59 55 55 56 55 54 54 52 50 49 50 51 51 50 48 47 45 41 45 73 86 36 38 38 35 35 35 36 34 33 34 34 33 33 33 35 36 35 35 35 33 33 32 33 33 33 34 33 32 33 32 34 34 34 35 35 33 35 35 38 40 40 37 33 35 35 33 33 33 36 38 40 43 34 24 25 30 39 40 36 34 32 32 36 37 38 42 45 47 48 49 46 46 48 46 47 47 51 51 51 50 50 49 48 49 50 52 51 50 51 52 52 51 52 50 50 50 51 53 51 50 51 51 50 49 52 53 52 51 54 52 52 51 52 51 52 51 52 53 51 48 48 46 46 48 49 50 49 47 47 48 47 45 44 43 45 45 45 45 46 46 49 51 55 56 61 63 73 72 79 90 104 123 153 176 123 53 36 34 31 31 29 31 31 32 33 34 35 33 32 33 30 32 32 33 34 36 40 42 41 40 41 39 39 39 39 40 39 40 41 41 41 41 42 42 40 37 53 53 53 53 52 51 51 49 48 48 49 50 48 49 50 50 48 49 47 48 47 45 47 46 48 48 47 45 47 45 42 45 45 45 45 45 45 44 41 45 53 73 91 66 34 38 42 42 37 38 53 86 95 92 92 90 87 90 93 97 103 104 104 105 97 98 99 100 86 37 22 22 24 23 26 32 35 43 53 56 54 56 43 18 18 20 30 40 29 24 24 25 32 42 52 53 45 46 56 63 63 62 61 62 61 61 60 60 62 66 86 194 207 206 207 207 207 206 206 206 208 206 206 206 206 205 205 205 206 206 204 205 205 204 203 203 77 86 57 53 54 52 52 50 51 49 50 50 48 47 47 48 49 48 48 49 49 49 47 47 47 48 51 52 51 49 49 51 50 51 50 50 55 70 126 150 138 103 22 15 13 15 20 20 23 31 31 34 40 43 48 45 38 36 34 34 34 34 34 33 33 32 33 32 33 31 32 33 32 32 33 33 31 34 36 35 51 22 19 21 34 47 39 24 21 23 30 36 38 44 55 55 49 52 60 62 64 65 64 64 65 65 61 62 60 59 72 75 195 193 187 198 172 191 178 190 178 183 176 170 184 172 174 178 200 189 184 180 193 184 185 187 158 192 202 209 104 63 66 57 53 55 53 52 54 56 55 56 58 59 58 57 57 58 58 58 55 54 54 55 55 55 52 52 51 50 50 51 50 48 48 47 43 42 60 104 32 37 37 37 36 34 34 33 32 34 34 33 34 33 35 35 35 36 36 33 35 35 34 34 33 34 32 31 33 33 34 35 36 37 36 34 35 36 38 39 40 38 33 34 34 33 35 35 36 36 41 45 36 24 25 31 39 41 36 33 31 31 35 36 38 39 44 48 50 49 48 49 50 49 48 49 51 49 51 50 50 50 49 49 49 51 51 51 51 50 50 50 51 50 50 52 52 53 53 52 51 51 51 51 53 54 53 54 56 53 53 51 51 51 51 51 50 51 50 48 48 48 47 46 49 50 49 49 48 48 48 47 47 47 48 48 49 48 47 48 49 48 48 49 49 51 54 56 55 53 52 55 71 92 133 116 43 34 32 32 30 31 31 32 33 35 35 35 33 31 29 30 32 33 32 36 39 42 41 40 40 39 38 38 39 39 40 40 43 42 43 42 42 41 39 37 53 53 53 52 49 50 51 50 47 48 50 50 48 48 49 50 49 49 46 48 47 47 47 48 48 47 46 47 47 46 43 44 45 44 45 45 45 43 42 44 49 57 89 84 43 42 47 46 45 42 42 66 101 95 93 91 87 87 88 88 92 97 99 98 94 93 97 101 92 44 29 27 29 27 32 36 39 46 55 55 50 56 44 17 18 20 29 40 31 26 26 26 32 41 50 54 48 47 56 62 62 60 59 60 61 60 61 61 61 65 82 147 177 187 195 201 204 206 207 208 208 208 207 206 206 206 206 207 206 206 204 204 204 205 203 212 98 106 57 53 54 52 51 50 50 49 49 48 47 46 47 47 46 47 48 48 49 46 47 45 47 49 51 52 51 50 49 48 50 50 48 48 53 54 115 163 179 123 20 17 14 14 20 18 22 30 31 31 37 43 47 43 38 37 34 34 33 34 36 34 34 33 32 31 30 32 32 33 32 32 34 34 33 31 34 37 52 23 18 20 34 48 39 24 22 22 28 36 42 43 52 58 52 54 60 63 65 65 65 64 64 64 61 62 61 59 74 69 181 211 208 201 177 180 189 200 190 181 187 178 188 180 174 192 191 182 176 179 186 170 186 193 161 197 197 212 113 61 66 61 55 54 58 54 54 54 53 54 56 57 57 57 55 58 57 57 56 54 55 54 56 56 53 53 52 51 51 49 51 48 47 47 46 40 52 105 47 38 36 37 35 34 32 32 32 33 33 33 34 34 35 35 34 34 34 34 33 32 33 32 31 35 31 31 33 33 33 34 37 36 36 35 34 35 38 39 42 39 34 34 34 34 35 36 36 36 39 48 35 21 26 32 38 41 36 32 30 33 37 39 40 40 44 48 51 51 51 52 52 51 50 51 52 49 51 49 50 51 50 50 51 50 52 51 51 49 49 49 49 49 51 51 51 51 52 51 51 52 53 52 50 53 53 54 53 51 51 51 51 52 52 50 52 51 52 49 47 47 48 49 50 50 48 47 47 47 47 49 48 49 51 47 49 49 49 50 51 50 49 50 52 49 49 47 47 45 44 43 42 45 54 91 91 42 32 32 31 30 30 31 33 34 35 34 33 31 31 29 34 34 34 36 39 40 41 40 39 38 38 38 40 40 39 42 43 43 41 42 43 42 40 37 53 54 52 52 50 49 50 49 50 49 52 50 48 49 50 48 50 50 47 48 47 47 48 48 47 47 45 47 47 46 45 45 45 45 45 45 45 45 43 44 46 47 83 92 63 42 48 48 47 45 41 45 92 102 97 91 87 86 91 90 91 94 94 98 95 98 106 106 103 50 38 38 39 39 45 48 42 45 58 55 50 52 43 18 18 20 26 38 31 24 26 26 30 42 48 57 49 47 58 64 62 61 60 62 62 61 60 59 61 63 69 74 90 98 108 116 138 154 167 183 191 197 203 207 208 208 208 209 205 205 204 204 204 203 205 212 109 124 61 53 52 52 50 50 50 48 50 47 46 46 45 46 46 47 47 47 47 48 48 45 46 48 49 51 51 48 48 48 50 51 44 47 48 52 94 166 190 119 21 14 12 14 19 19 22 29 29 31 37 41 47 45 40 37 37 35 34 35 36 36 36 35 33 32 30 31 30 32 32 34 33 33 34 33 35 39 50 22 17 19 35 47 38 24 23 23 26 34 41 43 51 58 54 56 60 62 64 65 64 64 63 62 62 62 60 58 70 68 171 211 207 208 198 200 205 208 207 205 205 206 204 203 198 199 197 199 198 196 195 194 195 194 182 195 195 210 127 61 65 60 57 55 58 57 55 55 56 56 55 56 58 59 57 59 58 58 56 53 54 54 54 55 55 54 54 53 51 51 52 50 46 47 48 44 46 85 75 36 37 36 34 33 34 33 33 34 33 32 34 34 36 35 35 34 32 31 34 34 33 32 32 33 32 32 33 32 33 34 36 35 35 35 36 37 39 41 40 37 33 33 33 34 35 36 37 36 38 46 37 21 26 32 39 39 34 33 32 34 37 40 40 40 42 46 52 52 53 56 52 51 49 49 51 50 50 48 48 49 49 51 57 55 56 55 55 53 51 52 50 51 53 51 51 52 52 52 51 50 53 52 53 52 54 54 54 54 53 53 51 53 54 53 53 54 53 51 51 49 49 49 50 49 49 48 47 49 47 51 49 51 52 50 49 48 44 46 49 49 49 49 50 50 49 47 47 44 43 42 42 40 40 55 84 63 34 33 31 31 29 31 32 34 35 35 32 31 31 32 34 34 34 36 39 41 41 41 40 37 39 37 37 40 41 42 43 43 41 42 45 43 39 36 53 53 52 52 52 50 50 49 50 51 49 49 50 49 50 51 48 47 47 47 47 49 47 45 44 45 44 45 46 45 46 44 43 44 44 44 45 46 45 42 45 45 66 93 80 57 50 51 48 45 40 41 63 96 106 95 90 87 93 91 96 97 99 105 113 114 116 113 99 63 53 52 52 54 55 56 50 48 64 54 49 50 49 20 20 20 25 38 32 24 25 25 31 43 45 54 54 51 58 61 62 62 60 61 60 60 61 59 59 61 67 68 71 75 73 67 69 69 68 74 77 79 89 99 114 128 144 150 160 169 173 177 182 185 190 196 109 97 79 51 53 51 50 51 50 51 50 49 47 45 45 46 46 46 44 46 49 51 46 45 45 47 49 50 50 48 48 48 51 50 47 48 47 51 69 118 143 96 21 13 14 16 26 26 24 28 30 32 37 42 46 44 39 38 36 33 35 34 35 36 35 34 33 32 32 31 30 32 33 33 33 34 34 34 36 40 49 21 19 21 32 44 38 23 22 22 28 36 42 44 50 57 55 58 61 62 64 63 64 65 65 63 61 61 60 57 68 72 157 211 210 209 208 208 208 208 207 208 207 208 207 206 207 206 206 206 207 208 206 206 206 205 205 205 205 209 143 65 62 60 55 55 55 55 55 56 57 55 56 58 58 57 57 57 56 55 56 55 55 54 54 54 53 52 52 53 52 52 49 49 48 47 48 45 44 61 100 40 36 34 34 33 32 34 35 33 33 33 35 35 36 36 36 35 33 32 34 32 32 32 31 31 31 32 31 31 33 34 35 35 34 34 36 37 38 40 40 39 37 34 34 33 35 36 37 36 40 48 37 22 24 32 40 41 34 34 33 34 37 40 41 41 43 45 50 51 54 55 54 50 52 49 52 51 51 49 50 50 50 51 58 61 62 62 61 61 62 61 61 60 60 61 60 59 55 56 56 54 55 55 54 55 58 58 56 57 59 57 57 57 58 58 57 55 53 50 51 51 48 49 52 49 48 48 49 50 49 50 51 50 49 47 46 46 46 45 47 49 49 50 50 48 47 46 46 46 46 43 42 42 39 40 58 77 45 34 32 30 30 31 31 35 36 36 34 33 32 33 32 32 33 35 38 40 42 42 41 37 38 38 38 40 42 42 42 40 41 42 43 43 40 38 49 52 51 52 51 51 49 50 49 49 47 48 51 50 49 48 49 47 47 48 49 49 46 46 45 44 45 47 48 44 44 44 45 45 45 44 44 45 44 43 42 45 54 83 90 72 51 50 48 44 38 39 46 67 98 105 99 96 98 100 103 109 111 119 122 117 119 104 78 72 71 68 62 62 60 59 56 50 65 60 48 50 51 23 17 18 23 36 32 24 26 26 30 41 47 57 55 52 58 59 63 61 61 61 60 61 61 60 60 60 62 62 68 74 72 67 70 67 68 70 70 68 67 66 67 66 69 72 77 78 79 80 84 89 94 96 78 105 73 51 53 51 50 51 50 49 49 49 46 45 44 44 46 44 44 45 45 47 47 46 46 48 50 51 51 51 48 47 48 49 46 46 46 50 60 108 130 88 23 15 15 16 29 37 26 30 32 33 38 45 44 43 41 38 36 36 35 35 36 35 34 32 33 31 33 32 32 33 33 34 33 33 35 36 36 40 52 23 19 21 33 43 38 24 24 23 30 37 43 45 48 55 57 58 61 61 63 62 63 63 65 63 63 60 59 61 68 73 148 211 208 209 209 210 209 208 208 207 209 207 209 208 208 208 208 207 208 206 208 206 206 206 205 205 205 209 151 66 63 60 57 57 57 56 56 55 57 56 56 58 57 56 55 57 58 55 55 56 54 54 55 54 53 53 54 54 53 50 48 48 48 46 47 48 44 50 107 48 37 37 35 32 33 32 33 33 33 34 35 35 34 34 34 34 34 33 31 32 32 31 31 31 31 32 31 32 33 33 34 34 33 34 35 36 38 40 41 38 36 34 33 33 35 37 38 38 41 50 34 22 26 33 42 39 33 34 32 33 35 38 40 42 43 44 48 49 52 53 53 53 53 52 52 51 52 52 49 50 51 52 59 63 65 67 69 68 68 68 68 66 68 70 67 66 60 60 64 64 62 61 60 62 66 65 66 66 65 63 65 65 64 64 63 58 54 52 51 50 48 48 49 48 48 47 49 50 50 50 51 51 48 46 46 49 48 48 49 49 48 50 47 47 46 45 45 45 44 44 41 40 39 35 38 63 68 36 30 32 30 30 31 34 37 37 35 33 32 32 30 30 32 34 39 41 42 40 41 41 40 40 39 40 43 42 40 41 43 44 44 44 41 38 53 55 53 53 53 52 54 50 51 52 48 50 51 50 49 51 49 49 48 48 47 48 47 47 45 45 45 44 45 45 45 45 44 42 43 44 42 45 43 42 41 41 48 60 94 89 54 50 45 39 37 45 59 66 71 91 105 106 118 117 116 117 126 136 136 131 137 99 91 127 108 84 66 60 61 62 60 55 64 72 49 52 53 23 19 19 23 36 33 26 25 25 31 39 46 54 58 53 62 62 62 61 61 61 60 59 60 60 58 58 59 57 61 61 61 65 67 64 63 66 64 65 66 66 64 65 64 65 64 65 63 64 64 64 63 63 60 74 59 53 49 49 51 49 48 47 47 49 48 45 44 45 47 44 45 45 46 47 48 45 45 44 48 50 50 52 51 48 49 50 46 43 45 48 55 93 115 80 20 18 16 20 26 34 28 29 30 30 38 47 43 41 41 40 37 36 37 37 36 34 34 33 33 32 33 33 32 33 33 32 31 33 34 36 36 39 51 22 18 20 31 43 35 25 24 25 28 36 43 43 47 55 58 60 62 60 63 62 63 63 63 62 60 60 61 61 69 70 132 208 208 196 201 203 209 207 199 170 179 208 208 207 208 208 209 207 208 207 207 203 201 205 201 204 205 206 161 70 65 61 56 55 57 56 55 55 55 55 57 56 58 56 55 58 58 57 56 56 55 54 54 54 54 54 54 51 52 51 48 47 47 46 48 50 42 49 98 62 34 35 33 34 34 34 36 35 34 33 35 35 34 34 34 35 35 34 32 34 33 32 32 32 32 31 31 32 33 32 32 32 32 34 35 35 36 39 41 40 36 36 32 34 35 36 37 38 42 48 31 21 25 31 39 38 32 33 32 33 34 36 39 41 44 45 49 50 52 54 53 54 52 52 52 52 51 50 49 49 51 54 61 87 114 107 104 96 87 83 80 78 76 84 76 72 66 70 72 73 70 67 68 69 70 72 71 71 72 70 69 70 69 66 69 63 55 53 52 49 48 47 48 48 47 46 49 50 50 51 51 50 47 46 46 46 46 47 47 48 51 49 49 48 45 46 47 45 44 44 41 40 39 36 32 41 74 44 32 31 30 31 31 34 36 37 35 33 31 30 30 33 34 34 36 39 41 41 42 42 40 40 39 39 41 39 40 41 41 42 43 43 41 38 53 54 54 53 52 53 54 52 53 52 51 51 48 49 49 50 48 49 48 48 48 48 47 46 44 45 45 45 46 45 44 43 42 43 43 41 43 42 43 42 40 38 45 51 85 92 68 49 37 40 52 64 72 76 76 73 78 87 101 104 144 180 209 223 222 203 160 113 150 225 192 122 62 54 54 60 61 56 67 79 58 56 55 23 19 19 22 33 32 26 25 27 31 38 45 51 58 55 62 63 63 62 61 61 61 60 59 59 59 59 58 56 58 59 55 55 55 57 58 59 62 64 62 63 64 65 62 62 62 62 62 62 63 62 62 62 62 59 61 55 49 49 49 49 51 48 50 48 46 44 44 45 46 45 46 45 45 47 47 47 46 44 48 51 51 51 52 50 49 49 46 43 41 47 49 74 116 76 22 20 20 21 27 32 35 30 28 31 38 46 43 41 42 44 39 37 38 37 35 33 34 34 33 32 33 33 32 33 33 33 33 32 34 34 35 38 48 20 18 20 30 43 35 24 22 26 31 38 45 44 47 56 58 59 60 60 63 62 65 65 63 61 59 61 62 62 67 71 122 210 210 180 187 185 205 183 212 174 176 206 189 197 198 204 203 204 204 205 206 170 162 198 158 188 206 207 171 75 64 66 56 54 55 54 54 54 54 54 57 56 56 58 58 59 58 57 57 57 56 53 54 54 56 55 52 53 54 52 49 47 45 44 46 49 43 48 82 85 32 32 31 35 35 35 34 33 34 33 35 36 35 35 36 35 34 34 31 32 33 33 33 32 33 32 31 31 32 32 31 31 32 34 36 37 37 39 40 41 37 37 33 34 35 37 37 38 44 47 30 20 23 30 38 38 32 33 32 32 35 35 38 41 43 45 49 50 52 56 54 53 54 51 53 53 52 50 51 49 50 54 62 106 181 193 185 179 170 162 151 142 126 117 113 103 96 92 89 92 91 89 83 85 85 86 81 80 85 86 80 80 81 77 77 71 58 55 52 50 51 51 48 46 46 47 49 50 48 50 51 50 47 47 46 45 45 47 48 48 48 48 49 47 44 44 44 47 45 43 40 39 38 36 31 35 62 56 33 31 30 31 31 33 38 38 36 33 30 30 31 32 32 33 36 39 42 41 41 42 41 42 41 41 40 40 41 42 41 42 42 42 41 39 56 53 53 53 53 53 53 53 52 53 50 51 49 50 49 49 48 46 47 47 47 47 47 46 46 46 45 45 46 43 44 42 42 41 42 43 43 42 41 42 40 35 36 47 69 90 85 53 56 65 73 77 84 85 82 68 51 51 55 81 156 192 227 240 235 216 171 135 194 248 253 169 65 43 41 41 47 56 92 92 82 57 51 24 17 21 22 32 31 25 25 26 31 40 47 53 61 60 62 62 64 63 62 61 61 59 59 60 60 58 58 58 58 58 56 56 55 57 56 57 57 55 57 58 57 58 58 58 59 58 59 61 61 61 60 65 69 72 66 54 50 50 50 49 49 49 49 49 48 45 43 44 45 44 46 46 46 46 48 49 45 46 47 49 51 51 51 49 49 48 47 43 41 43 49 53 113 78 25 29 30 35 43 44 40 32 29 35 40 41 41 41 44 45 40 40 39 37 34 33 35 34 32 33 32 31 30 32 33 32 33 33 33 33 33 37 52 22 17 18 31 43 34 24 22 23 29 37 44 44 47 57 59 60 61 60 60 61 63 64 61 59 62 63 63 63 63 73 108 206 207 202 202 188 194 179 206 166 209 205 173 177 188 173 181 182 183 184 201 198 157 180 131 170 208 206 181 87 69 63 56 56 56 55 55 54 54 55 57 57 55 57 59 57 56 56 57 56 55 55 55 53 55 54 52 52 53 55 52 48 46 44 45 48 45 45 62 112 27 34 34 34 34 34 34 35 35 34 36 37 36 36 37 36 34 34 33 31 33 31 33 32 34 33 32 30 31 32 31 32 33 33 34 36 37 38 40 40 38 37 34 34 36 34 37 39 44 47 27 21 24 32 41 38 30 32 33 33 35 35 38 40 40 42 46 49 52 54 53 55 54 53 51 53 52 51 50 50 53 55 62 105 182 204 202 203 204 205 206 206 206 207 205 203 199 195 195 189 180 177 170 166 162 159 153 151 147 145 140 140 141 138 139 98 58 59 52 51 52 52 52 49 47 47 48 48 47 49 51 49 48 47 46 45 47 48 46 45 47 47 48 46 46 46 46 45 45 42 41 42 39 42 36 34 49 66 32 31 32 33 32 34 39 38 36 34 33 32 30 31 33 35 36 39 41 41 41 41 40 42 42 42 40 40 41 41 41 43 44 44 41 39 55 53 52 51 52 53 53 53 52 52 51 50 51 51 50 49 49 49 49 48 48 47 46 46 46 45 45 45 45 44 44 42 42 43 42 42 42 43 42 43 42 37 30 39 56 88 92 78 76 82 86 79 67 59 51 46 55 65 76 89 114 155 233 249 239 203 176 147 184 246 254 179 74 49 41 40 74 104 127 118 100 62 51 24 19 19 21 33 33 24 24 24 30 38 46 52 60 62 62 62 63 63 62 62 60 59 58 59 59 58 57 58 58 57 56 56 56 56 57 57 57 55 56 56 56 56 56 56 56 56 56 57 58 57 56 59 60 60 60 54 50 50 49 49 49 48 48 49 48 45 45 45 45 45 46 47 46 44 45 48 45 46 48 49 51 50 50 49 47 47 47 45 39 43 48 48 101 88 33 43 48 55 60 57 50 38 30 39 45 41 39 39 46 48 44 43 39 38 32 32 33 33 31 32 31 32 31 33 34 33 33 33 33 34 33 36 49 22 18 18 31 42 35 24 23 24 29 37 45 45 47 56 58 60 62 63 61 62 63 62 61 63 63 65 65 64 66 70 97 202 209 210 208 209 208 208 207 198 210 208 203 201 193 191 187 196 193 184 199 170 144 183 154 166 209 206 188 98 80 69 59 59 56 57 56 56 55 57 57 57 57 56 57 57 57 58 59 56 56 56 54 52 54 55 52 51 52 52 50 49 45 43 45 46 46 43 53 119 41 35 34 34 34 34 35 35 35 35 37 38 36 37 37 37 35 34 32 31 32 32 32 31 33 32 34 32 33 34 33 34 34 32 33 35 36 37 40 40 39 36 33 34 37 36 38 38 43 45 27 21 23 32 42 38 29 31 33 35 35 36 37 40 40 41 46 51 52 52 54 55 54 51 53 53 52 53 52 52 55 55 60 106 186 206 203 203 202 205 205 205 206 205 204 204 204 205 205 204 202 204 202 201 203 204 206 203 202 204 201 200 200 201 199 126 56 59 54 51 51 51 52 50 47 46 49 48 48 49 49 48 50 49 47 45 46 47 46 46 46 44 44 46 45 45 45 46 44 43 43 42 41 42 37 33 42 68 35 31 32 33 34 36 39 38 36 36 34 33 32 33 34 33 36 39 41 41 40 41 41 40 41 40 41 40 41 42 41 43 45 45 41 39 57 55 54 55 55 54 52 53 52 52 52 50 52 51 50 49 49 50 48 47 49 46 45 46 44 44 45 45 46 47 45 43 42 42 42 42 43 41 42 43 44 40 30 30 45 74 94 90 81 72 59 56 62 70 92 116 129 134 145 145 149 152 174 211 242 249 212 154 155 235 253 190 126 119 100 111 118 121 125 135 120 80 56 25 18 20 22 33 34 24 24 25 30 38 47 52 61 62 63 61 62 63 62 61 60 59 59 60 60 61 59 58 58 56 56 56 55 54 57 56 56 55 56 57 56 55 56 55 54 54 54 54 55 56 55 54 53 52 53 51 50 49 50 49 50 49 46 47 48 46 44 43 46 47 47 46 46 44 46 47 46 46 48 48 50 51 50 49 47 47 48 45 39 40 45 47 75 104 45 60 66 69 67 61 52 43 33 41 56 46 39 41 50 50 42 40 37 37 35 34 33 34 33 34 33 34 34 35 36 35 34 34 34 33 31 35 51 21 18 19 30 42 33 23 23 25 30 38 46 47 50 56 60 59 62 63 64 62 60 61 65 64 64 64 65 64 65 69 94 193 209 209 209 210 210 209 209 208 208 206 208 208 208 209 207 209 209 207 208 206 203 205 205 203 206 206 191 93 75 71 58 59 60 60 57 57 57 58 57 60 57 56 57 58 58 57 58 56 55 55 52 52 54 53 53 52 52 51 50 49 46 46 44 43 47 41 46 94 78 30 34 32 33 31 33 34 35 36 37 36 36 37 38 37 35 32 34 34 32 32 32 32 32 32 34 33 32 32 32 30 30 32 34 35 35 35 38 39 40 38 35 36 37 36 37 39 44 51 26 20 24 31 40 35 28 28 33 34 36 36 40 41 42 43 46 52 54 54 54 55 55 53 52 52 51 54 54 52 53 54 62 114 205 209 186 195 181 180 208 205 207 205 205 205 206 205 204 204 204 203 204 203 205 203 204 204 207 206 204 203 203 203 205 135 58 59 54 53 52 50 51 52 49 48 49 49 49 48 48 48 49 47 48 47 46 47 49 49 47 44 45 46 46 46 45 44 43 42 40 41 39 40 37 32 37 59 46 31 32 31 34 35 38 37 37 36 34 34 34 35 35 33 37 39 39 41 40 41 42 42 42 41 41 42 42 42 42 42 44 43 42 41 56 54 54 55 55 54 53 53 52 52 54 53 51 51 51 49 49 49 48 47 49 47 47 47 45 44 45 45 46 46 45 45 42 43 41 41 43 42 44 45 44 40 33 26 39 56 91 90 71 66 76 87 107 117 128 137 158 168 173 162 155 151 147 161 175 214 248 212 153 222 253 196 161 185 124 120 121 121 142 157 120 93 62 25 20 19 22 31 34 25 25 26 31 38 46 51 61 62 62 62 64 64 63 61 59 58 58 60 59 60 58 59 59 57 57 56 54 54 55 54 56 55 55 55 56 57 56 55 55 53 53 53 53 55 55 53 54 53 52 52 52 49 49 51 49 48 49 48 46 46 43 43 45 46 47 45 47 46 47 46 46 46 47 48 51 51 51 49 47 48 49 44 37 35 42 46 62 105 67 65 66 71 68 62 57 48 37 42 63 55 41 43 53 49 40 35 37 37 37 39 37 37 36 36 36 37 39 41 38 36 35 35 33 34 34 39 49 22 18 18 29 43 31 23 22 24 30 39 46 47 51 54 59 59 62 64 62 58 61 63 66 63 65 64 66 65 63 68 95 188 210 210 210 210 210 211 211 210 209 209 207 209 208 209 209 208 208 209 209 209 208 209 207 207 208 208 197 95 65 64 60 59 61 61 60 58 57 58 59 60 58 58 58 58 57 58 58 57 58 56 55 54 53 52 51 51 51 51 50 50 45 44 43 43 45 43 47 68 107 36 35 33 33 33 34 34 35 35 36 36 36 38 38 37 35 33 33 34 33 32 33 33 31 32 33 32 32 32 32 32 32 33 33 33 34 35 37 39 40 37 36 36 36 36 37 40 46 53 22 20 24 32 39 33 28 28 32 34 37 37 40 40 42 43 47 50 52 53 53 54 55 54 53 54 52 55 54 52 54 56 60 111 211 208 174 191 189 183 205 206 206 207 205 205 206 205 206 190 188 195 194 205 205 203 205 204 205 204 202 200 201 205 208 141 57 58 55 54 51 49 51 52 51 49 49 49 50 48 50 49 48 46 50 49 47 48 50 49 47 45 47 46 46 45 45 44 44 42 41 41 40 39 38 33 38 53 54 33 32 33 36 37 37 38 38 38 34 33 35 36 35 35 35 36 41 40 41 42 42 42 42 42 41 42 42 42 43 42 42 42 42 41 56 55 55 54 56 55 55 54 53 52 51 50 51 49 49 51 47 46 50 48 48 48 46 47 46 43 44 45 46 45 45 45 42 41 41 40 40 43 41 41 43 42 34 27 30 46 76 90 93 111 122 129 134 151 169 180 196 187 180 164 149 151 149 147 154 151 178 223 199 214 250 211 164 180 116 124 128 125 176 145 101 97 64 28 18 18 22 28 34 25 26 26 30 37 47 50 62 62 63 64 61 61 61 61 60 59 58 60 59 58 58 59 59 58 58 56 55 54 56 55 55 56 56 56 56 56 55 55 54 54 54 53 55 56 54 52 51 52 52 51 51 48 49 49 48 48 48 48 47 45 43 45 46 45 47 45 46 44 45 44 46 46 45 46 49 50 51 49 47 48 47 46 36 30 34 42 53 93 91 61 63 68 70 66 63 63 51 50 69 70 47 48 48 41 36 36 34 36 38 42 43 42 41 40 42 42 42 40 37 35 36 36 35 34 37 43 48 20 17 17 29 40 31 23 25 25 31 39 45 47 49 54 61 61 61 63 61 59 64 65 65 65 64 64 65 64 65 69 88 182 211 209 207 209 209 208 209 209 208 208 209 208 208 207 207 210 209 210 208 207 207 207 207 206 205 206 203 100 66 62 60 59 59 59 59 59 57 59 59 58 59 58 57 56 56 56 59 58 59 55 55 55 52 53 52 51 49 52 51 50 43 41 40 43 44 46 42 47 118 47 35 33 33 35 35 36 37 36 36 37 37 37 36 36 34 33 32 34 34 33 33 33 32 31 32 33 33 34 33 32 32 32 33 32 34 36 37 38 39 37 34 35 36 37 40 41 45 51 21 20 24 33 39 33 28 28 31 33 37 39 39 40 41 43 46 51 53 53 53 55 54 54 54 55 53 54 54 54 54 55 57 105 212 208 176 175 195 177 179 173 181 185 188 190 191 199 201 164 178 184 195 203 203 199 200 202 203 200 194 168 197 189 208 150 55 60 55 55 51 50 52 52 52 48 49 50 52 50 50 49 49 48 47 48 46 47 48 49 48 47 47 46 46 46 45 43 43 43 42 41 41 38 40 36 36 46 60 36 33 34 34 35 37 39 40 38 34 32 34 36 35 36 37 34 39 41 41 43 41 42 42 42 42 43 43 42 42 42 43 43 42 41 57 55 56 54 55 55 56 54 54 53 51 51 51 50 50 50 49 47 49 48 47 48 46 46 45 44 43 43 44 43 45 45 43 42 42 41 41 41 42 44 46 45 38 29 26 38 63 88 92 113 140 178 207 212 212 170 154 144 142 145 145 142 142 142 146 153 167 152 192 228 232 192 177 175 113 124 132 139 162 104 72 102 67 32 20 19 21 27 37 27 28 27 31 39 48 51 61 64 63 62 63 61 62 61 60 59 59 59 60 59 58 59 58 59 58 57 56 56 55 54 54 54 56 55 56 54 54 54 53 55 53 54 55 53 53 51 53 51 52 51 49 49 50 49 49 49 48 48 47 46 44 45 47 46 47 46 46 47 47 46 46 45 45 46 51 50 49 49 48 48 48 48 39 29 30 38 49 75 106 61 50 57 70 69 69 66 80 87 82 83 58 47 42 37 35 35 34 35 36 41 46 47 46 45 45 44 42 41 37 35 36 36 34 34 35 40 50 20 17 16 29 42 29 22 23 25 32 42 48 46 48 54 59 63 61 62 63 62 64 68 69 66 64 67 68 67 64 67 81 168 212 210 210 210 209 209 208 208 208 208 207 207 207 207 208 208 208 208 209 208 208 207 206 206 208 206 204 108 63 62 58 57 58 59 58 56 58 59 59 57 58 58 58 57 58 57 59 60 59 56 53 56 53 51 53 51 50 51 50 50 45 43 40 40 42 44 44 46 109 61 36 35 36 35 36 36 37 36 36 37 37 37 36 37 34 34 33 34 35 34 35 34 32 31 33 32 33 32 33 34 32 32 34 33 34 38 38 39 40 37 35 37 37 37 42 43 46 47 20 21 25 36 39 31 26 27 30 35 38 41 41 43 42 44 46 49 53 52 52 55 53 55 54 54 53 54 52 53 54 54 59 98 212 208 183 188 195 169 185 178 181 177 178 176 183 166 184 170 171 176 194 197 187 178 186 192 193 181 191 163 195 201 209 155 52 58 56 54 52 50 52 53 52 48 51 51 52 52 51 51 49 48 48 49 47 46 48 49 48 49 45 47 46 46 43 41 43 44 42 41 39 37 41 39 34 41 66 38 32 33 35 37 40 40 40 39 34 32 33 35 35 34 35 35 39 40 42 42 41 42 42 42 43 42 41 41 40 42 44 44 42 40 57 52 54 54 55 54 55 55 55 53 50 51 51 52 51 48 49 48 49 50 48 47 46 47 47 44 43 43 44 44 44 42 40 41 40 41 40 40 42 43 45 46 40 31 23 29 52 77 88 114 235 247 239 218 163 135 154 149 148 148 148 143 137 137 145 149 165 162 146 214 243 186 177 171 111 125 131 145 115 79 58 90 84 32 17 18 19 25 35 27 25 25 30 37 47 51 61 64 62 62 62 61 62 61 61 59 56 58 60 60 58 58 58 58 58 57 56 54 54 56 53 55 55 55 55 54 55 56 54 53 53 52 52 53 54 52 52 51 52 51 49 49 51 49 50 49 47 49 45 46 43 43 45 46 45 45 44 45 47 46 45 44 44 46 49 49 48 49 48 49 46 45 41 29 26 33 46 57 107 68 32 37 47 66 97 157 226 215 107 100 70 45 37 34 34 33 36 34 36 44 49 49 49 50 45 42 39 36 34 34 33 31 31 32 31 37 52 20 16 18 26 41 31 25 23 27 35 43 48 48 49 55 61 62 62 62 65 65 65 67 65 66 64 66 67 66 64 67 74 84 100 114 138 151 162 173 182 185 193 196 200 202 204 206 207 207 207 207 207 208 207 206 206 205 204 204 207 117 58 62 56 56 58 58 57 56 56 59 60 57 56 56 59 58 59 59 61 59 56 54 54 56 55 55 52 51 49 50 51 50 46 43 40 38 41 46 45 48 87 90 34 38 35 35 36 38 38 36 36 37 37 37 36 37 36 34 31 33 35 34 31 34 32 32 32 33 33 33 34 33 33 32 33 32 35 39 39 38 37 36 37 39 38 38 42 44 49 46 21 21 25 34 39 29 26 25 29 34 38 41 41 43 42 46 47 50 53 54 53 53 54 54 55 54 53 53 51 53 54 56 55 86 211 208 206 204 199 174 181 182 190 183 187 177 189 172 186 180 168 183 197 183 173 171 185 187 171 169 191 163 205 200 207 170 53 58 54 54 52 52 52 53 49 49 50 51 50 50 51 50 51 49 48 49 49 46 49 48 47 46 46 46 47 47 45 43 44 44 42 40 40 38 39 41 37 43 63 45 34 34 35 36 38 38 39 40 36 34 33 34 33 33 35 35 38 41 41 41 40 40 42 43 42 43 42 43 41 42 44 43 44 42 56 55 54 54 56 55 55 56 55 53 52 52 52 52 50 48 48 50 49 48 49 47 47 47 45 43 43 43 43 45 43 42 40 39 39 39 40 40 40 43 45 44 40 33 25 24 45 64 90 90 215 220 188 175 153 133 141 149 151 147 148 145 144 144 151 153 144 173 142 195 248 206 170 164 113 128 134 143 113 81 61 57 89 34 18 17 18 23 37 27 25 25 30 38 47 52 60 62 63 61 62 61 62 60 61 59 57 59 58 59 59 57 59 57 58 57 57 54 52 55 55 55 55 55 55 54 56 55 54 53 53 53 52 52 53 52 51 51 50 50 50 50 49 49 49 49 49 48 46 47 45 44 45 46 46 44 44 46 46 45 45 43 44 46 50 50 48 46 48 48 45 46 41 30 22 28 42 51 99 93 37 38 54 128 210 236 239 240 149 105 76 52 38 35 34 32 35 34 38 46 54 54 53 51 45 39 35 33 32 32 33 32 30 31 30 40 49 21 17 18 26 40 30 28 28 29 36 43 48 50 53 57 62 64 62 62 65 65 65 64 65 67 67 66 68 68 66 68 72 70 69 70 77 79 82 90 101 106 106 107 109 119 132 141 151 161 169 177 187 190 194 194 198 200 203 205 206 123 58 60 58 57 56 57 56 55 56 58 59 60 56 58 59 58 60 60 59 57 57 55 57 58 55 55 55 53 51 50 51 49 45 44 41 37 36 42 45 45 74 114 30 39 38 39 39 39 38 36 37 38 38 37 36 35 36 34 33 34 34 33 32 34 33 33 32 33 34 33 34 34 33 32 32 31 35 38 38 38 38 38 38 38 37 38 42 42 48 42 22 22 25 33 36 28 24 25 30 34 39 41 43 43 43 44 47 50 52 54 55 53 52 54 54 54 53 53 51 53 55 53 56 79 210 208 208 208 207 193 199 199 202 203 203 203 206 205 203 199 192 199 196 196 198 191 190 190 183 183 189 176 201 188 211 179 54 57 55 55 53 52 52 53 50 51 50 49 50 50 52 52 50 49 46 47 50 48 48 48 47 46 46 45 47 46 44 43 44 43 41 39 40 39 39 40 38 42 61 48 34 32 33 37 40 39 39 39 36 34 33 34 33 33 35 36 39 39 40 40 42 42 43 44 43 42 42 43 41 42 43 44 43 41 56 54 54 56 56 55 55 55 56 54 53 52 50 51 49 49 48 50 49 48 50 48 47 47 47 46 44 43 43 44 42 41 40 39 38 38 39 40 40 41 44 42 40 37 26 24 33 51 84 87 116 156 160 162 156 153 136 136 145 143 144 146 147 149 159 142 130 161 170 205 212 230 186 159 111 126 134 145 110 84 62 34 80 37 18 19 19 22 36 26 24 26 33 40 48 52 60 61 62 62 62 62 62 62 61 58 58 59 58 58 58 59 59 58 57 57 57 55 56 53 53 54 53 53 54 55 54 55 55 54 55 54 51 52 53 53 51 51 52 52 48 50 49 50 48 49 47 46 47 47 46 44 44 46 47 46 47 48 46 45 46 43 44 46 50 49 50 48 48 46 46 47 43 33 22 24 35 47 77 107 88 97 129 158 170 163 137 120 85 85 79 75 48 38 36 34 34 36 39 43 55 56 55 49 39 35 34 31 32 32 31 31 30 29 30 42 46 21 17 18 28 41 29 24 25 28 35 46 50 51 54 57 63 65 64 64 66 65 65 63 64 66 66 67 68 67 66 68 73 70 67 70 70 72 70 71 73 72 76 71 67 66 71 68 63 66 71 80 94 92 91 87 90 94 97 101 105 82 59 59 59 58 56 57 56 56 57 57 59 58 56 58 59 58 61 60 60 58 58 57 58 57 55 56 56 54 51 51 49 47 47 44 41 36 33 37 42 42 58 123 51 44 43 42 42 40 37 37 38 38 37 37 38 36 36 37 36 34 37 38 35 36 34 35 33 32 34 36 35 35 34 34 33 33 34 34 36 38 40 39 38 39 38 37 41 41 48 36 21 20 27 34 35 28 24 25 29 33 38 41 43 43 45 45 46 50 53 54 55 53 53 54 53 53 53 53 53 52 55 55 60 74 204 209 208 208 207 205 205 204 203 204 206 204 207 206 207 209 205 205 207 204 204 205 208 209 206 205 207 207 207 206 210 184 59 60 55 54 52 50 50 52 52 50 50 49 49 50 51 50 48 49 47 49 49 50 48 50 47 47 46 45 46 44 42 43 42 41 41 41 39 39 40 41 38 40 53 51 35 33 34 37 40 40 39 40 38 34 34 34 36 34 35 34 36 39 40 42 43 44 43 44 44 44 42 42 44 43 44 44 44 42 55 55 56 55 55 57 55 52 53 55 53 52 50 51 52 50 50 50 50 49 49 48 47 47 47 46 44 42 42 43 39 40 41 40 37 38 38 40 39 39 42 42 42 40 30 24 26 44 71 87 95 142 156 156 158 158 153 138 119 130 144 143 146 146 156 133 112 148 176 147 194 188 170 150 112 127 136 137 103 105 52 39 84 38 18 19 20 23 36 27 25 27 33 40 49 51 61 61 63 64 63 61 61 61 59 59 59 58 57 58 58 58 58 59 56 57 57 54 55 53 55 54 54 55 55 54 54 55 53 53 53 52 53 54 54 54 53 52 52 51 50 50 51 51 49 48 46 48 49 46 46 45 44 46 46 47 46 46 47 46 46 45 44 46 50 49 48 47 48 47 48 47 44 35 22 21 29 45 63 107 120 130 130 132 134 136 102 69 44 52 74 87 69 48 37 36 36 37 39 43 57 59 54 46 37 34 33 31 31 32 31 30 29 30 30 40 51 19 17 18 28 39 27 20 20 25 34 45 50 51 53 56 62 62 63 63 65 65 65 65 65 66 66 67 67 67 67 67 68 69 68 68 69 70 68 69 72 74 71 69 65 64 67 68 65 64 66 69 77 73 71 70 73 76 80 84 84 72 60 60 60 58 58 58 59 58 58 56 57 58 58 60 59 58 60 58 59 58 57 57 58 57 56 57 58 55 52 51 50 47 48 45 40 39 32 34 42 44 51 109 79 43 45 43 41 41 39 38 38 38 38 37 39 38 36 39 38 37 38 38 38 40 38 39 37 36 36 38 37 38 36 34 35 34 34 35 37 38 40 40 39 39 38 40 42 41 51 35 21 22 27 36 34 27 24 25 28 33 38 42 42 42 44 44 46 49 52 54 53 53 55 54 54 54 54 53 54 52 53 54 59 79 191 208 210 208 207 206 206 207 206 208 210 207 208 208 209 209 207 207 208 209 207 205 208 208 207 205 205 205 204 205 209 184 63 60 56 55 53 51 50 51 51 50 51 50 47 48 49 49 49 48 46 48 48 50 48 48 46 47 46 44 46 44 41 43 41 40 41 41 39 38 39 41 39 39 51 59 33 33 34 36 39 40 40 41 38 35 35 34 35 33 33 34 36 37 39 42 43 44 44 44 44 44 42 41 43 42 42 43 44 42 56 56 55 54 56 57 54 52 54 55 53 53 50 50 50 51 49 49 48 48 48 48 47 47 47 47 45 43 41 41 40 40 41 39 39 39 38 39 38 41 42 43 42 41 34 24 21 33 58 82 90 112 157 154 156 154 156 157 139 125 138 142 147 144 153 124 107 144 179 123 172 163 161 150 116 127 135 142 115 130 37 56 111 37 20 19 19 23 35 27 24 27 33 38 47 50 61 63 65 63 62 61 61 61 62 61 58 58 57 57 58 57 58 56 56 56 56 53 55 54 53 54 54 53 52 52 53 53 53 53 52 51 53 53 53 52 52 52 52 52 52 50 50 49 48 48 49 48 48 48 45 43 45 46 45 44 43 44 45 45 45 44 43 44 48 49 46 46 48 48 48 47 42 36 23 21 25 37 55 93 118 127 131 141 188 160 98 85 68 44 53 69 81 73 52 43 40 39 41 49 58 58 52 41 35 34 31 30 28 30 31 29 29 30 30 39 51 20 15 16 28 37 25 20 21 25 35 47 53 53 55 56 62 63 64 65 65 66 66 67 65 63 64 64 64 66 66 66 67 65 64 63 65 65 67 66 66 68 68 65 63 64 65 63 64 65 66 66 69 67 64 64 67 74 75 70 71 81 59 60 57 58 59 60 60 58 58 58 58 58 58 59 59 60 59 59 57 58 58 56 57 56 56 56 57 55 54 54 50 50 48 44 41 38 32 31 40 41 46 81 112 44 42 42 42 40 38 38 37 37 39 38 38 36 36 38 38 37 38 37 38 40 42 41 40 41 39 41 39 41 39 40 40 39 40 39 40 41 41 40 39 41 42 41 44 39 49 33 19 20 26 36 33 27 23 25 27 32 38 42 43 42 43 44 47 48 52 54 53 55 55 54 53 53 53 54 52 52 52 55 59 88 180 210 210 209 204 205 207 206 207 207 180 177 202 209 208 209 209 210 209 209 209 207 208 207 207 206 206 205 206 206 210 191 63 58 55 52 52 51 51 50 49 48 51 50 49 48 48 48 49 48 48 47 48 50 48 48 46 45 45 45 46 45 42 42 42 42 40 40 38 38 40 41 40 37 48 58 37 35 33 34 38 38 39 40 39 37 34 34 33 33 32 34 36 36 37 40 43 44 43 44 45 43 44 43 44 44 43 45 44 41 56 55 55 55 56 57 54 54 55 53 54 54 52 51 50 50 50 49 48 47 47 48 47 46 47 47 47 43 41 40 40 41 41 41 41 39 39 38 39 41 40 42 41 42 36 25 21 25 52 76 91 92 145 153 154 156 158 159 156 149 142 136 149 146 151 120 104 146 171 127 147 169 143 166 120 129 132 144 113 112 32 79 116 39 19 19 19 21 33 26 24 25 33 40 49 51 61 63 63 63 62 62 61 62 63 60 58 58 58 58 58 58 58 56 56 57 55 53 54 54 53 54 53 52 54 54 52 54 53 53 53 53 52 52 52 51 51 51 52 52 52 51 50 50 50 49 50 49 48 47 45 43 45 46 46 46 45 45 43 43 45 43 43 44 46 47 48 45 46 48 49 48 43 38 25 22 23 31 49 80 117 126 128 161 156 94 75 72 82 64 45 50 70 83 72 56 44 42 53 60 57 56 46 39 32 32 31 29 28 30 29 28 28 28 31 40 52 19 16 16 28 37 24 21 22 25 35 45 53 53 55 57 62 62 64 64 66 66 65 68 63 62 62 65 64 65 66 65 65 63 60 58 58 60 60 60 60 62 63 63 63 62 62 63 63 61 63 64 66 65 63 64 65 69 69 65 69 78 60 59 58 58 59 59 60 58 58 60 59 59 60 59 60 60 59 59 58 58 59 58 57 57 57 58 56 55 53 53 50 51 48 45 43 39 32 30 37 43 49 63 126 52 42 38 39 37 38 39 37 38 39 38 37 37 36 37 36 35 36 36 36 38 38 39 40 39 39 41 39 40 41 44 45 44 41 41 42 43 42 42 42 43 45 41 41 40 49 32 22 22 28 36 32 26 22 24 26 31 38 42 43 44 45 45 47 49 51 53 53 54 55 55 52 54 53 54 51 53 51 56 61 77 190 211 211 208 179 191 201 210 199 210 177 136 202 207 207 208 208 208 207 210 209 209 207 204 179 195 198 183 203 207 211 197 68 57 55 53 52 52 51 51 50 49 50 50 49 49 49 49 47 47 46 47 48 51 49 48 47 44 44 44 44 44 45 42 42 42 41 41 40 40 39 40 40 34 45 57 42 35 34 36 38 39 39 40 39 36 33 34 34 34 34 34 35 37 37 40 42 42 44 44 45 44 42 43 44 45 45 46 44 43 56 54 57 57 55 55 55 54 53 53 53 52 52 52 50 51 49 49 48 48 49 47 48 48 46 45 45 43 41 39 38 39 41 42 41 39 39 38 39 41 42 42 43 44 39 29 23 23 37 58 86 87 114 151 152 157 157 156 154 152 150 136 129 136 146 116 109 147 147 144 142 158 137 159 136 131 124 129 114 90 35 98 117 43 19 20 21 20 31 27 25 25 33 38 46 50 62 62 63 62 63 63 61 61 61 60 58 58 58 58 57 58 58 57 56 55 56 56 53 53 53 53 51 52 54 53 52 52 52 52 52 51 52 52 54 52 53 54 51 51 52 51 49 49 49 50 49 48 48 48 46 44 45 46 46 46 43 42 41 42 44 43 42 42 44 46 47 45 47 48 48 48 44 39 26 20 22 27 42 58 112 121 128 124 97 75 79 76 90 94 52 41 42 58 75 72 56 58 66 65 58 55 41 37 33 32 30 31 31 29 30 29 29 28 28 40 49 19 15 15 27 37 24 21 21 24 36 45 52 51 57 58 61 63 65 65 66 63 66 66 62 62 65 65 64 65 65 65 62 62 59 56 55 56 56 55 56 59 58 59 58 57 55 57 54 56 59 57 57 59 58 58 59 59 58 60 61 60 60 60 58 60 59 57 58 58 58 57 58 60 60 59 59 58 58 58 58 57 58 56 57 58 58 59 58 57 55 54 51 50 49 46 42 39 30 27 32 40 44 50 128 70 40 39 37 35 36 37 38 39 39 38 38 38 36 36 34 34 33 34 34 35 34 34 35 35 36 37 37 37 40 42 44 43 44 44 44 43 43 42 42 46 50 46 43 40 51 31 21 20 27 36 28 22 20 24 29 32 38 41 44 44 43 46 46 46 51 53 54 53 53 54 54 54 53 52 51 52 53 55 59 66 188 210 209 207 185 192 182 200 167 204 188 171 212 177 174 178 184 182 186 183 192 191 201 199 165 152 151 138 185 207 211 199 74 57 56 54 53 53 51 51 49 49 48 49 49 48 49 49 46 47 46 47 48 49 48 48 47 46 44 44 45 45 44 43 43 41 41 39 38 37 38 38 38 36 41 53 50 36 34 35 36 39 40 40 39 38 34 32 32 33 33 35 35 37 37 39 39 40 44 43 44 45 46 44 43 45 44 44 44 44 57 55 57 58 56 55 55 55 53 53 53 53 51 51 51 52 53 52 50 50 48 46 48 47 45 45 46 44 42 40 39 40 40 41 40 38 39 39 40 39 42 42 43 43 41 34 25 21 29 47 75 85 92 141 152 155 152 153 152 154 152 149 145 137 146 116 115 145 142 166 123 146 143 132 154 137 121 119 110 83 37 101 122 45 20 20 21 20 30 27 25 25 32 40 46 53 62 62 63 62 62 63 60 61 61 60 59 57 58 59 57 57 58 56 56 55 57 56 56 54 53 55 52 54 54 52 53 52 53 53 51 51 53 53 53 52 53 53 52 51 53 52 50 49 49 50 48 48 47 48 47 43 44 46 45 45 43 42 39 41 42 43 40 40 42 43 45 44 46 46 46 47 45 41 28 22 21 22 37 49 106 122 125 120 93 79 88 82 110 105 71 51 38 42 80 73 60 62 66 67 60 53 44 38 35 32 32 31 32 31 29 30 29 29 31 41 48 20 14 14 27 37 24 22 22 26 36 44 51 51 55 59 64 64 64 63 64 65 65 65 63 64 65 63 64 66 64 65 64 64 58 56 56 56 54 54 54 56 56 59 58 59 56 53 53 55 55 54 54 56 54 55 55 55 54 57 59 60 61 60 61 61 59 59 58 56 58 60 60 61 61 61 60 57 59 59 60 60 58 58 59 58 59 58 59 57 56 54 52 49 49 47 45 41 29 25 29 36 44 49 114 93 36 36 35 35 37 38 39 38 38 40 42 39 37 34 35 34 33 34 34 32 33 33 33 33 32 33 36 36 36 37 40 42 45 44 46 44 46 46 43 47 47 47 44 42 52 28 20 20 29 35 28 22 20 24 28 32 37 43 46 46 43 47 46 49 52 55 56 55 54 55 55 56 52 52 51 51 52 53 59 63 184 210 210 209 209 208 196 197 195 205 188 192 209 186 191 186 188 178 183 183 190 194 186 206 152 178 150 156 170 210 211 200 77 56 57 54 51 52 50 51 50 51 49 48 47 48 48 50 46 46 47 49 49 48 48 47 46 44 44 44 46 46 45 44 43 41 41 39 37 36 37 36 36 35 39 47 56 35 36 34 34 37 39 39 38 37 34 33 32 31 33 36 35 38 36 39 40 42 43 43 44 44 46 47 45 46 45 46 45 45 54 55 58 57 55 56 55 55 54 56 55 54 54 52 52 51 52 51 50 51 48 48 48 46 45 46 46 45 43 40 39 39 42 42 40 38 40 40 41 39 42 43 43 43 41 38 27 22 21 37 63 79 84 116 156 155 152 153 151 151 155 155 155 155 151 117 119 144 147 176 119 131 118 111 171 139 132 115 99 77 40 99 124 47 18 20 19 20 30 27 25 27 32 39 44 53 60 62 64 63 63 63 60 62 61 59 59 59 58 57 57 57 56 56 54 56 55 56 54 55 55 54 54 53 54 53 52 52 55 53 51 53 53 52 50 50 50 51 52 49 52 51 51 50 50 50 49 47 46 47 47 43 43 43 42 42 41 40 40 41 41 44 42 42 40 41 44 44 44 45 46 46 43 42 33 23 21 22 30 46 82 119 119 121 92 103 66 88 122 119 93 71 50 36 101 158 149 79 55 61 67 67 57 49 42 39 36 34 35 33 33 32 31 33 32 43 47 18 17 16 28 36 24 21 23 27 36 44 52 53 55 60 65 64 66 67 67 65 67 68 66 67 65 64 66 67 65 64 64 63 62 56 57 55 54 55 55 54 55 55 55 55 55 54 53 55 55 55 56 58 56 56 53 52 52 56 59 60 57 60 61 59 60 59 58 59 59 57 57 57 59 61 60 58 60 58 58 59 58 58 60 57 58 59 58 57 56 53 53 50 48 47 44 42 32 26 28 32 43 50 84 126 31 35 36 34 38 39 39 41 41 40 41 41 36 36 35 34 32 31 33 32 32 32 32 31 33 33 34 35 34 35 37 39 41 45 48 48 44 42 45 47 44 44 41 44 49 25 20 20 30 35 27 21 21 23 28 33 39 42 43 46 43 44 48 48 52 55 56 55 54 56 53 54 54 53 52 52 52 55 62 62 177 212 211 212 211 211 210 210 210 210 206 210 209 208 209 207 203 201 202 204 204 198 202 206 163 175 188 163 193 210 211 204 83 57 56 54 51 52 50 49 49 50 48 48 49 48 46 47 47 47 48 48 48 47 47 47 47 47 47 46 45 45 44 43 41 41 39 37 37 37 36 36 38 34 36 45 58 39 35 33 34 34 35 37 38 36 35 35 33 31 34 35 35 37 36 39 39 40 42 44 43 45 46 46 46 47 47 46 46 45 54 56 58 58 56 55 53 54 55 55 54 54 51 51 52 52 52 51 50 50 48 48 47 46 47 47 47 45 43 42 41 42 40 41 42 40 38 40 39 40 42 43 43 44 41 40 31 23 19 29 53 73 84 99 145 153 156 157 156 155 158 158 155 156 150 110 127 144 151 165 121 135 115 113 157 147 133 114 101 70 45 91 127 47 20 21 19 19 28 26 25 27 32 38 45 54 59 61 63 62 63 63 60 61 61 59 59 59 58 57 57 57 57 55 55 57 56 56 55 53 55 54 54 53 54 54 52 53 53 51 52 53 52 52 52 50 51 51 52 51 50 52 51 51 50 50 48 46 48 48 46 44 43 42 42 41 39 40 41 43 42 43 40 40 38 39 42 44 44 48 49 47 44 43 37 23 19 21 25 39 67 114 117 115 93 113 44 99 128 129 113 88 62 49 78 209 241 190 65 49 54 45 47 51 53 52 45 44 44 43 40 42 41 40 40 49 43 18 16 16 27 35 24 22 23 28 35 43 52 53 56 60 65 66 66 66 67 66 67 67 67 67 66 66 65 66 67 66 64 63 64 59 60 57 56 56 54 51 53 52 54 53 53 54 56 58 58 56 53 56 57 57 52 51 51 58 61 60 59 60 61 59 60 58 59 57 57 56 58 58 60 60 60 60 61 59 59 59 58 60 60 57 58 59 59 57 57 56 53 51 48 48 47 44 35 27 27 31 38 45 68 139 41 35 37 36 39 43 42 44 43 42 42 41 37 35 35 35 32 32 33 31 33 33 33 30 33 34 32 32 31 33 36 35 36 38 42 44 43 44 45 45 45 43 41 45 53 26 21 22 32 35 26 21 22 24 30 35 40 40 44 47 45 46 47 51 53 54 54 54 54 55 52 53 54 55 53 54 52 55 59 62 171 213 212 214 212 212 212 212 211 211 211 211 209 208 212 211 211 209 211 210 210 211 211 211 209 209 208 209 207 209 212 205 87 57 57 54 51 50 48 48 49 50 49 48 49 48 49 46 46 47 47 48 48 48 47 46 45 44 44 44 44 43 44 45 43 42 41 39 38 38 37 37 40 38 35 46 57 41 35 33 34 32 32 35 38 38 35 35 32 31 33 33 36 38 37 39 40 41 42 44 43 44 47 47 48 49 48 46 46 45 55 57 56 56 56 56 54 56 56 55 52 52 51 53 53 52 51 49 50 52 50 49 49 48 48 47 46 46 44 43 41 42 42 41 42 40 38 40 40 41 42 41 41 43 43 42 35 25 20 19 40 58 82 90 114 149 160 163 166 164 161 161 162 160 146 101 136 139 156 153 134 149 127 115 128 144 142 112 102 78 51 80 127 51 19 21 19 20 26 25 26 29 34 41 46 54 58 61 64 63 61 61 60 61 60 60 58 57 56 56 58 59 57 57 56 55 56 56 53 53 54 54 53 53 53 54 54 55 53 51 51 51 52 52 50 50 51 51 52 51 50 52 51 51 48 48 47 46 49 47 45 43 41 39 41 37 38 39 38 40 41 41 38 39 39 41 43 43 45 46 47 46 44 42 38 26 20 20 21 30 57 102 118 111 113 91 53 122 135 137 134 119 85 63 52 151 206 201 133 55 32 27 34 68 95 88 73 63 56 54 55 59 59 57 57 60 43 19 15 16 28 35 23 20 20 25 33 40 52 54 55 59 65 65 66 66 67 66 68 69 68 67 68 67 66 66 66 66 66 66 65 63 61 59 58 56 55 55 55 53 54 54 53 54 53 53 55 54 52 53 56 56 54 53 53 55 60 62 59 59 60 60 59 59 57 56 56 56 58 57 60 60 59 59 61 61 59 59 58 59 58 58 57 58 59 58 57 56 53 52 51 48 45 44 38 29 26 30 34 41 56 124 80 41 40 41 42 47 45 45 47 46 44 43 36 34 35 35 33 34 34 32 32 32 32 33 33 33 33 33 31 32 34 33 33 33 33 37 39 42 45 45 45 46 44 50 50 26 21 21 32 35 24 22 21 23 30 34 39 40 45 46 43 44 47 50 50 52 53 55 55 54 54 55 53 54 53 53 52 53 61 59 159 213 213 213 212 213 212 211 212 212 211 211 211 211 212 211 210 210 212 212 210 211 211 211 211 211 210 208 210 210 212 206 93 57 57 53 52 52 50 50 50 50 49 48 49 47 49 48 47 46 47 48 49 50 48 46 44 44 44 45 46 44 43 43 42 42 40 37 37 36 36 36 39 37 34 42 58 45 34 33 34 34 35 34 36 35 35 34 33 33 33 33 35 37 37 39 39 39 41 43 43 44 47 47 47 47 48 47 47 45 54 55 54 54 54 56 55 56 55 55 52 53 52 53 52 52 52 51 51 50 50 49 48 49 48 46 46 46 44 44 40 41 41 42 39 41 40 40 42 41 42 42 43 43 44 43 36 27 20 20 30 47 79 86 96 142 163 163 166 162 164 165 169 169 139 101 144 144 166 146 144 159 129 108 133 136 147 106 113 91 58 79 120 55 20 20 18 18 27 27 26 30 35 41 45 53 58 60 62 63 62 61 61 62 61 60 59 58 57 56 57 58 57 57 57 56 55 57 54 54 54 56 54 53 53 54 53 53 54 54 51 49 50 50 50 50 51 51 50 50 49 50 51 50 48 48 48 47 48 46 45 43 42 41 41 40 40 39 39 39 41 41 40 40 40 41 43 42 45 46 47 44 44 43 39 30 22 20 20 26 47 88 120 115 108 69 80 138 139 143 172 161 103 83 60 66 163 185 176 147 34 27 32 41 56 79 106 122 117 100 75 61 52 48 40 52 44 18 15 16 28 35 23 20 21 25 34 43 54 54 55 60 64 65 65 65 67 67 68 70 68 66 68 68 66 67 68 66 66 67 67 65 64 61 57 56 55 56 57 57 56 56 56 57 56 55 58 58 57 55 57 56 56 55 55 53 59 59 58 59 60 60 58 57 56 57 56 56 59 58 59 58 60 60 59 61 58 60 60 59 59 59 58 57 60 57 58 57 55 54 52 50 47 45 39 30 26 27 32 41 49 99 108 48 48 47 49 50 48 47 50 52 49 44 39 38 36 38 35 36 36 35 34 32 34 35 34 34 34 35 33 34 36 33 32 32 35 36 37 41 43 44 44 47 46 51 48 24 19 23 33 34 24 21 21 24 29 34 38 40 43 46 45 45 47 50 52 53 53 53 53 55 55 56 55 55 54 53 52 55 60 66 152 211 212 211 212 213 213 212 213 213 211 212 212 211 212 211 213 212 210 211 211 212 211 212 211 212 211 209 209 211 211 208 97 57 56 54 51 51 50 51 51 50 51 50 49 49 49 47 47 47 46 48 48 47 45 47 46 46 45 45 46 46 44 44 42 41 40 37 35 36 34 34 39 38 34 41 57 49 34 34 34 34 34 36 37 36 35 33 34 33 34 34 36 35 35 37 38 39 41 42 44 42 45 45 45 47 49 48 47 48 54 55 55 56 55 56 56 55 54 55 54 52 51 52 51 51 52 52 52 49 48 49 47 48 48 47 48 46 44 45 41 40 42 43 42 42 40 41 41 41 42 42 43 41 42 43 39 32 23 19 22 40 66 88 90 112 163 167 165 166 169 168 169 173 128 105 152 154 172 141 158 148 128 100 128 144 148 101 131 125 67 78 106 61 19 19 18 18 26 28 26 30 36 41 46 53 57 58 61 60 61 62 59 61 61 60 59 57 56 57 56 57 57 56 58 58 53 54 55 55 52 53 54 53 52 53 54 54 52 52 53 51 50 49 48 49 50 51 50 48 48 48 50 49 46 47 48 47 47 46 45 43 41 40 40 40 39 39 38 39 40 42 41 40 40 40 40 41 45 46 47 47 46 45 42 33 23 19 19 21 36 60 115 115 104 50 114 164 202 220 230 229 148 108 95 70 134 215 239 221 45 32 75 107 114 119 120 127 134 135 136 140 139 135 125 99 40 18 17 17 26 35 23 22 22 26 34 43 55 57 57 59 64 66 66 68 68 68 67 68 68 68 69 66 65 66 67 68 67 68 65 64 64 62 60 58 57 57 56 58 57 58 58 57 55 57 57 57 57 56 57 57 57 58 55 50 59 59 60 60 60 61 60 59 58 56 56 56 56 57 57 57 58 59 59 60 59 60 59 60 59 57 58 58 54 55 57 57 54 53 51 50 48 46 41 30 25 25 27 35 48 71 134 66 61 57 55 57 55 52 56 55 52 48 43 41 40 39 37 37 37 38 38 37 38 38 35 37 37 35 35 37 36 35 33 31 33 35 37 40 40 42 44 46 49 51 45 24 20 23 33 32 23 19 19 23 30 34 38 41 45 47 47 46 49 50 54 55 53 54 53 53 56 56 53 54 54 54 54 54 62 69 147 208 209 209 212 212 211 210 211 211 211 210 212 212 211 210 211 210 212 212 211 211 212 212 211 212 212 211 208 210 211 211 105 56 55 53 52 52 52 51 50 51 50 50 48 47 46 48 48 46 47 48 48 46 45 47 45 46 46 46 45 44 43 45 44 42 40 39 37 35 33 32 36 38 34 41 53 60 34 34 36 35 35 36 38 38 37 35 35 32 33 36 34 33 36 38 38 38 39 41 42 45 44 44 45 47 48 49 49 50 54 55 57 57 53 55 56 56 54 55 55 54 53 53 53 53 52 51 51 50 49 50 48 48 47 47 49 47 45 46 42 41 41 42 43 44 41 39 41 42 43 43 43 43 45 45 42 37 26 22 21 31 57 86 91 99 154 171 170 169 167 168 169 174 126 110 157 164 177 133 169 142 126 111 112 148 146 103 155 188 76 71 84 56 20 19 18 18 25 29 27 31 36 40 45 52 57 58 63 61 60 61 60 62 61 60 60 58 59 58 57 57 57 56 58 56 54 54 53 54 55 55 55 54 53 54 53 52 54 54 53 52 51 51 50 50 50 49 49 49 48 48 49 49 48 46 46 45 48 47 45 43 41 40 40 41 40 39 39 41 41 42 40 39 40 41 41 40 43 43 45 46 46 45 42 36 24 20 18 18 31 50 105 116 104 49 172 232 249 249 248 249 211 136 139 143 120 126 143 129 47 47 87 111 108 113 116 119 119 122 122 127 130 133 133 103 40 18 18 18 27 36 24 23 22 25 34 43 56 58 58 61 65 66 68 68 69 69 69 69 69 67 69 66 67 68 67 68 67 67 67 66 64 63 64 61 58 56 57 59 57 59 60 58 58 60 59 58 57 58 56 56 61 60 56 52 57 58 61 61 60 60 59 58 58 56 56 57 56 57 58 58 57 59 60 59 59 59 59 59 58 57 58 58 57 57 56 56 54 54 51 50 49 46 40 32 25 23 25 32 47 55 143 85 65 63 60 61 63 61 60 57 55 54 49 46 42 41 41 39 41 44 43 41 41 42 40 42 41 37 37 39 38 35 33 33 34 35 37 39 41 42 45 45 48 52 41 22 20 23 33 29 23 20 21 25 32 35 39 41 45 47 48 47 48 50 54 55 53 51 53 53 54 54 54 55 54 55 55 54 65 70 97 140 154 166 182 192 201 205 207 209 211 210 212 213 210 210 210 210 211 210 211 210 209 211 210 210 211 212 210 211 210 212 112 54 54 54 52 52 51 51 51 51 51 50 48 49 48 48 48 46 48 48 48 47 45 46 46 48 46 44 45 44 45 45 43 41 41 41 38 35 30 29 34 36 36 38 52 64 38 38 38 38 39 38 37 38 38 36 36 33 34 35 37 36 37 39 39 39 39 41 43 44 44 45 46 48 47 50 51 50 56 56 56 55 55 55 54 54 53 55 55 55 54 52 53 52 52 51 51 51 50 49 50 48 47 48 48 48 46 44 44 42 43 42 42 43 42 39 41 43 42 43 41 40 43 44 43 38 29 22 21 22 46 72 95 95 120 160 168 173 177 180 177 174 126 112 172 164 173 129 176 137 114 123 112 145 140 106 169 235 109 71 63 51 21 19 19 19 25 30 27 33 38 40 45 54 55 56 61 61 62 62 60 60 61 60 58 58 57 57 55 53 55 55 55 54 55 54 53 54 54 54 53 53 54 55 53 54 53 52 50 51 52 51 50 49 49 50 50 48 48 49 50 49 48 45 44 45 47 47 46 44 42 41 41 40 40 39 40 41 42 42 39 38 40 41 40 40 41 43 47 46 46 46 43 37 26 20 17 17 25 44 79 114 106 58 211 248 246 249 249 249 247 209 133 135 154 162 158 151 129 122 104 94 84 78 73 66 63 61 61 60 61 64 65 70 37 22 17 19 26 34 23 21 21 26 35 44 56 57 59 62 65 66 66 66 66 65 68 69 68 69 66 65 67 68 67 67 68 68 66 66 65 66 62 61 60 60 60 61 61 62 61 62 61 60 59 58 56 59 58 56 60 61 59 55 54 57 60 61 61 61 60 58 57 56 55 56 57 56 58 59 59 60 58 58 59 60 61 60 58 56 57 58 57 55 56 57 53 52 51 51 50 49 42 33 24 23 24 28 44 49 128 112 64 67 63 63 66 64 61 61 60 61 59 58 54 52 49 49 52 54 51 50 50 50 49 49 46 42 42 41 41 40 38 38 38 41 43 42 43 43 45 43 46 54 36 21 19 23 34 29 21 20 23 28 33 35 39 40 44 46 48 47 48 49 51 54 53 51 53 53 54 53 52 53 54 56 55 54 60 64 64 60 60 62 66 68 80 94 105 112 126 136 141 144 156 163 172 174 179 185 183 187 190 192 194 196 198 199 198 198 199 201 115 54 55 53 52 52 51 51 51 51 49 48 49 47 48 47 47 47 47 48 49 47 48 47 48 47 45 46 45 46 44 44 42 42 41 40 38 36 31 29 32 35 35 36 50 74 39 40 41 40 39 40 39 40 40 39 37 36 36 36 37 35 36 38 39 40 40 41 42 43 43 45 46 46 46 49 51 51 55 56 56 56 56 56 55 54 54 55 55 55 54 55 54 54 53 52 52 51 50 50 49 50 49 49 48 48 47 45 45 45 43 43 44 43 43 42 41 42 43 45 43 41 43 44 42 37 33 24 19 19 36 56 91 96 101 138 177 188 195 198 203 185 127 116 199 170 166 131 177 132 107 132 129 150 137 106 184 249 155 77 63 51 23 20 20 18 26 31 24 33 38 39 45 53 54 57 61 63 62 62 60 59 59 59 59 57 58 57 54 53 55 56 55 55 55 55 55 55 55 54 55 55 54 54 53 52 54 53 52 51 52 52 52 49 48 50 49 49 49 50 48 47 47 47 45 46 46 46 47 45 42 42 41 41 40 41 40 40 41 41 40 40 41 40 40 42 42 43 47 46 46 45 43 40 30 19 18 18 22 40 65 107 111 73 212 247 247 248 249 248 249 238 156 115 119 129 151 153 156 157 156 154 151 152 151 146 141 138 132 128 119 114 106 87 37 19 19 19 26 33 22 19 22 26 34 44 57 58 61 64 67 67 66 67 67 68 68 70 68 67 65 66 67 67 68 67 68 65 66 66 64 65 65 63 63 64 62 62 60 64 62 62 61 60 61 62 59 60 59 56 58 60 59 58 53 56 59 62 61 59 59 58 57 58 57 55 58 57 58 59 59 59 59 58 59 61 62 58 60 58 57 58 57 57 57 55 52 51 52 51 49 49 43 36 25 24 24 26 40 51 105 136 66 71 67 66 68 66 64 63 60 62 66 65 63 61 59 56 63 59 56 58 61 59 60 61 57 51 49 49 47 47 44 45 43 46 47 47 50 49 49 47 48 53 32 20 19 24 35 30 21 21 22 27 34 36 38 40 45 48 49 47 50 50 52 52 54 52 53 53 55 53 53 52 54 55 53 54 54 61 62 62 62 64 62 62 66 64 62 61 65 70 69 69 73 82 89 92 93 94 91 91 94 98 105 109 113 112 112 111 112 117 86 55 55 54 51 51 52 53 51 51 49 48 48 47 47 47 48 49 46 47 48 47 48 46 47 47 45 45 45 44 45 45 43 42 42 40 38 34 30 29 31 33 36 35 48 74 46 41 41 42 41 41 41 41 40 40 38 37 38 35 35 34 35 37 37 38 37 39 39 42 42 44 44 45 45 46 47 49 55 55 56 54 57 56 56 53 56 56 56 57 55 56 54 54 53 52 50 52 52 51 50 49 49 48 48 48 47 47 45 44 45 45 43 42 42 44 43 42 42 43 43 41 42 42 41 38 36 28 21 20 26 43 72 97 95 122 241 247 249 250 249 194 127 118 212 168 160 138 176 131 105 138 143 152 125 109 196 250 208 93 73 55 24 21 20 19 27 30 27 35 38 39 44 53 53 56 59 62 61 62 61 60 60 60 58 57 56 56 55 55 56 55 54 54 55 55 56 55 53 55 54 53 54 54 54 53 52 53 53 51 52 51 51 50 49 49 48 48 51 48 49 50 48 46 46 46 45 45 47 46 43 42 42 40 40 40 39 38 41 41 42 40 40 40 41 41 41 43 45 44 45 45 41 41 36 24 22 20 20 27 53 94 119 94 197 247 247 249 244 234 197 160 143 140 130 133 125 111 122 125 122 120 123 124 125 126 128 129 132 133 140 141 141 102 35 20 16 18 26 31 22 21 23 28 36 44 55 58 61 65 65 66 65 66 68 66 68 68 67 68 66 68 65 67 67 68 68 65 67 66 63 65 65 64 64 63 63 62 59 60 62 62 62 60 61 62 61 61 61 58 57 57 59 60 54 56 58 60 60 59 58 56 56 58 58 57 57 57 57 58 59 58 59 59 58 59 59 58 59 57 57 57 57 57 57 57 54 51 52 51 48 48 45 38 28 22 22 24 34 47 79 149 108 101 90 81 78 72 70 67 66 66 65 66 65 64 59 61 61 56 48 56 64 65 66 67 64 62 59 59 58 58 57 58 58 57 59 60 59 57 55 56 54 57 31 23 19 26 34 28 20 20 24 28 33 38 38 41 43 46 48 49 51 50 52 55 53 52 53 54 54 53 54 53 54 54 52 54 54 58 60 61 61 63 62 61 61 61 58 56 61 62 62 62 63 63 65 65 68 68 68 68 69 71 68 70 66 67 67 68 66 65 61 57 53 52 52 51 51 51 51 49 50 50 48 50 49 49 47 45 48 46 45 46 46 46 47 46 45 45 44 44 44 43 42 42 41 42 39 35 29 28 29 34 37 35 46 62 62 43 43 41 42 43 41 41 40 40 38 38 35 34 34 33 35 35 37 36 34 35 36 38 36 39 40 40 41 42 45 47 55 55 56 55 55 55 53 56 54 54 54 56 56 56 55 53 54 52 51 52 52 52 50 50 51 50 50 50 48 46 46 43 45 46 44 43 42 43 44 44 42 41 42 43 42 42 40 38 37 31 23 20 21 35 58 91 97 99 217 249 252 252 247 188 130 129 217 164 155 147 178 135 104 175 160 150 127 110 195 240 228 124 73 57 23 21 19 19 24 28 26 33 36 38 44 53 51 54 58 61 61 60 62 61 60 61 58 57 55 56 55 55 56 56 54 55 55 54 56 54 53 54 54 56 53 54 54 52 52 53 52 52 51 50 51 51 51 51 49 49 51 51 52 50 49 48 46 47 46 46 47 46 45 43 40 39 38 37 40 38 40 41 41 40 41 42 41 41 39 42 45 45 45 45 44 42 38 27 22 20 21 22 46 79 118 110 168 242 235 220 196 167 148 147 150 152 149 151 150 143 137 136 137 127 122 120 116 114 104 107 106 105 106 103 106 86 36 19 16 18 27 31 23 23 22 26 35 43 53 54 59 63 65 66 65 65 67 67 67 67 66 66 68 67 66 67 66 67 67 66 66 66 65 65 64 63 63 62 62 63 60 63 64 62 63 63 62 60 59 58 59 58 58 58 58 59 55 55 56 57 57 59 57 57 57 57 58 57 55 57 58 57 57 58 59 59 58 60 60 58 57 57 55 57 57 57 57 56 55 53 52 51 50 49 46 40 27 23 21 24 30 45 63 143 126 121 118 116 108 104 96 92 87 82 79 78 75 75 72 71 71 68 64 64 66 65 67 68 67 66 65 63 65 64 66 65 63 65 65 63 63 62 63 64 62 56 29 21 21 26 34 27 20 20 24 27 34 38 40 42 43 47 49 48 51 51 53 54 52 53 53 54 53 52 53 53 55 53 52 54 54 56 57 58 60 61 61 61 60 58 56 54 58 61 61 61 60 61 62 63 65 65 65 66 66 68 65 66 66 66 65 65 65 64 58 56 54 53 52 51 51 50 50 50 50 50 49 50 50 49 48 48 48 48 46 46 45 45 46 44 45 45 44 44 43 42 41 42 40 42 39 37 31 28 29 32 35 35 43 53 72 42 43 42 43 44 43 41 42 40 38 36 33 33 33 32 34 34 35 35 35 35 36 37 36 36 35 36 39 42 44 45 57 58 57 56 56 56 54 57 56 56 57 55 54 53 54 54 53 52 51 52 51 52 51 52 49 49 49 48 49 47 45 45 44 44 44 44 43 42 43 44 42 42 43 44 44 42 40 39 38 33 24 18 20 26 47 74 95 98 139 237 251 251 243 183 136 151 208 162 147 151 182 139 112 200 197 149 124 116 166 213 235 176 72 59 26 21 20 21 25 28 27 33 37 38 46 53 51 55 59 60 60 61 62 60 59 59 59 57 58 57 58 55 55 54 56 56 54 54 55 55 55 54 54 55 54 54 55 53 53 53 52 52 52 51 52 52 48 50 51 50 52 50 50 49 49 49 46 46 45 46 47 46 45 43 40 40 41 41 38 40 40 41 41 40 42 42 42 42 41 42 46 45 45 45 43 44 41 31 20 20 19 21 38 64 115 117 124 166 159 156 155 155 159 157 149 147 148 149 147 151 149 147 148 149 152 151 148 147 142 141 142 145 143 142 140 102 33 18 18 18 26 31 21 22 25 26 33 40 50 52 57 62 65 65 65 64 64 64 65 66 65 66 65 65 66 66 66 66 66 68 65 65 64 64 65 64 64 62 62 62 63 63 62 62 63 63 61 62 57 56 57 56 56 58 57 57 56 55 55 55 56 59 56 57 56 56 57 56 55 56 56 56 56 57 58 58 58 58 59 57 56 56 57 58 57 59 59 57 56 54 51 51 49 46 45 42 30 24 20 22 28 36 52 119 133 113 116 114 114 113 117 118 120 119 120 117 115 113 111 107 104 101 99 99 97 94 89 84 83 80 78 77 74 73 74 71 69 67 70 70 70 73 74 75 72 58 29 22 22 27 32 25 20 21 25 28 33 37 40 42 44 48 49 49 52 53 54 54 53 54 54 53 54 54 54 55 54 53 54 53 53 54 53 54 55 54 54 56 56 54 54 54 56 59 60 59 59 60 63 63 62 62 62 63 63 64 63 63 64 65 65 63 62 62 58 54 53 53 52 51 51 50 51 51 49 49 50 49 49 50 49 48 48 46 46 45 46 45 46 46 44 44 44 44 43 43 42 41 41 40 41 37 31 28 27 29 36 37 42 47 80 41 36 38 40 43 44 43 43 43 42 40 37 35 34 34 32 32 32 33 35 34 35 37 36 35 37 36 37 41 41 43 55 56 56 53 56 56 56 54 56 55 56 54 55 54 53 53 53 53 52 52 52 51 51 52 50 51 49 47 48 47 45 47 46 46 46 44 42 43 43 43 43 42 44 45 45 43 40 39 39 35 25 22 19 22 39 58 98 102 109 197 253 250 237 191 150 167 201 164 137 156 189 143 118 208 201 145 120 121 183 209 207 211 84 58 27 21 21 19 24 27 28 34 37 39 46 51 52 55 61 61 61 61 61 60 58 58 58 58 57 57 57 56 53 55 56 55 56 56 55 55 55 52 55 54 56 55 56 55 53 53 53 51 53 54 51 51 51 50 51 50 50 51 50 48 47 48 47 47 46 45 46 46 46 44 41 40 41 40 40 39 40 41 41 41 41 42 43 42 42 42 45 44 44 42 42 44 41 34 22 21 20 21 29 57 106 115 119 156 163 163 159 154 155 155 153 149 148 150 150 150 149 148 147 150 156 155 151 150 148 147 148 149 146 148 147 106 34 18 18 18 25 32 20 22 24 26 32 39 48 50 58 63 66 66 65 65 65 64 65 63 65 66 64 65 67 65 65 66 66 67 67 64 63 64 62 62 62 61 62 62 62 62 62 63 62 63 62 62 59 57 58 57 57 57 58 58 55 57 56 56 56 57 57 56 57 56 55 56 54 55 55 56 55 57 59 59 59 58 59 58 58 55 56 57 57 58 58 58 56 54 52 52 49 45 44 43 33 25 23 22 26 33 47 96 139 71 63 63 68 74 89 92 97 105 113 115 115 125 125 126 126 127 128 142 156 127 134 118 117 114 111 113 112 103 100 105 94 93 93 95 98 97 100 104 106 61 29 21 22 29 31 23 20 23 24 29 34 39 40 42 43 47 49 51 51 52 54 53 53 53 52 52 54 54 53 55 54 53 55 53 54 54 54 54 53 52 53 55 53 53 53 52 52 54 56 57 56 57 58 57 57 57 56 57 59 61 60 60 62 62 63 61 61 59 58 53 54 53 52 49 51 51 51 50 51 49 48 48 49 50 49 49 49 48 46 45 47 46 45 46 47 45 44 44 43 44 42 41 40 40 40 37 32 29 26 27 34 36 38 44 83 44 37 35 39 39 41 43 42 42 42 43 40 37 35 35 34 33 35 33 33 35 35 35 35 35 37 36 38 41 41 44 56 56 57 55 57 55 55 56 56 56 56 56 55 54 55 55 54 54 52 51 51 50 51 50 51 52 50 49 48 49 47 47 47 46 46 46 44 44 44 43 43 43 43 46 44 42 40 39 35 35 26 23 20 20 29 46 85 101 101 123 241 249 232 189 145 187 189 166 127 161 192 140 122 219 193 150 111 123 167 243 224 208 118 64 28 23 21 20 22 25 27 33 38 40 44 49 52 54 60 61 60 61 60 60 60 59 57 57 58 58 56 56 58 55 55 56 57 58 55 54 54 53 53 53 54 53 55 55 54 54 56 55 53 52 51 52 52 51 50 50 50 51 50 47 48 48 47 47 45 46 46 46 46 44 42 41 40 40 41 39 38 41 41 40 41 42 41 41 45 43 45 45 44 42 42 41 42 37 24 21 20 19 24 47 87 118 117 142 157 159 155 153 153 153 160 153 152 153 154 152 148 149 147 150 153 150 145 149 149 149 153 154 152 149 152 100 35 20 17 17 26 31 22 23 25 27 32 37 46 47 56 62 64 64 63 64 62 61 64 63 62 64 64 66 66 65 64 65 66 63 66 64 65 65 63 64 63 60 62 60 63 63 62 62 62 63 62 62 61 62 60 56 56 56 57 58 55 57 58 57 56 58 58 57 56 56 55 55 55 54 52 52 55 57 58 59 58 58 57 56 58 54 57 57 59 58 58 58 56 55 52 51 50 47 44 41 33 26 21 20 21 26 43 66 151 142 129 122 111 104 89 79 71 65 58 59 61 61 66 67 74 78 84 107 120 101 119 108 111 113 122 129 152 133 124 169 119 126 127 124 143 135 148 173 194 63 27 22 23 29 30 23 22 22 25 30 35 38 41 41 43 46 50 52 52 52 53 53 54 53 52 52 54 54 53 54 53 53 54 54 52 53 53 53 52 52 51 53 53 53 50 53 50 50 54 53 53 52 55 53 51 50 50 52 52 52 53 52 55 55 54 53 53 50 52 52 53 50 50 49 51 51 50 50 50 50 50 51 50 50 50 48 49 50 48 48 49 46 45 45 46 46 44 44 44 44 42 42 41 39 38 37 32 29 26 27 32 36 34 46 75 54 37 36 35 36 37 39 40 41 42 42 41 40 37 36 34 33 34 35 36 35 35 35 37 36 37 39 40 40 43 48 54 54 56 57 57 56 55 58 55 54 56 56 56 55 53 53 56 55 52 51 52 52 52 51 51 51 50 49 49 48 46 45 47 47 45 45 44 44 44 44 44 44 43 45 44 41 39 39 35 32 29 24 20 20 22 40 68 94 99 100 184 246 227 177 141 195 180 165 123 170 194 154 129 224 183 147 105 124 139 227 253 246 173 69 33 23 19 20 20 26 25 33 37 39 41 47 50 54 59 61 62 61 61 60 62 60 59 58 58 58 57 58 57 56 56 58 56 58 56 55 54 55 55 55 55 53 53 56 55 55 55 53 54 52 53 53 52 50 51 51 51 50 50 49 49 49 48 47 47 46 45 46 45 42 40 40 41 41 40 38 40 42 43 41 40 41 41 42 46 46 45 46 44 43 41 41 43 40 27 21 19 18 21 37 79 121 116 137 159 160 159 160 162 155 156 156 162 156 155 158 151 146 142 145 149 147 146 148 149 149 152 157 156 152 153 97 32 17 17 18 26 30 22 24 26 28 32 38 45 48 55 61 64 64 63 63 63 63 63 64 64 64 63 65 65 65 66 65 66 66 65 64 65 66 65 66 64 62 63 63 61 60 62 63 62 63 62 62 62 62 60 59 58 56 54 53 54 57 57 56 56 57 58 56 57 55 55 55 54 54 53 53 54 55 57 57 58 58 57 57 58 57 56 56 57 58 57 57 57 56 52 51 50 47 44 40 36 28 20 20 22 25 38 49 144 151 149 152 157 156 158 156 155 151 146 144 139 127 123 116 108 100 91 82 79 74 71 66 61 58 58 66 75 73 81 105 88 95 104 107 134 126 144 168 175 51 28 22 23 30 30 22 21 22 26 30 36 39 42 43 44 46 53 52 53 52 52 53 55 54 54 54 54 54 54 55 53 52 54 54 52 53 53 54 53 53 52 52 51 52 52 50 49 50 52 52 53 53 55 54 54 52 52 53 52 51 52 52 55 55 52 52 51 50 52 52 52 51 50 50 51 51 50 51 51 51 51 50 50 49 50 48 48 49 47 47 48 48 45 47 46 47 44 45 43 42 41 41 40 39 39 39 34 29 27 27 31 35 35 46 66 66 36 37 37 39 38 36 37 38 41 42 42 41 40 36 34 35 36 37 34 34 36 34 36 35 37 39 44 45 48 52 53 52 53 55 56 55 56 55 56 57 55 54 55 55 54 55 54 55 54 54 51 51 54 52 52 51 50 49 49 48 47 46 48 48 46 45 44 45 42 41 43 43 42 43 44 42 42 41 39 35 31 27 20 19 21 26 58 77 98 103 114 195 211 173 146 202 169 167 124 181 190 157 140 229 170 143 102 123 121 186 253 251 235 110 31 24 20 21 22 25 25 32 37 38 42 48 49 54 60 61 59 61 60 60 59 58 59 59 56 57 56 55 58 57 56 56 57 56 56 56 56 56 56 54 54 52 53 54 54 55 55 54 55 53 54 53 54 53 53 51 49 49 49 49 48 49 48 47 46 44 45 45 46 43 41 41 41 41 40 38 38 39 42 42 41 41 42 42 46 47 46 43 43 44 42 40 42 43 30 21 19 19 19 25 65 110 118 131 163 158 164 163 159 161 160 160 168 161 157 155 151 153 146 147 151 149 150 154 152 151 151 154 155 154 156 96 27 19 17 19 26 29 22 23 26 28 33 38 46 48 54 60 62 63 63 62 63 63 63 65 61 62 63 65 64 63 66 66 64 66 66 65 64 63 65 64 63 64 63 63 61 59 62 62 61 61 61 60 59 59 59 60 58 56 56 57 54 55 56 55 58 58 57 56 57 56 55 55 54 53 53 53 53 54 55 57 59 58 58 58 57 56 55 55 56 57 57 55 56 55 52 51 48 46 45 43 38 29 21 19 22 23 36 46 116 143 108 109 109 111 115 116 122 126 131 134 138 142 146 146 150 152 156 157 161 160 157 156 151 145 142 133 121 112 106 98 85 79 71 67 64 65 65 69 74 45 28 22 24 31 29 22 21 23 28 33 35 37 41 42 45 49 53 52 53 54 53 52 55 55 54 55 54 54 53 54 54 53 54 55 53 54 53 53 52 53 53 51 52 52 51 51 50 50 51 51 52 52 52 53 52 52 51 53 52 51 53 53 53 54 54 53 51 51 53 52 52 52 52 52 52 51 50 48 48 49 50 49 50 49 48 48 49 47 46 48 48 47 45 47 46 46 43 44 44 45 43 41 41 39 39 37 34 29 26 27 29 33 35 42 61 75 38 37 38 39 38 36 38 40 40 42 42 41 43 39 36 35 37 38 34 34 35 36 36 39 41 44 50 54 57 59 53 52 55 55 56 56 56 57 59 57 56 55 55 55 56 56 54 54 55 52 51 53 54 52 53 51 49 48 50 49 48 47 49 48 48 46 46 46 44 43 44 44 44 44 44 42 40 41 38 36 31 28 20 19 19 21 48 65 99 105 101 120 179 187 177 190 180 179 161 187 179 158 153 225 157 147 112 118 108 148 251 253 248 143 26 24 22 22 23 24 26 33 39 38 39 46 51 53 60 62 58 60 61 61 59 59 58 58 57 58 57 57 57 57 57 55 56 55 56 56 56 57 56 54 55 55 55 56 54 56 57 56 56 54 55 54 54 55 55 52 51 51 53 52 48 50 48 48 47 47 47 46 47 44 42 41 40 41 40 38 39 39 42 43 42 41 42 43 45 47 46 47 44 43 42 40 40 42 34 24 22 20 19 21 50 86 121 129 156 153 157 160 157 161 161 159 162 161 156 161 161 153 152 156 153 156 158 159 155 155 156 157 155 155 153 93 30 20 18 20 26 28 23 25 25 27 34 40 46 48 54 59 64 64 65 64 63 63 63 64 62 62 63 63 64 65 66 65 64 65 65 64 62 63 63 64 62 63 63 61 62 61 60 61 59 63 64 62 60 59 58 61 60 59 58 58 56 54 56 55 58 57 58 56 56 55 55 56 54 55 54 53 55 54 56 57 57 57 58 56 55 55 54 54 57 57 59 57 57 56 53 50 48 46 44 42 36 30 22 19 21 21 31 46 89 145 131 123 121 122 120 117 119 115 110 108 108 110 110 113 113 112 118 120 126 129 132 136 141 144 148 151 154 155 160 163 167 166 163 161 156 155 151 152 91 41 26 22 25 31 27 21 22 23 25 30 36 39 41 42 46 50 55 53 54 53 53 53 55 55 55 56 53 54 54 54 54 53 53 54 53 53 53 52 52 53 53 52 53 53 52 51 52 52 52 53 52 51 52 53 54 53 53 52 52 52 52 53 53 55 55 52 51 51 52 53 52 53 53 52 51 50 50 49 49 50 51 51 50 50 49 48 48 48 48 49 47 46 47 47 47 47 45 45 43 43 43 43 41 40 40 39 35 30 25 26 28 31 34 42 56 87 42 40 41 40 41 38 40 41 40 44 45 44 43 42 41 40 39 38 39 38 39 41 42 45 50 55 55 58 62 61 54 54 57 55 55 57 56 55 58 57 57 57 57 55 55 55 55 56 55 54 53 52 54 53 52 50 49 48 50 48 49 47 50 49 47 48 48 46 46 45 43 44 44 43 43 41 40 39 38 36 34 30 23 20 19 20 37 48 81 94 98 102 126 177 192 191 191 189 188 186 184 180 167 165 163 165 159 149 135 135 190 202 200 114 29 25 21 21 21 23 25 30 39 41 42 46 48 52 58 61 61 61 59 60 60 59 57 59 59 59 59 59 55 56 55 56 55 56 56 57 56 56 55 56 57 56 56 56 55 55 56 56 54 55 55 56 56 56 54 54 52 53 52 51 50 51 50 49 48 47 47 46 47 45 42 41 42 41 40 39 39 41 41 41 40 41 42 43 44 45 47 46 46 42 41 40 41 41 36 26 22 20 21 22 36 58 119 129 150 153 155 156 159 162 164 158 151 150 157 166 163 156 159 161 160 161 161 161 159 158 157 158 155 154 154 87 31 21 19 20 26 28 21 24 26 28 36 40 45 48 56 60 64 63 64 63 61 62 61 61 63 61 63 62 63 64 63 63 63 63 63 64 63 62 63 61 62 63 62 61 61 62 60 62 61 60 61 60 58 59 59 59 60 60 59 58 56 57 56 57 55 55 57 57 56 56 55 55 54 53 54 53 55 55 55 55 54 57 58 57 55 53 53 54 55 57 56 56 57 56 54 51 49 47 45 43 38 32 24 20 20 18 25 39 68 142 137 130 129 133 131 134 133 132 130 130 131 131 130 125 120 122 121 123 113 109 107 107 103 108 110 111 114 116 117 124 132 134 139 139 141 144 149 153 89 37 26 23 26 33 24 22 21 24 26 30 37 41 43 42 44 49 52 54 54 53 53 53 55 55 54 53 53 55 54 52 51 53 53 52 54 53 52 51 51 54 53 52 53 52 51 51 52 52 54 53 53 52 53 52 52 53 51 53 53 51 53 55 53 55 53 52 53 54 52 54 53 52 53 51 52 52 51 50 50 50 50 50 51 50 48 48 49 49 48 47 47 47 47 46 46 46 47 45 45 44 43 41 40 40 40 37 35 30 26 25 26 29 33 35 50 92 47 44 43 44 43 42 43 44 45 47 49 48 49 48 47 49 47 43 43 44 47 46 48 50 55 57 59 61 65 71 56 57 57 55 56 56 55 55 57 56 55 56 55 55 55 56 56 55 56 55 53 53 53 52 53 51 49 48 48 49 50 48 50 51 48 49 49 48 48 46 44 44 44 45 43 41 42 39 39 37 34 30 24 20 20 21 26 44 66 89 92 102 105 141 179 192 192 191 191 191 187 184 182 180 175 169 162 159 156 155 150 149 145 90 30 25 22 21 21 22 25 29 37 38 44 46 47 51 58 61 61 62 57 59 60 58 59 59 58 58 58 57 56 57 56 57 54 55 56 57 56 56 55 56 55 54 55 55 54 55 56 56 56 54 54 55 55 56 54 53 54 54 52 52 51 50 49 48 49 47 45 46 46 44 43 42 41 41 40 40 40 41 41 42 40 41 42 42 44 47 47 45 45 44 40 39 38 39 37 28 22 21 21 22 29 49 108 132 142 155 159 159 167 165 168 162 155 156 159 164 162 163 163 164 165 160 156 159 154 158 157 160 158 154 153 84 31 19 20 20 27 28 20 22 27 30 37 42 45 47 55 59 63 63 63 62 61 63 62 63 63 62 64 62 64 63 63 64 62 61 63 63 63 64 62 61 62 62 63 62 61 64 65 64 64 60 62 60 61 61 61 62 60 60 59 58 56 57 58 57 54 53 55 57 56 56 56 55 54 55 54 54 55 55 53 54 53 57 58 58 55 52 52 52 55 57 56 56 56 55 53 53 50 47 45 42 38 34 25 21 19 20 23 33 58 128 141 131 136 134 131 133 131 127 125 129 134 133 134 132 130 133 147 167 133 128 135 131 129 126 128 133 119 119 132 138 129 138 148 139 133 122 119 115 76 36 26 21 27 32 23 21 21 23 27 33 37 41 43 43 45 49 54 55 55 53 54 55 55 54 55 54 54 53 54 53 53 54 52 52 53 53 53 52 52 53 53 53 53 52 52 52 54 54 51 53 52 53 53 52 52 53 54 53 52 52 51 53 53 55 53 51 53 53 53 53 55 52 50 50 51 51 51 50 51 51 50 50 51 50 49 49 49 49 49 48 49 49 47 46 47 46 46 45 46 44 42 42 40 41 39 38 36 31 26 26 25 28 33 35 50 87 60 45 45 46 45 46 45 48 49 50 51 52 50 49 51 51 47 47 46 46 49 52 53 53 59 61 68 75 94 133 56 57 56 55 56 56 55 56 55 54 56 56 54 54 55 54 55 56 53 52 53 54 53 53 54 53 53 52 49 50 50 48 48 49 49 49 48 51 50 49 48 47 47 45 44 44 43 42 39 39 33 31 24 22 18 18 19 34 52 85 95 99 101 99 121 157 187 189 190 191 188 186 186 186 182 177 174 176 180 181 183 188 198 119 25 25 23 21 22 20 28 32 38 38 41 44 47 49 58 61 60 61 59 59 60 60 60 59 59 60 57 58 58 57 56 54 55 55 57 57 56 56 55 57 57 56 55 56 54 53 55 55 56 55 55 55 54 55 53 54 54 55 52 52 51 49 48 49 50 46 46 46 48 47 46 43 41 41 41 42 39 40 41 44 43 41 43 43 44 45 47 46 45 42 40 40 39 38 39 31 24 21 20 20 24 43 78 124 131 155 160 160 162 163 168 167 163 164 161 163 163 161 163 164 165 163 154 161 152 146 148 154 155 161 153 80 31 20 19 19 26 28 21 24 29 33 39 43 46 48 54 60 61 62 61 61 63 64 62 63 62 61 60 60 63 63 62 62 63 62 63 63 64 64 64 63 63 62 62 63 62 65 66 65 65 66 65 62 63 63 62 63 64 62 61 61 58 57 59 58 57 56 55 55 54 54 53 53 57 53 55 55 54 54 53 54 54 54 55 55 55 51 52 52 53 54 56 56 54 55 54 53 50 45 43 41 39 35 27 21 19 20 20 29 49 103 151 141 141 135 134 132 131 130 127 127 131 133 130 130 133 131 150 157 119 134 132 132 130 133 133 151 117 119 173 175 174 202 235 225 228 177 158 170 70 36 24 21 27 31 24 20 21 25 30 34 38 42 43 43 47 52 52 55 54 54 54 55 55 56 55 53 54 54 54 53 53 53 51 53 54 53 51 52 53 53 53 52 53 53 52 53 54 54 53 53 54 51 53 52 54 54 54 53 54 55 54 54 53 54 54 53 52 53 54 52 53 53 51 51 51 51 51 48 51 51 51 50 49 50 48 49 49 50 49 49 48 49 47 47 48 47 47 47 45 44 42 40 39 41 40 37 36 31 26 24 25 27 33 34 46 77 81 47 48 47 48 47 46 47 48 51 52 53 53 52 48 46 43 42 47 47 46 52 72 78 87 111 148 180 220 239 58 57 56 55 56 56 54 55 55 54 55 54 54 54 53 54 54 56 54 54 54 54 55 54 55 55 55 55 51 51 52 49 48 51 50 50 51 50 51 50 49 48 48 47 45 44 41 39 39 36 33 29 26 23 20 19 19 26 43 74 100 99 99 95 98 113 148 169 182 187 191 193 196 199 194 193 195 199 206 205 206 195 175 107 27 26 22 21 22 20 29 39 39 40 41 44 45 50 58 60 60 61 58 60 61 61 61 60 60 60 58 58 58 56 57 57 57 55 56 57 58 57 56 57 58 57 57 58 56 54 55 56 55 54 53 54 56 56 55 54 53 55 54 53 53 50 50 51 50 48 48 47 48 48 45 43 41 41 40 40 38 39 41 44 44 42 42 44 45 46 48 46 44 43 41 42 39 38 37 32 26 22 20 21 20 34 62 113 127 152 169 168 166 168 172 172 167 166 163 166 167 166 166 163 160 162 159 163 163 164 153 151 154 154 154 79 32 22 20 20 26 29 21 24 29 34 40 43 44 48 55 63 62 62 63 63 64 64 63 62 63 62 62 63 63 62 63 63 63 64 64 64 66 66 65 65 65 65 64 65 65 66 65 66 67 67 64 62 61 62 63 65 65 64 65 63 60 59 60 60 59 58 57 56 54 53 51 53 54 51 54 53 54 54 54 55 54 52 53 54 55 54 50 50 54 53 55 56 54 54 56 54 50 45 43 40 39 36 27 22 19 18 19 25 45 73 154 144 137 136 135 134 137 136 131 133 134 133 130 133 134 134 151 148 118 133 136 136 136 137 137 148 112 123 178 170 179 195 241 243 240 191 156 181 62 35 23 19 25 29 23 21 22 24 30 33 37 41 42 44 48 52 54 55 54 54 55 56 56 57 55 54 54 55 54 52 54 52 52 53 52 53 53 51 52 53 53 51 51 53 53 53 53 53 55 55 53 52 54 53 54 55 54 54 54 56 56 56 54 55 55 53 52 53 54 53 52 52 52 51 50 50 49 49 49 50 49 48 50 51 49 49 48 48 48 50 48 47 46 47 46 46 43 44 43 41 41 40 42 40 40 38 36 32 26 24 25 26 30 33 43 63 99 53 52 52 55 55 61 62 60 59 63 64 73 73 60 50 41 34 35 35 36 45 61 66 157 208 229 238 239 217 55 55 54 54 55 55 55 53 54 54 52 54 54 53 52 54 53 55 53 53 53 51 52 53 53 53 55 55 53 52 51 48 48 50 50 52 51 51 52 50 50 50 51 49 44 40 37 36 35 34 31 29 26 24 21 21 19 21 35 58 104 97 94 94 93 95 104 121 149 170 183 191 194 197 199 194 178 167 160 141 128 118 112 81 33 25 23 22 22 20 29 39 38 41 42 43 44 49 58 59 60 60 59 61 60 59 61 60 59 60 58 57 56 56 55 57 56 57 57 57 57 57 57 56 57 58 58 57 57 56 55 56 56 54 54 54 56 56 55 55 54 55 56 53 53 54 53 52 50 49 49 47 48 49 47 46 43 41 41 42 40 40 41 42 43 42 43 44 47 47 47 46 46 44 43 43 42 38 35 33 26 22 19 19 19 28 54 94 126 131 198 204 195 196 194 189 187 186 180 179 177 173 172 174 174 174 170 169 168 170 171 168 171 164 152 77 30 23 21 19 25 27 21 25 31 37 43 42 43 47 57 63 64 63 63 63 64 64 63 65 66 64 63 64 62 63 64 65 63 64 64 66 66 67 67 68 66 67 66 66 65 66 65 65 67 67 65 63 61 62 64 65 66 66 66 65 63 62 64 61 63 61 60 60 59 56 53 54 55 54 53 52 53 52 53 54 54 52 53 53 53 51 50 49 51 52 54 55 55 56 54 53 52 48 42 40 40 40 30 24 19 18 19 21 38 50 143 149 137 136 132 129 131 135 134 135 135 137 137 137 132 131 156 136 116 131 127 127 135 146 149 140 109 130 190 164 185 179 233 234 238 198 154 170 48 32 21 19 28 30 23 22 23 25 29 32 36 39 42 45 49 52 53 54 54 55 54 54 54 54 55 53 54 53 54 54 52 53 52 54 52 51 52 53 53 53 53 53 53 54 53 53 54 54 53 53 54 53 54 55 55 55 55 55 55 55 55 55 54 55 56 55 52 54 54 53 52 52 51 51 51 51 49 48 49 49 49 49 51 51 51 49 51 48 50 50 49 46 45 45 45 45 45 42 44 42 40 41 39 39 39 39 36 34 27 25 24 23 29 34 41 48 114 86 83 84 84 87 90 92 90 93 93 90 71 50 37 31 29 29 25 28 36 49 80 107 160 172 172 165 129 69 52 52 54 54 56 57 53 52 53 54 55 54 52 54 53 52 53 55 53 54 55 54 53 54 53 52 55 54 54 54 52 49 50 51 48 49 49 49 50 50 49 48 49 48 44 40 38 36 34 33 31 29 26 26 24 22 21 20 29 49 83 97 96 97 94 96 98 98 113 128 141 147 146 140 129 124 119 115 109 108 106 107 111 84 31 24 25 26 25 21 25 34 39 41 42 45 46 52 59 57 58 59 58 60 60 60 59 58 59 59 58 57 57 56 57 57 57 58 58 59 58 58 58 57 58 59 57 56 57 56 55 56 55 54 55 57 57 57 57 56 55 56 56 53 54 54 54 52 51 50 49 48 47 48 48 47 45 45 44 43 42 41 42 43 45 44 44 46 47 47 47 46 47 47 45 41 42 39 35 33 25 23 20 21 20 24 47 73 123 117 221 247 247 246 244 240 239 237 235 233 233 231 226 227 224 224 225 222 220 221 224 222 226 230 218 100 31 22 20 19 26 27 21 26 32 39 44 43 44 48 57 62 66 64 65 65 65 67 66 67 66 65 65 65 64 65 64 67 65 66 67 68 70 68 67 69 67 66 66 67 64 66 65 65 67 67 64 62 61 62 63 65 65 65 64 65 63 61 64 63 64 62 62 63 61 58 56 56 55 56 54 52 52 53 54 54 55 53 54 55 52 53 50 49 51 52 52 53 55 55 54 53 52 49 45 43 41 40 31 26 22 20 19 20 32 45 122 147 143 137 137 137 133 136 139 141 141 138 141 144 141 138 158 129 119 136 151 165 191 214 189 129 112 131 187 168 183 161 196 199 204 186 158 161 43 28 24 21 28 29 21 21 23 26 30 32 36 40 43 45 50 53 52 55 53 54 54 53 54 54 55 53 55 53 55 54 53 54 52 53 52 52 53 52 52 53 53 53 52 53 52 53 53 53 52 52 54 53 53 54 54 54 56 56 56 56 55 56 55 56 56 56 54 55 54 53 53 54 53 52 52 50 49 49 49 50 51 51 50 48 51 50 51 48 49 50 48 49 49 47 45 44 44 44 44 44 40 43 41 40 40 40 37 34 27 24 24 23 28 34 38 44 108 109 108 110 108 104 106 107 107 108 112 104 85 69 50 42 31 30 27 39 68 93 114 122 124 112 79 60 55 59 52 51 52 53 53 53 51 50 49 48 50 49 50 49 51 52 48 50 51 51 53 52 52 52 53 51 53 54 52 52 52 51 50 51 50 50 47 47 48 46 48 47 48 44 42 40 38 37 35 34 30 28 27 29 28 26 25 25 25 39 59 96 98 100 96 93 96 95 95 98 100 105 105 103 103 103 104 103 102 104 107 110 114 87 35 27 26 26 27 24 23 29 38 42 43 45 49 53 54 53 57 61 59 60 59 59 59 58 59 58 58 56 57 57 58 58 56 58 57 58 57 57 58 58 58 58 55 55 55 54 54 54 53 54 56 57 56 56 56 56 57 56 56 64 59 54 55 52 51 52 49 48 50 49 49 48 46 46 45 45 44 42 43 44 46 46 44 45 49 48 47 46 47 45 44 45 43 41 35 32 26 24 22 21 22 21 36 53 110 123 172 245 251 250 251 252 250 249 246 252 250 250 252 249 245 246 250 252 251 249 252 242 250 253 241 112 32 23 19 18 25 27 22 27 32 37 42 44 44 49 57 61 64 63 66 67 67 66 68 67 66 64 66 66 67 66 66 68 67 68 67 66 69 68 69 68 67 66 66 66 63 64 64 65 62 63 62 60 59 60 62 62 64 63 61 62 61 60 63 64 63 61 63 62 61 60 57 57 56 56 56 56 55 55 55 54 53 53 52 53 51 51 51 49 51 50 53 56 56 54 54 52 50 49 45 42 41 39 32 25 21 20 19 20 27 43 101 145 151 141 141 143 141 144 147 149 150 149 148 146 148 155 153 124 117 187 235 243 243 244 186 125 110 158 213 173 178 152 193 214 227 208 156 141 42 29 22 23 32 28 21 22 23 26 31 33 40 42 42 44 48 51 53 53 55 56 54 53 54 54 54 53 54 54 54 52 52 53 52 52 52 53 54 53 53 55 53 53 51 52 52 53 54 53 52 52 51 53 53 54 55 55 56 55 55 56 55 54 55 56 55 55 53 53 53 54 55 55 52 52 52 49 49 50 50 51 50 49 49 47 49 49 50 51 50 50 48 50 49 48 46 44 43 42 43 44 41 41 42 41 40 40 37 33 27 23 23 23 26 31 36 44 91 100 89 92 96 97 98 99 102 104 108 112 113 118 111 102 62 34 33 61 104 112 112 98 74 65 67 70 74 84 52 51 51 52 50 51 49 47 42 41 43 42 44 42 44 44 45 46 47 49 51 49 50 51 52 51 52 53 53 53 54 52 52 51 52 51 46 46 45 40 43 42 43 40 42 41 39 36 36 34 32 30 29 31 31 31 31 31 29 34 47 85 103 102 95 93 97 95 97 94 92 97 102 103 101 102 106 105 106 107 108 112 115 88 37 30 29 30 30 27 28 33 41 42 43 46 52 54 50 50 55 59 59 60 58 58 60 58 58 59 57 56 56 57 60 59 59 57 57 59 57 56 58 58 57 58 55 56 56 53 55 55 54 55 56 56 56 55 57 56 58 55 55 67 63 52 54 53 53 52 51 51 50 49 50 49 47 47 46 45 45 44 44 46 48 47 45 45 48 48 50 48 48 46 44 42 41 40 36 33 30 23 22 22 22 23 30 47 93 124 138 224 253 252 249 249 249 251 247 249 246 251 251 247 245 246 251 250 251 246 250 248 253 253 239 106 35 23 19 19 24 26 22 27 32 37 42 44 45 49 58 63 65 66 66 66 67 67 68 68 69 67 67 68 68 67 67 68 67 69 67 69 68 68 67 66 66 66 64 63 62 63 62 62 61 60 63 61 59 61 61 60 60 61 61 62 61 59 61 63 62 62 63 62 61 62 58 58 58 59 58 57 56 56 57 54 54 55 54 53 52 53 50 48 49 50 54 54 55 56 55 53 49 49 46 41 40 37 34 27 22 21 18 18 24 40 84 142 149 146 145 147 147 148 151 160 177 191 198 199 213 216 146 121 120 210 248 245 240 243 176 123 111 167 229 175 177 168 241 248 245 226 155 123 41 25 21 23 33 26 21 21 23 28 33 35 40 40 43 44 49 51 55 56 55 55 54 54 55 54 52 53 54 55 55 53 54 54 54 52 51 51 52 51 54 56 53 54 52 52 52 54 53 54 53 54 52 51 53 54 56 56 56 55 55 56 57 54 56 56 56 55 53 54 54 53 54 54 52 52 52 50 49 49 49 50 51 51 49 48 47 49 50 50 48 49 50 48 49 47 45 45 46 43 44 43 42 40 39 39 39 39 39 34 28 24 22 22 25 30 35 44 80 94 61 55 53 52 59 54 63 62 65 73 77 82 90 94 65 40 42 69 85 78 72 82 108 128 104 97 115 135 49 48 48 48 48 46 44 43 41 39 39 40 38 36 37 37 38 36 37 39 42 42 45 43 47 47 48 50 52 51 51 51 50 49 48 45 42 42 37 37 35 37 36 35 37 36 35 34 32 32 32 31 33 34 36 37 39 38 37 38 42 51 98 106 98 97 96 91 95 95 92 95 101 104 100 103 106 104 105 110 114 117 115 94 37 34 33 34 35 35 40 46 50 44 43 48 50 49 48 47 51 57 59 59 59 59 58 59 57 56 58 56 57 57 58 58 58 59 58 54 57 56 57 56 58 56 55 57 56 56 56 55 54 55 55 55 55 56 56 56 56 56 55 55 56 52 52 53 52 53 51 50 50 49 51 50 49 46 46 47 46 47 45 45 47 48 48 50 50 50 50 48 47 45 45 42 39 40 41 36 31 25 23 23 22 21 25 43 71 117 119 161 248 248 248 245 252 249 250 247 245 251 250 251 248 250 250 245 239 239 243 248 251 252 235 99 31 22 17 19 23 25 22 28 35 38 41 44 45 49 59 61 66 67 69 67 66 68 68 68 69 68 67 65 67 66 67 67 66 67 67 65 65 64 67 66 65 63 63 63 61 60 60 61 61 59 60 58 59 60 58 59 59 59 58 60 59 58 59 59 60 62 63 62 62 61 59 58 59 58 60 58 56 56 55 55 56 55 55 55 56 55 51 48 50 52 54 56 56 55 55 55 52 50 47 44 39 36 37 30 22 21 18 17 20 31 63 127 151 160 170 176 196 211 225 233 237 239 243 244 247 227 138 120 126 218 243 240 239 244 163 123 111 177 236 186 170 164 231 241 220 182 158 100 40 25 21 23 30 24 21 21 23 28 33 36 40 40 42 45 48 51 54 55 54 56 55 54 54 54 55 53 54 55 53 53 54 53 54 51 52 52 51 51 54 52 51 51 50 50 52 52 55 53 52 54 55 53 54 54 54 54 54 56 55 56 57 56 55 56 56 56 55 53 56 54 54 53 52 51 51 50 50 51 50 49 51 52 50 51 49 47 49 50 48 49 48 48 47 47 46 47 46 45 45 43 42 42 40 38 38 39 38 34 30 26 25 24 24 27 34 45 64 135 163 158 155 148 139 133 125 126 121 115 107 98 89 83 84 87 96 109 125 138 148 159 145 136 144 155 152 139 48 47 45 45 45 43 41 40 40 38 37 39 36 35 34 33 35 34 34 34 36 35 36 37 37 40 43 45 50 49 49 52 49 47 47 45 40 36 35 35 34 34 34 33 34 34 33 32 32 31 32 32 32 33 36 37 38 39 40 38 38 40 74 106 101 101 103 94 93 94 97 95 103 100 99 99 106 104 111 118 126 128 118 91 38 37 37 38 41 45 51 55 57 49 45 49 50 48 43 44 50 57 60 59 58 60 60 58 57 56 57 57 57 56 56 57 58 57 57 55 58 58 56 55 56 55 55 55 55 55 56 54 56 55 55 55 55 56 54 57 57 55 56 55 54 53 53 54 53 54 53 53 53 52 51 51 49 47 48 47 47 48 47 48 50 49 50 51 50 50 49 50 49 47 45 43 40 40 41 36 30 25 25 23 22 22 22 36 62 114 119 124 219 249 244 248 252 247 251 248 248 250 253 251 249 250 246 250 246 246 241 247 249 247 230 91 32 23 18 18 22 24 22 28 34 36 39 44 46 51 57 61 67 69 69 69 68 68 68 68 67 66 68 66 66 65 65 65 64 66 64 62 62 62 62 63 62 62 63 62 60 60 60 61 60 59 59 57 57 58 58 58 58 59 58 57 57 57 58 59 58 60 60 61 61 60 58 59 59 58 58 59 57 57 56 57 57 55 56 54 54 54 53 51 50 52 55 56 56 56 57 57 53 49 45 42 39 36 35 31 23 21 19 18 20 26 51 113 153 209 227 228 233 235 242 243 241 241 240 240 244 222 130 110 134 226 244 243 245 245 152 124 112 191 239 192 162 161 197 193 162 155 162 89 39 23 21 24 31 24 21 22 25 28 33 35 39 41 43 45 50 52 53 54 56 55 55 55 54 53 54 53 53 54 54 52 53 53 52 51 52 52 51 51 53 52 52 51 51 51 53 54 53 54 55 53 53 53 54 55 54 55 54 55 57 56 56 56 56 54 55 57 53 53 55 54 53 53 52 51 50 49 49 51 51 50 51 52 50 51 49 50 49 49 49 49 48 48 48 47 46 46 46 43 43 42 42 41 40 39 38 39 37 36 31 26 25 23 23 25 33 42 59 126 154 155 159 163 163 162 166 167 168 167 171 174 174 173 171 169 162 160 165 159 156 158 165 165 157 145 128 123 47 45 42 43 43 42 39 38 38 38 36 37 33 35 35 32 33 34 34 33 33 32 31 32 31 32 35 36 39 42 45 47 45 45 46 45 41 37 35 33 33 32 33 33 32 34 31 33 31 30 29 29 30 32 35 39 39 39 40 37 34 39 52 93 109 105 102 96 93 94 95 98 101 100 94 100 104 111 120 123 120 99 71 61 49 42 42 42 43 48 56 56 59 57 47 53 53 47 43 43 49 58 59 58 56 57 58 56 56 59 57 58 58 56 56 56 57 57 57 55 57 57 55 55 55 54 55 56 56 54 55 57 57 56 56 57 55 55 55 56 56 56 55 56 55 54 51 52 53 54 53 52 53 53 53 52 51 50 49 50 49 49 49 50 51 50 49 50 49 49 51 50 49 48 45 45 41 39 38 36 31 28 23 24 24 22 23 28 49 87 123 120 153 232 246 245 245 243 243 243 248 248 249 251 250 252 249 252 252 251 251 250 246 239 202 73 27 20 18 17 23 23 21 26 34 36 40 43 45 50 59 64 68 70 69 68 67 67 68 67 65 62 61 62 65 65 62 62 63 63 64 61 60 59 60 62 59 58 61 60 58 60 60 59 61 60 59 58 56 58 59 58 57 59 58 55 56 55 57 57 59 59 58 60 58 59 59 59 60 60 58 60 58 60 59 59 56 56 56 54 54 54 53 50 50 52 55 57 58 57 56 55 53 50 45 43 40 38 35 32 26 22 19 19 19 23 41 83 146 205 238 233 225 234 237 239 241 239 241 240 241 213 123 101 144 233 243 246 247 243 140 120 119 212 242 203 163 177 131 148 153 153 154 81 34 23 20 24 30 25 22 22 24 29 33 36 39 42 42 44 50 52 53 54 55 55 54 54 54 54 54 54 54 54 55 54 51 52 51 52 52 52 52 52 51 52 53 52 50 51 53 54 53 54 54 52 53 53 52 53 55 52 55 54 55 56 56 56 56 56 55 55 53 53 53 54 52 53 51 51 50 48 48 48 49 50 48 49 50 50 49 51 51 51 49 49 48 49 49 48 46 45 47 46 44 41 41 40 42 40 38 37 37 36 30 25 23 22 23 25 32 35 54 115 122 121 124 125 134 131 136 140 142 147 151 149 158 155 144 125 123 132 127 128 129 128 129 132 128 123 118 117 47 44 41 43 42 42 40 39 40 39 39 37 34 36 34 32 32 31 32 32 31 30 32 31 31 30 32 33 36 36 39 42 41 44 45 46 42 40 37 35 32 31 33 31 29 30 29 32 32 30 28 28 31 34 37 40 39 39 38 35 32 32 46 63 103 110 104 97 98 95 96 98 102 104 100 103 112 118 114 106 82 57 53 60 57 48 45 45 48 48 48 48 57 61 54 57 58 51 46 46 51 57 57 54 52 54 53 55 55 56 59 58 58 57 59 57 56 57 55 55 55 56 56 56 55 55 55 57 55 55 55 56 56 57 55 55 54 55 54 55 55 54 55 55 55 55 55 55 54 53 54 54 54 53 53 53 52 51 48 49 50 49 49 48 50 51 49 51 50 50 51 50 48 49 46 43 43 40 37 36 31 27 24 24 22 22 24 25 44 67 123 122 127 172 204 210 218 222 234 241 240 244 249 250 249 248 250 253 251 241 234 219 198 190 160 57 23 19 18 18 23 23 21 26 38 36 39 41 44 50 58 62 66 69 69 70 70 68 66 66 64 62 60 60 62 63 61 61 62 63 62 61 61 59 61 61 62 59 59 60 59 60 60 61 61 60 60 57 57 57 59 58 58 59 56 57 58 56 57 56 60 58 58 59 56 56 57 56 60 60 59 59 59 58 58 59 58 57 57 56 56 56 55 52 52 55 58 58 58 59 57 56 53 50 47 44 41 39 36 33 28 22 19 18 18 20 38 62 141 183 243 242 241 245 244 240 239 237 243 244 242 205 119 101 155 237 244 244 249 240 133 118 123 214 227 197 163 176 127 144 150 148 146 71 29 23 20 26 30 22 21 22 25 30 33 36 38 41 43 46 50 52 54 55 56 54 54 53 54 55 54 54 54 54 53 53 52 52 53 53 53 53 53 52 52 53 52 51 49 50 53 55 52 53 54 52 53 55 53 54 54 52 52 55 56 55 57 55 54 55 56 54 54 53 51 52 52 54 51 51 52 50 49 48 49 50 49 49 49 48 49 49 48 49 49 50 50 50 47 48 45 45 47 47 45 43 42 40 40 40 38 37 38 38 31 26 24 23 22 24 29 34 51 104 127 121 121 124 121 120 123 126 127 128 127 131 151 150 142 138 128 131 123 120 123 130 127 126 122 121 122 121 47 44 41 41 41 40 40 39 39 39 38 36 36 36 36 34 32 32 31 30 32 30 32 31 30 29 31 33 34 32 33 35 37 40 45 47 46 45 39 35 33 32 31 30 30 29 28 29 30 30 31 33 34 35 39 40 41 38 36 33 34 37 48 52 61 88 106 105 102 99 101 103 111 112 105 105 101 102 114 109 47 57 89 135 93 55 52 51 46 43 42 43 49 57 62 63 65 56 49 48 54 56 50 47 46 46 49 51 54 57 56 59 58 58 57 56 56 56 55 54 54 55 54 56 56 56 57 55 56 55 56 56 54 56 55 56 56 56 55 55 56 56 54 56 57 56 56 55 54 54 56 54 55 55 53 52 52 53 52 51 51 51 50 51 50 52 51 52 50 48 51 50 51 48 44 42 42 41 37 35 29 27 27 26 23 23 24 21 37 52 111 118 121 129 149 138 130 129 131 136 138 145 157 167 175 183 201 209 200 186 185 185 186 182 150 52 25 18 16 16 22 23 22 28 49 42 39 43 45 50 59 61 68 70 68 69 67 67 65 65 63 64 63 63 62 63 61 59 59 60 61 60 61 61 61 61 61 58 59 60 59 60 61 60 61 60 58 58 59 59 60 59 59 58 57 59 58 57 56 57 58 58 56 56 56 56 57 56 57 57 59 59 59 60 58 61 59 58 59 58 58 58 58 57 55 56 59 58 57 60 58 56 54 51 48 47 45 41 38 35 30 25 20 20 18 18 30 51 123 154 236 243 244 245 236 238 240 240 235 231 239 189 113 103 171 242 239 236 244 230 124 116 130 172 156 183 162 161 135 142 144 144 131 59 27 22 21 27 30 22 21 23 27 30 35 36 40 41 42 45 51 53 54 55 56 54 54 55 56 57 55 54 54 54 54 53 53 52 51 53 52 52 54 54 54 54 52 52 51 51 53 55 54 52 53 54 53 54 54 54 54 53 55 55 54 56 53 55 55 54 56 56 54 54 54 54 53 53 51 51 52 51 49 49 49 49 49 51 51 50 50 50 49 47 48 51 50 49 47 47 45 46 46 44 43 43 42 38 39 39 38 37 37 38 33 28 22 21 21 22 28 33 42 84 132 117 118 122 123 120 117 121 122 122 126 128 131 129 129 128 130 132 132 130 124 122 121 118 117 117 121 116 43 42 40 39 38 38 39 40 39 39 37 38 38 38 37 35 34 33 32 32 32 31 32 32 28 28 29 30 30 31 32 31 34 36 40 43 45 46 43 37 33 33 32 30 31 30 31 30 29 29 31 34 39 39 43 45 41 34 33 31 40 51 69 72 54 62 91 107 113 112 111 113 119 115 95 100 106 114 124 112 55 71 178 238 170 70 53 50 46 44 42 42 46 54 63 71 73 64 54 52 54 51 43 43 42 41 45 45 50 51 54 57 57 58 57 56 56 55 54 54 53 54 55 55 53 56 56 55 55 55 54 55 55 55 54 55 56 55 56 56 56 55 54 55 57 57 57 56 56 54 55 54 54 56 55 53 53 54 53 54 52 52 52 51 52 51 51 51 50 50 51 50 48 45 42 41 40 40 36 34 31 29 27 25 24 24 24 23 32 48 90 122 119 123 134 154 161 140 135 138 149 160 174 183 190 196 201 199 188 177 168 160 152 143 122 52 25 19 18 18 23 23 22 28 45 41 40 42 45 50 59 61 67 69 68 69 68 68 65 65 65 64 63 63 63 62 60 60 61 61 61 60 60 61 62 62 60 60 60 61 61 61 63 62 61 60 58 58 59 59 60 60 60 58 58 60 59 57 57 58 57 59 56 56 56 55 57 57 56 56 57 56 57 56 57 59 59 59 59 58 58 59 59 57 55 56 59 60 60 60 61 59 56 53 50 49 44 44 40 35 32 26 21 20 18 18 26 46 110 143 218 239 241 241 237 241 247 246 234 229 234 180 108 108 183 246 249 246 243 222 121 118 130 144 146 173 170 156 137 145 144 138 116 54 26 23 21 26 27 21 21 25 28 31 35 36 39 41 43 47 52 53 55 55 54 53 54 54 56 56 56 56 55 55 54 54 51 52 52 51 52 52 53 53 53 53 51 50 51 50 52 53 54 52 51 52 55 54 54 55 53 54 54 56 55 56 56 56 55 55 54 55 55 55 54 53 52 53 51 52 50 51 49 48 51 49 49 50 50 49 49 48 48 49 49 50 49 49 49 48 46 45 47 45 46 43 42 38 39 39 38 38 37 38 32 28 24 21 20 24 26 33 42 67 139 125 126 128 124 121 120 122 123 124 127 129 125 124 122 120 123 124 122 124 125 123 123 120 121 120 121 119 46 45 44 42 41 39 40 40 38 41 40 38 39 38 36 35 34 34 33 32 31 31 32 31 29 29 30 30 30 30 32 31 33 32 33 35 37 39 42 42 39 36 35 32 33 33 32 31 29 31 32 37 45 49 49 43 34 30 33 45 68 77 76 76 83 76 60 71 89 98 106 102 92 98 105 119 124 125 125 122 73 112 240 253 224 130 56 50 42 43 43 45 48 54 67 93 81 80 64 55 47 46 42 40 38 40 41 42 43 46 50 54 57 57 55 56 55 55 54 54 56 54 53 53 53 53 52 53 55 54 55 54 53 55 56 56 53 53 55 56 57 57 56 56 56 55 56 55 57 56 57 57 54 54 53 53 55 53 55 53 51 53 52 52 52 51 51 51 51 50 49 49 48 42 40 39 40 38 37 36 32 30 29 27 26 24 23 22 23 43 65 119 117 119 120 124 150 180 194 198 198 199 195 193 187 179 164 152 143 141 136 132 131 127 113 54 23 21 19 19 23 27 25 28 36 38 38 42 47 51 57 59 65 68 68 69 66 65 64 64 64 63 62 63 63 62 61 60 60 60 60 61 61 59 62 62 61 62 64 64 62 61 61 61 62 62 59 57 58 59 60 59 58 60 58 58 58 58 59 57 57 58 55 55 55 55 57 57 54 56 57 56 57 58 59 59 60 60 58 60 59 60 61 60 59 56 58 60 60 61 60 58 54 51 50 52 47 46 42 35 32 29 23 20 18 17 23 37 85 140 184 229 236 241 243 242 243 244 235 244 239 166 108 109 198 247 240 238 229 183 122 120 134 149 150 163 175 157 122 144 144 141 108 47 24 21 24 29 27 23 22 26 29 33 35 37 40 41 43 48 53 53 55 52 52 54 53 53 52 54 56 55 56 53 53 53 52 52 52 51 51 52 52 52 53 54 53 51 50 51 53 53 54 53 51 52 54 53 54 53 53 53 55 56 57 56 56 55 57 56 56 57 55 55 53 53 52 51 50 51 52 50 49 48 50 50 49 49 51 50 48 48 49 48 49 49 49 47 47 49 49 47 46 44 43 43 41 40 38 38 38 38 38 37 33 29 24 21 20 21 25 31 39 49 138 123 123 124 119 121 122 119 120 123 125 127 123 121 123 122 121 127 126 121 123 122 117 116 117 121 121 121 52 52 49 47 46 45 43 42 42 44 44 43 43 41 38 37 35 35 34 33 34 32 32 32 32 30 28 28 30 31 33 31 31 30 30 31 34 37 39 40 41 40 39 38 36 36 35 35 31 34 38 42 48 46 41 35 30 35 56 73 78 76 86 92 93 82 78 65 54 61 61 54 60 74 95 115 131 132 131 130 90 144 241 254 237 185 94 54 44 43 41 48 70 90 102 115 92 87 70 56 47 44 42 42 40 40 40 40 42 44 48 51 54 55 53 52 54 53 53 54 52 51 52 50 50 51 52 52 52 53 54 52 53 52 54 54 53 53 54 55 56 56 57 57 55 56 57 56 58 56 56 56 56 56 55 56 56 55 54 55 54 55 53 54 51 50 52 52 50 49 49 50 48 42 39 38 39 38 35 33 31 32 31 30 27 26 26 25 24 38 53 107 122 120 120 121 126 138 153 164 168 161 152 148 139 136 130 129 130 129 129 126 125 123 108 49 22 19 19 19 27 37 29 29 40 38 38 44 49 53 56 58 65 68 67 68 68 67 64 66 64 63 63 63 63 61 61 62 62 61 62 62 63 61 63 64 63 65 65 64 64 64 63 62 63 62 62 60 59 60 60 59 60 59 61 60 58 59 58 57 58 57 57 56 55 55 57 57 56 57 57 57 58 57 58 60 60 59 59 61 62 62 61 60 58 57 59 60 61 61 60 58 55 54 51 52 50 49 44 36 34 29 22 21 18 18 21 31 69 130 163 215 239 242 241 241 236 238 241 243 238 154 106 111 205 245 233 203 169 151 127 124 137 151 150 157 179 164 115 141 146 146 100 42 25 21 24 32 27 24 22 26 29 33 35 36 39 42 44 48 52 53 54 52 54 54 52 53 52 54 56 55 56 53 55 53 52 52 52 51 52 53 52 52 53 52 51 51 53 51 52 52 53 53 52 53 55 53 54 53 55 54 54 55 56 55 55 55 56 55 56 57 55 54 54 54 51 50 52 52 52 50 50 48 48 51 49 49 49 48 48 49 49 47 49 51 51 48 49 47 47 48 47 46 42 42 43 41 40 38 37 36 37 36 34 28 24 21 20 21 24 30 37 44 130 128 124 123 123 124 125 126 127 126 124 126 124 123 124 123 124 138 133 123 121 121 121 118 119 119 119 121 67 67 65 64 62 61 58 56 54 52 49 51 52 51 47 45 42 40 38 36 36 37 37 36 33 32 32 31 32 33 33 32 31 30 29 29 31 34 35 37 38 41 43 46 46 45 44 46 42 41 43 39 35 33 35 42 57 69 76 79 82 85 76 75 59 46 33 32 37 40 44 49 59 70 112 159 225 207 162 139 109 142 225 254 243 201 173 102 81 82 85 93 188 156 121 125 110 100 72 58 48 45 43 42 41 41 41 41 40 44 49 52 53 52 53 54 53 52 47 47 46 44 45 44 45 45 44 44 46 45 48 48 49 49 48 49 50 49 50 52 53 53 55 55 55 53 59 58 56 57 57 56 55 55 56 57 55 55 56 55 55 54 52 53 52 51 48 48 50 50 50 50 48 44 42 40 39 39 36 34 32 35 36 34 29 28 28 26 24 32 46 80 131 119 125 123 121 122 124 127 128 126 125 124 123 123 123 125 129 126 124 124 121 119 104 52 20 19 19 20 26 41 36 30 39 36 35 43 50 54 53 57 65 68 67 67 64 63 64 63 62 62 62 62 62 61 61 62 62 62 60 61 61 62 65 65 67 65 66 67 65 64 64 62 61 59 60 59 58 58 59 59 60 58 59 60 59 58 59 58 57 56 57 55 56 55 55 55 56 55 56 55 55 56 57 59 59 58 61 62 63 64 61 61 60 60 60 62 61 61 61 60 56 52 51 54 51 51 43 37 32 30 24 22 19 19 19 25 53 107 160 214 242 241 241 237 242 241 242 245 231 144 110 117 215 243 226 180 162 148 123 123 144 143 142 146 174 169 135 165 155 144 89 47 26 23 23 32 26 24 23 27 31 34 36 39 41 42 45 49 52 54 54 54 53 53 52 53 53 56 56 56 52 51 54 53 53 52 54 53 51 52 52 52 52 53 51 50 51 51 52 53 52 53 53 55 54 53 54 54 54 55 54 53 55 56 56 56 57 56 56 55 55 55 54 52 50 52 51 52 51 51 50 49 49 50 50 49 49 49 51 49 48 48 49 48 49 49 49 47 48 47 46 45 43 42 43 41 40 38 37 36 37 35 35 30 24 21 19 20 23 27 37 40 107 133 124 124 128 127 125 127 129 127 126 126 128 128 125 125 126 125 122 126 126 123 126 122 121 122 122 121 69 70 70 67 66 65 64 62 61 57 54 57 63 63 59 56 52 49 47 44 42 41 40 41 39 37 38 37 37 35 35 33 32 32 31 31 32 34 34 35 37 40 43 44 46 46 42 40 37 35 38 38 43 50 60 68 76 80 82 74 58 52 43 44 37 37 40 46 55 64 74 82 96 100 121 157 234 251 236 196 125 127 206 251 247 199 192 138 124 126 134 93 187 170 127 122 117 110 77 63 52 48 45 44 41 41 41 40 43 42 48 51 54 54 53 50 48 47 44 44 42 42 41 42 41 41 40 41 38 40 40 40 41 41 40 42 44 43 45 46 48 48 50 52 54 52 57 58 57 56 56 56 55 55 56 56 55 54 55 55 54 53 52 51 51 48 45 45 46 46 48 46 47 43 42 42 41 40 37 35 35 37 38 38 36 34 32 30 31 35 47 53 127 123 124 126 121 120 119 120 121 119 122 121 123 123 122 123 124 124 123 121 122 120 100 52 20 22 21 23 27 34 36 30 33 35 36 43 50 54 53 57 64 68 67 66 65 64 62 63 61 60 61 61 62 62 61 63 61 62 61 62 63 62 63 64 64 64 65 64 64 63 62 60 61 59 59 58 57 58 57 56 57 59 57 59 59 58 59 58 57 58 57 57 56 55 56 57 56 55 57 55 56 57 58 58 59 59 60 62 61 62 62 63 61 59 59 60 59 59 60 59 55 52 52 54 52 50 42 36 33 30 25 22 19 20 19 23 45 88 155 191 245 244 247 243 243 244 243 244 224 138 116 124 230 240 236 226 201 147 128 125 147 138 140 144 165 154 171 150 146 143 83 49 23 23 26 30 25 22 24 28 33 34 36 36 40 42 47 49 52 54 54 55 54 54 51 51 53 56 54 53 53 53 52 52 50 51 52 52 52 53 52 51 52 52 51 50 51 52 54 54 54 54 54 53 53 54 55 55 55 56 54 55 56 58 55 56 56 55 56 55 55 56 52 52 52 52 52 53 53 51 51 50 50 49 49 47 50 49 51 49 48 48 48 47 48 49 49 47 46 46 46 45 43 42 40 42 39 39 38 38 38 36 35 30 25 22 19 21 20 24 37 42 89 138 126 123 125 126 128 127 126 128 126 127 129 127 126 128 129 127 127 128 127 125 126 124 121 126 125 122 73 68 64 64 61 60 60 58 58 55 52 52 56 59 61 63 62 60 57 56 56 54 51 51 49 45 43 41 42 41 41 39 36 36 34 34 34 33 34 34 34 35 40 45 53 51 52 54 56 59 68 69 74 72 75 75 69 56 45 40 38 37 41 45 52 57 65 69 68 67 68 77 91 103 131 146 151 176 223 247 216 149 173 238 250 207 183 165 127 128 147 100 159 185 161 191 117 110 90 73 62 55 50 47 42 42 44 44 44 42 49 53 54 53 51 48 46 44 46 44 42 43 42 41 40 39 37 39 38 36 40 39 37 37 38 38 39 38 39 39 42 41 43 44 47 48 52 52 55 54 55 55 53 55 55 54 55 56 54 53 51 49 47 46 44 43 42 42 42 42 42 42 42 42 39 40 40 39 39 40 40 41 42 42 44 42 38 35 37 39 46 39 106 125 122 125 122 123 121 118 118 121 119 120 121 120 121 122 122 126 127 124 119 118 102 49 25 24 25 25 30 35 39 35 32 33 38 44 51 51 51 54 61 66 66 66 63 63 63 65 62 61 62 61 60 64 64 64 61 62 62 63 62 62 63 64 64 61 61 61 63 62 60 58 60 58 57 55 55 57 57 56 57 57 57 59 58 60 58 60 59 58 58 57 57 57 56 56 57 55 56 55 56 56 57 57 57 59 60 63 63 63 63 62 62 59 59 57 57 58 62 58 52 53 54 55 54 49 42 37 35 32 26 23 21 19 21 22 36 60 145 163 244 240 241 230 240 246 240 243 211 124 118 135 237 244 245 242 233 150 132 124 169 168 164 151 140 124 189 159 125 129 67 35 27 25 25 30 24 22 25 29 36 36 37 37 40 43 47 50 52 53 53 54 54 54 53 54 55 54 57 53 52 51 51 52 50 52 52 52 53 54 53 53 53 52 51 51 51 52 54 53 53 52 52 54 53 54 55 54 55 56 54 56 56 56 54 56 57 55 55 56 53 53 52 53 53 52 53 50 52 51 51 51 51 50 48 48 49 48 49 49 49 48 49 48 48 48 48 48 48 47 45 43 43 42 42 41 39 39 39 37 37 36 36 32 26 24 21 21 21 24 34 45 69 136 127 125 124 128 130 129 126 128 128 131 129 128 128 127 130 131 133 132 125 123 126 129 128 128 126 124 143 135 117 115 98 90 85 84 83 85 81 77 74 73 72 69 68 64 62 59 58 59 58 59 57 55 51 48 47 45 43 42 40 39 40 38 37 35 33 32 32 31 40 51 71 70 71 71 72 72 69 67 62 54 48 45 44 40 42 44 46 51 58 62 76 72 66 64 70 78 87 92 92 92 97 107 141 165 157 182 235 219 164 212 253 218 178 180 132 130 141 121 126 193 195 198 144 124 91 82 71 64 55 51 49 46 46 45 44 43 46 50 52 51 49 47 45 46 45 42 41 40 40 38 39 39 38 38 38 37 38 38 39 38 38 39 39 36 38 39 40 39 41 41 42 42 44 46 47 48 52 53 53 54 53 54 55 54 52 51 49 47 44 43 43 42 41 39 40 39 38 39 39 39 36 39 38 39 38 41 41 43 46 46 45 44 40 39 36 38 41 45 68 127 121 126 125 126 122 121 117 119 120 120 123 124 121 124 128 133 130 124 126 132 110 45 27 27 27 30 37 44 43 39 33 33 42 47 48 50 51 53 61 65 66 64 64 64 63 63 63 62 62 62 59 63 63 64 62 62 63 63 61 61 62 63 61 61 60 60 59 60 59 59 58 59 56 55 55 56 55 58 58 58 58 57 58 58 59 59 61 59 61 61 58 57 56 57 58 57 55 55 57 56 58 59 59 58 60 63 64 64 64 62 61 59 60 57 56 58 59 56 52 52 55 54 54 52 43 38 36 32 25 22 21 19 20 20 31 50 132 153 228 241 239 232 235 244 241 241 204 118 120 144 238 239 239 243 231 145 137 125 208 234 222 202 97 74 113 144 148 136 54 32 27 26 26 31 24 24 26 30 38 37 37 38 40 41 46 51 52 53 54 55 54 53 53 54 54 54 56 53 52 52 53 52 53 51 53 51 54 53 52 52 54 53 50 49 50 52 53 51 52 53 52 55 54 56 56 55 54 56 55 57 56 56 56 57 58 54 55 55 52 52 53 53 54 55 52 52 53 51 51 51 51 50 49 50 49 48 48 48 50 48 49 49 47 47 48 48 45 47 46 45 44 44 41 40 40 38 39 38 37 36 37 34 28 24 21 21 21 23 33 43 60 134 131 125 129 131 135 134 132 130 129 130 131 130 129 129 126 129 134 129 121 122 125 125 126 128 129 126 163 163 162 163 150 135 132 131 157 168 162 152 137 136 143 150 140 131 118 107 101 94 86 83 76 72 66 64 60 59 55 51 55 53 50 47 42 37 31 29 26 26 32 41 38 38 41 46 51 47 42 40 39 41 41 43 47 52 58 64 75 80 81 75 73 78 100 114 120 123 126 128 124 117 120 116 107 120 155 138 139 208 206 182 241 221 185 184 145 125 131 148 104 181 203 157 137 143 95 71 79 78 71 61 55 53 49 48 47 47 47 51 50 51 49 46 46 47 43 44 38 39 39 40 40 40 41 41 39 40 41 39 40 40 39 39 38 38 38 38 37 37 38 39 39 39 40 40 39 41 45 47 49 52 52 53 54 52 51 50 49 46 43 42 41 39 41 39 38 36 36 36 37 37 36 37 37 38 37 39 43 43 49 48 46 46 41 38 36 35 42 48 49 104 126 126 125 127 121 122 120 117 118 121 124 127 126 126 125 124 125 128 130 128 111 48 36 38 43 48 54 60 57 46 32 30 43 48 46 48 49 50 60 65 64 62 64 64 63 64 64 62 63 62 62 62 63 60 61 59 61 59 59 60 59 58 59 59 60 59 58 58 58 58 57 58 55 55 54 55 54 55 56 56 57 57 58 58 58 59 59 61 58 59 57 58 58 60 59 56 54 57 57 55 56 59 59 58 60 62 64 64 65 63 63 60 59 58 55 52 55 55 52 54 55 52 52 51 45 39 38 33 26 22 21 20 20 19 24 44 104 151 192 241 244 245 240 242 239 241 192 119 124 162 242 234 239 235 225 141 151 131 217 233 198 152 99 109 150 217 235 202 45 32 26 25 28 32 26 24 26 31 38 37 35 37 41 43 48 52 52 53 54 54 52 53 55 55 55 56 54 54 51 53 54 52 52 51 53 53 52 53 53 52 53 52 49 50 52 55 55 55 55 53 53 54 54 55 56 55 53 55 54 55 55 55 55 54 54 55 54 50 50 52 54 55 53 53 52 52 52 51 51 53 50 49 49 48 50 48 49 49 50 48 47 46 47 46 46 47 48 48 47 44 44 43 41 40 39 39 38 38 39 37 38 34 29 23 20 20 21 24 30 40 52 116 134 130 131 132 136 136 138 134 135 135 133 133 133 135 132 133 130 131 127 124 123 125 126 129 128 129 99 108 126 125 147 131 135 136 163 180 195 180 196 211 217 224 215 214 215 208 195 191 182 176 162 155 146 131 124 116 104 100 99 98 94 83 57 39 31 29 23 24 33 29 30 31 34 35 38 38 41 43 45 46 51 62 76 76 82 90 95 88 83 90 96 100 134 125 125 126 129 130 130 123 134 127 117 110 125 161 120 128 205 184 196 205 189 180 161 125 131 157 112 164 164 141 104 133 144 62 66 82 78 73 64 62 56 52 50 50 50 50 51 50 48 44 48 48 45 46 43 42 40 40 39 39 41 42 42 42 43 42 41 40 39 39 38 37 37 39 38 39 39 41 39 39 40 39 39 41 41 44 46 46 50 52 53 51 51 50 49 47 43 43 42 38 38 37 37 37 37 37 38 38 38 37 38 38 39 40 44 45 48 48 47 47 43 40 40 42 51 56 48 70 125 125 125 126 121 122 121 119 120 124 133 132 123 120 126 129 130 130 129 129 108 47 49 57 60 62 63 65 59 47 34 31 43 55 51 47 47 51 59 62 62 60 65 64 63 64 65 63 62 63 63 62 62 60 61 60 60 59 59 59 59 59 57 58 59 58 59 57 57 57 58 58 56 56 55 56 54 55 55 55 56 57 58 58 55 57 59 59 58 60 59 58 58 58 57 56 56 56 57 56 57 58 60 59 59 60 63 62 63 63 62 60 61 58 58 54 55 54 50 52 52 52 52 49 45 41 39 35 27 22 20 21 19 19 23 40 85 152 167 236 246 246 242 241 242 241 185 125 131 175 245 240 243 240 220 142 163 137 186 165 137 160 194 217 231 237 227 164 42 30 27 25 28 30 27 25 26 32 38 36 36 37 42 44 47 50 52 54 55 54 54 55 56 56 55 55 53 53 52 53 53 53 52 52 54 53 54 52 51 51 53 52 50 51 52 54 56 55 55 54 53 54 55 55 55 55 56 57 55 54 55 55 54 53 55 54 51 51 54 55 54 54 53 54 52 51 53 52 51 53 51 50 49 49 50 48 49 48 49 50 48 46 48 48 48 47 45 47 47 45 44 44 42 42 41 40 39 39 40 40 39 35 30 26 21 21 20 24 28 35 49 98 145 128 135 133 134 136 134 131 131 133 134 134 132 135 135 134 134 135 132 132 129 129 132 131 130 130 92 83 70 64 60 60 64 68 80 89 116 118 148 185 194 204 211 216 227 229 231 232 237 237 232 236 236 217 203 160 127 132 133 135 134 134 127 108 73 50 32 31 33 34 32 32 35 41 44 48 50 55 71 92 111 108 98 103 99 97 100 112 125 119 119 113 138 130 129 128 128 133 136 123 142 128 124 125 114 119 145 100 144 180 189 197 185 183 167 137 132 143 145 146 109 107 125 129 176 90 48 52 72 77 76 70 65 63 58 56 55 53 52 53 51 50 48 48 50 49 48 46 45 44 44 43 43 42 41 41 42 43 41 41 40 39 40 40 40 39 38 38 38 38 38 39 40 38 38 38 41 40 42 44 44 47 47 48 48 50 49 49 46 44 42 38 37 36 37 36 36 36 38 39 38 38 39 39 44 46 48 49 51 51 46 43 42 42 43 51 64 73 70 51 88 121 125 125 122 121 122 125 128 133 134 115 89 105 137 127 129 132 132 129 109 49 64 78 75 73 68 64 61 52 41 32 46 55 56 47 48 49 55 61 61 61 63 64 62 65 65 63 62 62 63 64 63 63 61 61 59 58 58 57 56 57 57 58 57 57 56 56 56 57 58 58 55 55 56 56 54 54 55 55 55 55 54 55 56 56 57 58 57 59 59 58 58 58 57 58 57 56 57 57 59 58 60 61 60 60 62 62 64 64 62 61 61 58 56 56 54 52 50 51 53 51 52 50 44 40 37 35 29 23 20 20 20 21 22 31 65 137 148 207 246 237 240 235 243 245 174 141 146 185 244 241 240 239 204 146 168 149 143 160 211 231 242 235 222 194 139 97 42 32 28 27 30 29 25 24 27 33 37 34 36 36 42 44 47 50 53 52 55 54 55 55 56 54 55 54 52 53 53 53 52 53 51 52 53 53 53 51 51 51 52 52 51 52 51 54 55 53 55 54 53 54 55 55 54 54 55 55 56 57 58 55 54 55 55 53 53 53 57 55 55 53 53 54 53 54 54 53 50 50 51 50 49 49 49 50 47 48 48 48 49 46 48 47 48 48 48 46 44 43 43 43 41 41 38 37 39 40 38 40 40 35 30 26 22 20 23 23 24 31 42 79 148 136 137 136 135 135 129 122 122 129 135 137 135 138 136 137 136 135 133 136 135 131 133 134 134 131 156 154 146 141 140 133 121 111 98 88 78 71 71 75 81 86 93 101 110 121 137 155 172 177 192 200 186 157 137 138 135 133 135 138 138 140 136 137 130 119 48 36 35 41 46 53 68 73 62 59 76 105 131 121 112 110 109 105 111 117 129 137 137 126 115 118 141 134 134 134 131 136 144 127 146 130 129 130 133 120 123 122 129 188 201 207 182 186 167 154 139 136 159 144 118 101 152 115 139 116 59 46 47 75 85 79 73 70 64 62 58 56 55 56 54 52 52 50 51 51 50 50 49 48 47 48 48 47 45 45 43 43 43 43 42 41 40 39 41 40 40 38 40 38 39 39 38 36 38 36 37 40 41 40 41 42 43 44 45 47 47 48 48 45 42 41 39 37 37 37 37 36 39 40 39 40 42 44 48 50 51 52 52 51 48 46 42 43 52 66 77 88 106 88 62 93 121 126 125 126 129 131 134 144 140 77 61 81 132 129 130 132 131 132 113 49 69 84 82 76 71 70 63 57 45 37 46 56 64 50 47 49 53 56 60 61 60 63 62 65 65 65 64 62 63 63 62 60 60 60 58 56 58 57 57 56 56 56 57 56 55 56 56 56 55 57 54 55 57 56 56 56 56 56 57 54 54 54 57 56 57 57 57 58 57 57 57 57 59 57 60 58 58 59 59 58 58 60 61 62 62 63 64 61 63 63 63 57 58 57 56 54 50 50 53 50 51 47 41 40 37 33 29 24 20 19 21 20 21 24 56 120 149 174 228 235 240 235 236 244 168 159 158 192 240 238 237 232 186 163 162 159 158 163 207 237 213 178 150 152 177 123 42 33 28 27 31 28 25 25 30 35 36 36 38 38 42 44 48 50 53 53 54 55 55 55 56 55 54 53 53 53 53 52 53 54 53 52 52 53 52 51 52 52 53 52 51 52 53 55 54 54 54 54 54 56 56 57 55 54 55 55 56 55 58 57 57 54 53 53 55 56 56 54 54 54 52 54 52 53 52 52 51 50 52 50 50 50 50 50 48 50 48 46 49 48 48 47 48 48 48 47 46 45 44 44 43 41 39 37 39 40 39 42 40 37 32 27 23 21 22 23 23 28 41 66 146 145 142 138 138 137 139 136 136 136 140 141 142 144 140 140 136 135 133 134 135 133 134 134 135 133 169 162 160 161 157 156 158 159 159 157 151 147 143 138 130 127 117 107 98 92 82 77 71 67 64 62 55 56 61 64 70 76 78 89 99 102 109 110 106 117 50 41 44 95 106 100 79 79 103 128 140 128 115 116 111 108 116 126 130 130 132 132 134 123 112 126 145 135 137 135 133 141 149 129 144 138 136 134 139 135 119 134 136 170 202 210 185 185 167 164 140 131 156 155 128 94 151 84 133 125 83 54 41 59 119 100 79 76 70 69 66 62 58 60 59 59 59 57 54 53 54 53 55 56 52 53 50 50 50 49 51 51 49 49 48 46 42 40 44 42 42 43 43 41 39 38 38 38 37 36 39 37 36 35 37 36 38 40 39 41 43 45 47 45 45 45 42 39 39 40 38 39 40 41 41 43 48 50 54 54 53 50 53 50 45 43 45 56 73 87 108 133 124 163 95 63 92 117 129 134 133 135 145 157 71 61 74 106 156 145 139 137 137 134 129 59 69 82 83 77 71 71 66 61 56 42 48 62 70 57 50 49 56 54 51 52 56 58 61 63 64 65 64 63 63 62 59 59 61 60 56 56 57 56 56 55 58 55 54 55 56 55 54 53 53 56 54 54 56 56 56 56 55 56 57 54 55 54 55 54 54 54 56 54 55 56 56 58 59 58 59 58 58 60 59 59 60 60 60 61 64 65 65 63 63 64 64 64 62 59 57 54 53 51 51 51 50 45 41 40 37 35 32 25 21 20 20 19 18 21 44 93 158 149 184 197 202 205 204 205 185 188 183 193 202 202 206 208 195 184 168 157 145 137 155 169 149 167 197 220 235 129 40 33 27 26 29 27 24 26 31 36 39 37 38 39 41 43 45 48 50 54 56 58 57 57 57 56 53 52 53 55 52 52 52 52 53 54 53 53 52 51 54 53 52 52 51 54 54 54 54 53 54 55 53 54 56 55 54 56 55 55 57 56 56 56 57 56 55 55 56 55 55 52 53 53 53 52 52 52 52 52 51 52 50 51 51 50 50 51 48 48 49 48 49 48 50 50 47 47 46 46 48 48 46 45 44 42 40 38 40 40 41 41 39 37 33 29 24 22 20 21 22 28 38 47 136 149 139 140 141 140 141 142 141 141 140 141 142 144 143 139 137 137 137 137 137 136 136 133 133 131 165 161 157 154 148 151 159 162 165 167 168 168 162 157 157 157 152 143 130 122 120 115 114 107 102 102 95 91 85 81 75 73 69 67 62 61 61 63 65 66 60 56 63 78 90 108 133 143 139 137 138 134 115 107 119 130 136 134 133 135 137 137 138 122 109 131 142 134 132 134 134 142 156 124 141 136 136 137 138 135 125 133 160 131 194 205 179 183 178 165 145 134 174 191 115 108 133 89 145 130 104 62 48 45 125 135 82 65 70 69 67 67 64 66 65 64 64 61 60 57 55 54 55 55 54 56 54 54 53 51 54 54 53 55 54 51 45 48 49 48 48 49 47 44 43 42 42 41 40 40 38 38 40 36 36 35 38 38 38 38 40 42 43 44 45 45 44 42 42 41 41 41 43 45 48 51 51 54 54 53 51 50 50 45 38 45 63 73 95 125 133 140 77 102 80 69 70 79 125 114 106 125 139 136 92 75 97 183 231 174 148 144 141 138 130 69 65 81 85 77 71 70 69 64 63 52 53 70 82 63 53 51 55 52 49 48 50 52 57 61 65 64 64 62 62 62 60 58 61 62 57 56 57 57 57 56 58 56 55 55 55 53 53 54 54 55 54 54 55 56 57 54 54 55 55 54 55 55 55 55 56 56 55 54 54 56 58 58 58 58 57 59 58 61 60 59 59 62 63 62 62 64 64 63 63 65 63 61 61 60 57 55 54 52 51 50 47 46 42 40 36 34 32 27 22 22 19 18 19 20 37 68 152 151 162 193 197 195 192 189 189 185 189 196 203 205 202 198 182 169 152 143 142 139 147 160 212 232 236 230 225 108 42 35 27 28 31 27 25 26 31 38 39 37 37 41 42 44 47 49 50 53 57 58 57 57 56 55 53 51 54 54 54 53 53 52 53 54 53 54 54 53 53 54 53 52 52 53 53 53 54 54 55 54 53 54 55 55 57 57 56 56 56 57 56 57 56 56 55 55 56 55 55 53 54 53 52 54 53 52 51 51 50 49 50 52 52 49 49 50 50 49 49 48 49 47 47 48 48 46 45 46 47 46 45 43 43 42 39 38 41 41 41 41 41 37 33 29 24 22 21 21 24 27 36 43 122 149 141 137 138 140 141 139 138 138 143 141 141 144 141 139 140 139 141 140 136 135 136 137 137 136 233 231 215 150 147 135 161 175 162 158 150 127 121 121 124 137 140 144 151 153 151 151 153 151 146 141 140 136 131 127 126 124 128 127 128 131 135 132 128 126 128 139 149 157 160 157 153 146 149 138 115 109 126 133 135 135 135 136 135 139 139 137 139 123 112 141 137 130 133 135 136 144 165 128 137 136 136 136 134 137 132 124 180 139 164 195 174 175 190 164 156 135 199 211 121 152 117 118 139 144 123 83 57 48 95 154 159 129 55 49 56 60 69 73 71 70 68 67 63 64 62 58 57 57 56 58 58 57 55 56 54 55 56 56 57 55 50 52 53 52 53 53 52 49 48 47 47 47 45 43 42 41 39 37 39 38 41 41 38 37 40 42 41 43 44 45 46 46 47 46 47 46 48 51 54 56 56 55 53 53 50 49 45 43 57 78 101 124 124 96 60 46 40 39 42 44 60 72 85 88 129 172 204 208 147 98 148 239 254 224 162 150 172 202 191 115 61 74 75 73 71 76 82 71 73 99 102 92 105 77 60 53 49 45 43 44 45 47 50 53 57 60 62 62 60 59 60 59 60 59 57 58 59 58 57 57 57 56 56 55 54 53 54 57 57 56 56 56 59 57 57 56 55 55 54 52 55 54 53 54 56 56 55 56 54 54 57 57 59 59 59 57 60 59 59 59 60 60 62 61 61 62 63 62 62 63 62 59 61 60 59 56 54 51 48 47 45 42 40 39 37 34 29 26 22 21 18 21 19 20 33 50 138 147 148 176 195 185 181 183 190 197 203 206 204 199 193 176 157 145 151 150 150 146 145 160 235 235 231 235 222 94 41 34 27 28 31 27 27 29 33 37 38 38 37 39 43 45 45 47 50 56 56 57 57 57 55 55 53 52 54 53 53 54 51 52 53 53 53 53 53 52 55 53 53 54 52 53 53 53 55 55 54 54 55 54 54 55 57 56 55 56 54 54 56 57 57 57 56 56 57 56 55 55 54 53 51 53 53 52 52 52 50 49 50 53 52 50 51 48 49 48 48 50 50 49 47 47 48 47 47 47 47 46 45 44 44 42 39 40 41 40 41 42 41 36 31 29 27 23 20 22 24 24 34 41 97 150 144 138 137 136 137 139 141 140 142 144 144 144 143 142 144 143 139 136 137 137 135 138 137 137 238 237 236 172 154 153 180 234 235 235 228 176 167 175 135 172 138 120 111 104 100 104 106 109 112 114 119 125 129 138 142 147 152 153 157 158 157 152 141 127 131 143 161 154 144 130 120 113 104 114 126 134 134 135 138 139 137 137 138 139 133 134 139 127 109 145 136 133 137 137 137 149 164 136 140 138 136 135 135 139 141 131 172 148 145 186 180 176 192 171 164 144 195 211 165 161 110 128 143 148 132 107 68 60 75 191 230 232 142 46 35 42 57 70 81 83 80 78 71 71 65 65 60 59 58 59 58 58 58 55 55 53 56 52 51 52 56 57 57 56 55 56 55 53 52 51 48 49 46 45 45 43 43 43 43 43 43 43 39 39 41 42 42 45 46 46 48 49 49 50 53 53 55 57 57 58 55 53 53 51 47 47 54 70 95 118 135 98 55 46 40 44 49 56 76 93 109 113 121 127 147 179 236 252 233 176 187 246 254 249 184 159 197 204 195 141 65 64 60 60 68 83 93 119 145 160 158 120 119 85 62 52 45 43 41 42 44 46 47 49 52 55 57 60 60 59 59 58 59 58 58 56 58 57 56 56 55 55 55 54 53 53 54 56 57 57 58 58 60 57 56 56 56 57 54 55 55 53 54 54 55 57 55 55 54 55 55 55 58 60 58 58 60 60 59 60 61 61 62 61 61 62 63 62 62 61 60 58 61 59 58 54 50 47 43 43 41 39 41 40 36 33 29 26 23 22 20 20 20 21 29 47 118 147 146 156 184 187 195 203 207 207 207 202 189 177 167 159 151 147 151 153 152 146 148 150 179 178 188 206 193 76 34 32 28 29 33 27 28 30 34 40 41 38 38 40 44 46 45 49 52 56 57 57 57 56 56 55 54 54 53 52 52 54 51 53 54 54 55 55 55 53 53 53 53 56 54 54 54 55 55 53 54 54 54 55 54 56 56 57 57 57 54 55 56 57 57 57 56 57 56 55 55 55 54 55 54 55 52 53 53 51 50 51 50 51 50 50 48 47 50 49 48 50 48 48 47 49 49 47 49 47 46 47 45 45 44 41 39 40 42 42 41 42 41 38 34 29 27 24 20 23 22 23 30 41 77 145 147 142 138 140 140 139 140 143 143 145 142 142 144 148 144 143 138 136 140 143 140 140 139 138 239 239 238 210 148 160 155 226 241 240 236 205 167 199 167 158 146 142 145 148 146 147 143 141 141 135 122 120 108 104 100 97 94 94 95 99 97 94 89 99 108 101 117 123 117 109 110 120 140 139 136 135 139 141 137 138 140 138 138 135 133 133 142 127 114 149 138 134 134 135 137 161 162 137 143 140 139 139 142 142 144 138 164 152 130 171 165 172 188 186 166 158 177 195 158 124 117 125 158 174 160 124 103 73 62 174 243 244 222 84 39 44 68 79 101 122 141 147 145 127 92 80 76 72 68 65 68 66 66 62 60 58 59 54 51 52 57 58 59 57 56 57 58 58 56 55 53 53 50 49 48 47 47 48 47 48 46 42 43 44 45 45 44 45 47 46 47 48 52 55 59 60 59 60 59 59 56 57 59 61 72 85 99 109 120 77 43 43 48 52 60 79 100 119 125 121 115 114 118 129 150 170 180 191 217 228 223 239 253 253 216 199 206 213 218 227 121 65 58 61 80 122 203 237 231 179 143 145 123 86 60 48 44 42 40 41 44 44 44 46 48 50 56 58 58 58 58 55 56 55 56 54 54 54 53 51 50 50 49 50 49 50 50 52 53 55 56 56 56 55 54 56 57 58 55 57 57 54 51 52 56 56 53 54 55 55 56 56 57 58 59 60 60 59 58 59 60 60 61 61 62 62 62 60 57 56 54 54 55 54 52 48 45 43 40 41 39 38 39 38 33 33 29 26 23 23 20 18 20 22 27 44 95 150 142 145 162 193 210 207 200 196 182 169 157 152 154 159 151 150 149 151 150 143 126 117 88 81 93 109 114 55 34 33 33 34 40 30 29 30 34 39 38 39 40 40 43 47 46 48 49 54 58 58 57 56 55 54 54 54 53 52 54 52 51 53 54 53 53 53 55 54 54 53 53 54 53 53 55 56 55 54 54 54 54 55 55 54 55 56 57 57 55 55 57 57 57 58 57 57 55 56 55 55 55 55 54 53 53 53 52 52 51 51 51 50 48 49 49 49 50 48 48 49 47 47 47 49 46 48 48 48 47 46 46 44 44 42 39 39 39 41 40 43 41 39 33 30 27 24 22 21 20 21 26 38 60 135 148 141 138 139 143 142 144 145 144 144 140 142 144 146 143 141 138 135 139 140 138 138 139 139 239 241 238 236 161 164 148 195 245 236 222 181 162 189 185 148 149 142 146 146 145 150 146 146 144 144 148 146 141 142 136 138 134 131 130 123 111 112 127 130 135 130 120 119 129 134 144 146 141 138 140 138 139 141 136 139 144 140 136 136 136 137 145 132 118 151 140 142 141 139 138 164 152 142 143 141 142 142 144 145 144 142 151 164 134 184 136 140 177 191 167 157 156 181 172 126 120 130 194 232 211 133 126 102 76 106 215 238 216 81 40 71 182 203 215 225 233 234 228 204 139 124 117 110 102 96 92 90 85 81 78 76 72 71 65 61 61 62 61 61 61 61 59 61 58 58 57 56 53 53 51 51 51 51 50 52 48 45 48 48 48 48 49 49 49 50 50 52 57 60 60 63 63 65 66 68 71 72 79 82 87 87 84 68 50 48 52 56 72 88 114 122 120 120 138 149 149 143 143 140 127 122 158 190 187 177 216 237 254 253 242 244 244 246 242 241 205 129 100 120 182 223 242 245 236 172 126 126 103 73 65 53 42 42 42 42 42 41 41 42 46 48 54 56 56 55 56 53 53 51 50 49 48 49 45 44 46 45 45 43 45 45 44 46 46 47 48 48 49 50 48 50 53 53 52 53 55 56 54 55 57 57 54 57 56 56 56 55 59 56 58 58 59 60 59 61 60 58 60 62 63 61 60 58 53 51 50 52 51 52 52 46 45 43 41 39 37 37 37 36 35 35 34 29 25 25 21 18 23 24 27 41 72 147 141 144 150 163 179 182 177 169 158 151 148 150 158 162 149 148 146 152 143 126 110 103 92 84 90 94 87 51 33 35 33 38 47 34 29 33 35 37 37 38 37 40 43 46 46 47 47 53 58 58 55 54 54 55 53 53 54 54 53 52 52 54 54 55 55 55 55 54 54 53 54 52 53 54 55 55 54 54 54 55 55 55 56 55 55 56 57 57 56 57 59 58 59 57 57 57 57 55 55 54 56 53 54 55 53 53 52 51 51 51 50 50 50 50 50 49 50 51 50 50 49 49 48 48 47 48 46 48 48 48 46 43 43 41 39 39 40 40 41 43 40 37 33 30 27 24 24 24 22 21 25 36 52 123 150 139 139 140 141 141 144 147 142 140 139 141 140 141 140 141 140 139 140 139 140 138 138 140 239 241 237 244 190 173 151 155 205 176 152 150 156 168 196 165 142 148 145 144 144 150 149 142 147 144 138 136 140 140 141 138 135 132 129 127 137 146 144 135 143 143 147 145 140 138 142 143 139 139 140 141 142 143 141 144 145 141 137 140 141 146 152 140 124 149 142 146 146 143 138 172 145 152 143 141 143 145 142 143 144 144 136 178 145 152 128 114 157 185 175 142 140 156 168 126 112 129 198 241 241 184 122 140 144 125 111 121 118 60 50 102 204 206 212 219 222 197 155 136 138 142 136 143 133 128 130 131 122 122 121 112 109 107 104 103 99 93 91 88 82 79 79 79 75 70 69 67 65 66 62 60 60 60 62 63 63 60 60 59 58 57 55 55 50 47 46 47 43 45 58 58 58 59 65 70 69 64 61 57 57 55 50 52 64 72 85 105 121 124 121 123 137 131 164 174 146 131 133 136 150 158 143 131 187 203 171 185 238 254 242 242 242 244 245 242 246 240 235 238 242 243 242 236 199 124 63 48 79 73 75 67 46 43 42 41 40 40 40 41 43 46 50 56 55 54 55 52 48 45 44 42 40 42 40 41 42 40 40 39 40 40 40 40 39 40 39 39 41 40 41 41 41 43 44 46 48 51 51 54 56 56 55 55 54 56 58 58 60 58 57 60 59 60 59 59 60 59 61 59 58 59 57 55 50 51 51 50 49 50 51 47 45 43 42 39 36 35 34 34 34 37 39 34 26 26 25 23 23 24 30 38 57 133 144 142 144 148 157 163 159 153 149 148 149 155 162 161 145 150 149 137 122 112 104 106 102 102 104 106 82 42 34 34 35 38 45 40 34 37 34 37 37 37 39 41 42 44 44 45 47 54 56 56 53 52 53 53 53 53 54 54 52 51 52 55 55 53 53 53 54 54 54 52 52 53 53 54 54 55 55 55 54 55 55 56 56 57 56 56 56 57 55 55 56 57 57 57 58 56 55 56 56 55 56 55 54 54 54 53 52 52 52 53 53 52 52 50 50 48 49 48 48 50 51 52 51 50 50 50 48 47 48 47 46 44 43 42 40 40 41 41 43 43 39 38 36 31 27 24 24 25 22 21 23 31 45 102 151 139 138 138 139 141 140 140 141 141 140 139 138 138 140 142 140 139 139 138 139 144 152 162 236 233 231 228 190 160 175 137 166 145 148 149 148 160 191 184 140 151 149 144 144 148 140 137 138 136 136 133 139 138 139 134 122 123 140 143 144 144 137 143 147 148 151 148 140 140 139 142 138 139 137 140 141 141 138 143 139 135 141 143 145 149 167 142 130 155 145 148 145 144 140 181 136 153 143 150 154 155 148 147 149 145 130 182 145 140 123 107 141 179 185 132 165 138 156 130 99 131 180 241 243 229 164 152 167 165 161 149 128 113 94 88 98 101 100 104 103 85 83 89 96 104 114 123 123 129 138 131 126 125 129 126 129 127 125 128 135 133 132 132 122 117 113 109 111 105 102 99 93 90 85 82 78 79 81 83 82 79 79 77 71 58 55 48 41 39 34 32 36 41 39 41 47 52 56 55 54 53 52 50 53 60 75 83 88 104 121 124 125 126 129 128 143 150 161 178 150 139 139 142 142 145 152 147 145 189 198 157 190 246 241 238 243 241 243 244 245 242 241 239 239 241 217 198 167 139 99 59 49 69 74 81 58 44 42 41 41 42 40 40 42 44 51 56 56 53 53 49 44 41 41 40 40 40 40 39 40 39 39 38 40 39 38 38 36 38 37 38 41 38 36 38 39 40 41 41 42 43 46 48 50 51 54 55 55 56 56 57 58 60 59 57 60 60 60 60 61 59 60 58 55 55 51 50 48 47 46 47 47 47 49 47 44 43 44 41 37 35 34 34 34 38 41 38 31 29 27 26 26 28 38 49 50 106 151 139 144 145 149 153 154 153 153 151 154 158 162 158 153 157 143 119 115 109 103 104 105 108 106 107 68 39 35 37 37 42 49 49 41 39 37 36 36 40 41 42 43 44 43 44 46 52 55 54 53 53 53 54 53 53 53 54 53 53 54 53 56 55 55 54 56 56 55 55 53 53 54 55 54 54 54 56 56 55 55 54 53 54 55 57 57 57 56 57 58 58 58 57 58 57 56 54 56 57 56 55 54 54 53 54 54 54 53 52 51 52 51 51 50 50 50 49 50 51 52 51 51 50 50 50 48 48 48 47 46 45 44 44 41 41 42 42 45 45 42 39 36 32 29 26 24 24 22 21 22 26 43 78 159 145 139 138 136 137 138 139 139 139 137 139 136 138 139 142 141 139 144 151 168 187 209 226 239 232 206 167 152 156 169 164 157 159 147 150 150 153 172 195 159 148 145 145 146 144 136 135 140 142 141 137 139 134 119 116 126 141 141 139 142 140 139 140 136 145 148 149 142 143 145 142 143 142 140 140 141 140 139 141 140 140 140 143 139 150 181 138 142 155 151 150 149 145 148 192 132 160 156 161 156 161 168 178 195 196 138 190 136 136 117 115 115 174 176 137 192 137 134 124 99 129 163 218 240 241 227 170 141 148 150 150 154 159 161 165 158 152 144 138 128 114 97 89 82 71 62 58 58 59 63 68 73 83 90 94 98 104 117 123 122 124 131 137 141 137 137 135 135 135 141 142 143 140 135 134 136 141 136 134 128 122 118 123 125 103 71 56 40 37 35 30 39 36 39 46 49 51 53 54 53 51 59 83 112 111 106 111 125 128 134 151 145 144 142 141 143 158 162 181 156 153 148 149 149 151 154 164 169 153 198 178 146 198 245 237 242 240 243 245 247 242 241 240 226 190 191 206 135 121 124 98 46 50 73 78 81 62 48 45 42 43 41 38 42 44 48 54 54 53 50 44 40 40 38 37 37 39 37 38 39 37 38 38 38 37 37 37 35 35 36 38 38 36 35 36 38 36 37 38 39 40 39 40 43 44 46 48 49 53 56 56 58 58 58 57 59 58 57 56 57 56 56 53 51 49 46 44 43 41 42 42 43 43 42 41 40 40 42 40 40 39 39 40 39 43 45 45 41 38 36 36 37 41 50 57 49 66 159 143 142 143 146 147 149 151 155 155 161 164 168 167 167 167 113 108 113 109 108 105 104 107 99 92 61 37 38 41 43 46 52 60 59 43 43 37 35 39 42 42 42 43 43 42 45 52 53 55 53 52 52 53 52 53 54 54 53 52 53 54 53 54 54 54 55 54 55 54 52 55 54 53 54 55 54 53 54 56 55 55 56 57 57 56 56 57 55 56 58 58 59 58 56 57 56 57 56 55 54 55 52 55 53 54 53 53 52 50 52 53 52 51 51 50 51 50 51 50 51 49 50 51 50 50 48 49 48 47 45 46 45 42 41 43 42 43 44 42 42 39 38 33 29 27 24 23 23 21 21 28 42 54 155 149 140 137 138 140 142 144 143 142 140 143 146 147 151 159 171 186 209 227 240 245 243 245 243 226 178 154 151 168 158 189 157 174 171 163 146 152 168 182 178 147 145 139 137 136 141 142 143 142 141 133 121 127 128 132 138 142 144 141 146 144 141 143 151 149 147 148 141 141 148 150 146 143 146 148 147 147 147 145 146 148 146 146 145 151 184 130 152 155 150 149 145 144 152 197 129 163 171 185 200 214 225 233 236 227 150 197 131 146 116 116 101 152 168 135 190 129 141 124 96 131 157 205 242 240 238 226 167 129 126 119 108 117 151 158 155 150 149 146 149 151 147 148 148 142 144 139 126 120 107 97 81 77 67 66 62 59 60 62 62 67 68 77 88 94 101 108 116 123 133 134 140 144 140 138 140 140 138 138 136 137 134 139 140 130 131 121 91 66 41 38 38 45 46 51 57 59 56 55 57 94 137 137 117 116 123 126 131 143 168 194 159 145 145 145 142 166 158 182 165 153 152 151 159 173 203 225 235 181 174 202 144 149 222 228 244 243 244 247 247 244 240 218 163 149 196 150 114 97 94 114 67 43 54 71 80 78 62 51 45 45 44 41 43 46 52 54 54 52 45 40 40 40 36 38 37 36 36 36 35 36 36 37 38 37 37 36 33 34 35 38 36 35 36 36 38 36 35 37 37 36 37 38 40 40 42 42 44 48 52 54 57 58 57 58 58 57 56 55 55 53 49 47 46 45 44 43 42 42 42 40 40 39 39 38 36 36 37 35 36 37 40 41 44 47 49 48 46 43 40 41 43 45 51 53 54 49 144 148 140 141 146 147 149 150 152 152 168 171 172 175 165 155 100 106 109 110 112 112 107 108 103 94 57 38 44 42 45 49 51 58 57 48 48 37 33 38 43 43 43 42 41 43 47 51 54 53 52 51 53 53 52 53 54 54 53 54 54 55 54 54 53 56 53 54 53 52 52 54 54 53 54 54 54 53 55 55 56 54 55 57 56 55 56 57 56 56 58 57 58 57 56 57 60 58 56 55 55 56 55 54 55 55 54 54 52 53 52 51 52 51 51 50 50 50 50 50 50 49 49 50 50 50 49 49 48 48 46 45 45 44 42 42 42 43 42 43 43 39 37 34 31 27 26 25 22 21 22 25 40 48 138 172 180 172 169 168 174 180 182 183 184 191 197 204 215 224 233 238 240 243 244 242 240 244 242 232 219 193 176 173 155 169 185 180 186 181 135 146 167 161 192 157 194 193 148 146 142 145 138 127 124 129 136 137 139 139 137 140 146 147 144 141 144 147 151 148 147 146 147 147 146 147 146 147 150 148 146 148 149 148 146 143 143 149 151 150 177 128 167 160 157 149 158 165 159 199 128 176 239 242 244 243 242 241 236 222 156 203 127 157 115 95 115 123 172 147 187 119 157 134 92 139 136 176 233 241 240 242 243 227 196 171 140 116 122 139 138 143 144 146 148 151 152 149 144 143 144 145 149 153 154 154 160 162 159 155 145 143 134 129 118 111 106 97 88 81 73 66 61 56 54 59 61 64 71 75 87 92 97 103 108 114 118 119 123 130 137 133 140 134 46 43 46 65 71 77 73 69 82 114 158 153 117 112 127 130 132 140 145 148 185 191 180 146 146 146 153 166 164 179 175 168 184 196 227 240 246 244 244 239 167 201 172 135 178 202 249 247 244 245 246 234 185 146 139 148 139 107 96 78 67 78 89 55 40 45 66 75 81 71 53 48 48 45 48 51 52 55 55 49 41 40 39 37 35 35 36 38 36 36 35 35 35 35 35 35 35 33 32 33 34 36 34 35 33 34 37 36 35 36 37 36 36 36 38 37 38 39 39 41 45 48 53 54 56 57 56 58 56 55 55 52 46 44 41 41 40 39 37 36 35 35 36 36 35 36 33 33 34 34 33 34 36 39 44 48 52 52 48 45 41 41 40 43 54 63 72 52 103 158 145 141 149 151 149 149 153 156 173 176 167 137 144 125 98 102 101 102 109 112 112 113 110 98 53 43 50 49 48 47 48 49 53 51 52 41 35 39 45 45 43 40 41 45 47 52 53 53 51 50 53 54 52 53 55 54 53 53 54 53 53 54 54 54 54 53 52 52 53 54 53 53 52 52 55 54 55 56 55 56 58 57 55 56 55 56 56 57 57 58 57 56 56 56 58 57 55 56 55 54 56 56 55 54 54 55 54 54 52 52 52 52 52 51 50 50 50 50 49 50 49 49 49 51 50 49 49 49 47 45 45 45 44 42 42 42 43 45 44 41 39 35 30 28 27 25 22 21 21 24 35 46 111 186 246 245 240 242 243 243 242 242 243 246 241 238 240 239 239 240 240 240 238 238 238 241 231 230 234 227 222 220 177 132 183 171 136 135 138 145 156 158 177 189 168 184 145 148 144 133 127 126 136 143 145 143 140 138 142 143 146 145 143 141 143 147 150 146 146 146 144 141 146 147 145 149 150 144 144 148 147 150 144 145 151 151 148 155 174 130 175 170 184 195 216 218 164 185 134 191 242 239 239 240 240 238 236 208 158 200 126 168 111 94 113 122 155 160 193 114 157 123 94 140 128 168 223 243 243 243 246 242 213 192 151 142 150 148 133 133 127 123 118 114 113 111 111 116 119 124 133 142 146 151 157 158 157 159 152 151 152 155 152 151 152 150 150 149 145 140 136 131 121 118 105 96 85 82 71 66 63 61 61 63 64 64 70 71 81 83 88 89 54 53 59 71 71 82 116 143 160 145 124 125 127 123 136 145 143 143 144 140 184 184 191 148 152 152 162 173 168 174 180 200 240 241 242 244 242 240 242 242 201 182 189 134 178 189 247 247 243 237 206 166 140 144 138 127 121 97 80 66 58 50 89 73 45 39 43 58 80 86 73 58 53 53 57 57 52 51 50 45 40 37 38 37 34 35 36 36 35 34 34 35 34 33 33 34 32 31 32 34 34 34 34 33 34 34 34 34 35 35 35 34 35 36 35 36 37 36 36 39 39 41 44 45 51 54 56 59 56 55 55 53 49 44 40 39 37 38 35 35 34 33 34 34 33 35 32 31 33 34 34 34 35 39 48 50 50 55 51 45 42 41 42 49 62 82 108 67 73 155 151 144 146 151 151 151 157 163 183 174 131 93 87 92 88 94 97 94 100 102 110 114 115 104 49 46 56 55 53 48 45 47 48 49 51 43 42 44 48 48 44 40 41 45 50 53 53 52 52 52 53 52 50 52 54 54 55 54 54 53 54 55 54 54 55 53 54 54 54 54 54 54 53 52 52 53 54 57 55 56 56 55 54 56 58 57 57 56 57 58 57 57 57 56 57 56 55 56 54 55 54 55 54 54 54 54 53 54 52 52 53 53 54 53 52 52 51 50 50 51 50 50 50 50 49 49 48 49 47 44 45 47 43 43 43 42 45 46 43 42 40 36 33 29 28 27 24 22 21 23 32 45 95 167 244 243 241 242 244 242 244 240 242 244 240 236 242 242 240 241 240 240 240 240 240 238 235 236 236 235 223 219 175 101 145 165 198 203 186 175 165 161 125 168 159 150 140 136 133 135 141 148 147 149 148 149 144 142 141 144 150 145 146 145 145 149 149 149 144 141 138 140 145 146 147 147 149 148 147 151 148 149 147 148 153 154 159 161 182 131 202 230 230 234 234 221 170 176 137 198 239 234 231 239 239 236 237 198 168 193 129 174 148 97 93 121 134 172 189 109 153 111 88 118 140 160 195 236 232 228 212 187 156 149 148 146 148 156 154 153 151 146 145 147 151 148 141 136 125 118 111 106 99 97 102 104 108 113 120 124 131 137 142 143 144 146 150 150 148 148 151 150 151 153 155 152 151 157 153 155 149 150 143 136 130 124 119 115 106 104 99 98 104 112 126 141 163 174 166 152 143 148 136 127 137 159 154 148 144 145 148 144 178 176 191 153 181 210 233 235 174 169 185 194 246 241 244 242 238 240 241 241 230 183 201 153 137 180 233 237 205 175 145 144 145 145 137 121 126 95 67 54 46 51 94 92 62 43 37 34 53 70 75 66 64 65 63 63 57 51 47 41 40 38 37 36 37 35 34 34 35 35 35 34 33 32 33 34 32 31 32 31 32 32 32 32 32 33 33 33 32 33 33 33 34 35 34 34 35 36 37 39 36 37 38 38 41 45 51 54 54 56 56 56 54 50 43 41 38 35 36 34 33 34 32 32 32 33 32 32 31 31 32 33 36 42 48 51 57 56 46 44 42 40 52 65 93 117 122 85 59 123 160 150 151 154 153 154 164 175 172 114 141 111 77 68 77 96 102 107 106 103 108 109 115 109 45 54 62 65 60 54 49 48 46 45 52 47 47 51 53 51 44 42 41 45 49 51 51 51 53 53 53 53 52 53 52 53 55 54 54 54 54 55 57 55 55 54 54 55 53 54 55 53 51 52 52 53 52 53 54 54 53 53 54 56 57 57 57 56 57 57 58 56 56 56 57 55 54 54 54 54 55 55 56 54 54 53 53 52 52 51 53 52 53 53 50 52 52 50 51 51 50 49 51 51 50 48 47 48 47 47 48 48 45 44 44 43 45 46 44 44 40 36 35 30 28 26 23 23 21 21 27 43 78 151 233 245 244 242 245 245 245 241 242 242 234 236 237 236 239 241 238 236 235 237 240 238 239 238 229 212 175 167 162 168 204 222 242 240 233 233 221 189 80 92 102 122 130 140 144 144 148 150 149 150 147 150 149 147 148 148 152 151 148 148 147 147 147 148 149 149 143 146 148 151 150 149 154 153 147 148 152 151 149 169 201 216 200 167 177 133 214 238 234 233 231 212 178 172 147 213 244 237 237 240 238 239 236 187 177 189 131 173 198 108 96 120 136 175 188 107 156 126 97 93 151 143 191 218 192 171 157 154 154 149 150 149 147 142 150 148 144 142 142 149 159 147 142 140 138 136 132 137 142 143 137 136 133 132 123 116 112 113 105 103 105 105 106 108 111 115 121 125 132 137 145 149 155 155 157 156 153 155 150 149 149 151 152 152 150 151 159 162 162 162 160 165 169 166 165 154 129 117 137 148 132 154 148 149 150 146 149 160 191 180 189 170 192 242 245 245 187 165 186 186 243 241 239 237 240 242 245 244 243 192 200 172 123 179 202 178 146 145 152 151 150 156 141 137 127 84 63 44 43 73 133 111 78 54 39 36 59 110 79 61 60 65 67 67 61 54 48 43 39 39 38 37 38 36 35 34 34 36 36 36 34 33 34 34 33 33 33 32 32 32 32 32 33 34 32 32 31 31 32 34 32 33 34 34 35 35 35 36 34 34 35 36 39 38 42 45 51 54 54 55 56 55 50 44 40 36 35 34 34 34 33 32 34 34 31 32 33 34 35 37 40 47 54 53 51 46 43 42 41 50 73 91 120 124 120 112 62 85 151 160 155 159 159 162 171 209 143 136 234 178 105 106 112 112 110 115 118 118 116 115 118 114 44 60 67 71 69 62 54 52 51 51 56 52 50 58 58 53 44 41 40 45 49 50 50 49 52 52 52 53 54 55 55 54 55 53 53 53 55 55 56 56 55 56 54 55 55 54 55 55 53 54 54 55 53 51 52 53 54 55 56 56 56 57 56 56 57 57 57 56 56 56 56 55 54 55 55 54 55 56 56 55 56 55 54 52 52 52 52 52 53 51 51 51 51 51 50 50 50 51 51 51 51 50 47 47 47 49 47 46 46 45 45 46 48 47 44 43 40 36 34 32 29 27 23 23 23 22 26 40 66 145 211 242 243 242 241 236 229 218 206 200 191 194 206 229 237 237 240 237 235 236 236 238 177 169 165 175 205 227 232 234 238 233 228 221 207 196 184 156 104 101 152 198 217 218 213 209 206 209 202 196 190 186 183 180 179 176 173 174 168 168 167 166 170 170 171 169 169 172 173 176 179 182 189 197 200 207 214 208 210 232 232 232 204 181 170 138 228 242 235 235 239 204 187 160 166 226 243 242 239 234 232 230 230 178 183 176 130 186 231 138 101 103 145 181 183 109 167 185 109 86 124 119 186 159 146 153 148 150 154 152 149 148 150 147 150 152 150 149 148 145 141 140 136 141 140 139 143 148 147 145 151 151 155 157 153 151 145 145 147 149 151 153 151 146 137 129 124 119 112 107 104 102 103 106 106 110 120 122 130 135 139 144 145 146 146 148 136 131 134 151 158 146 124 108 100 108 132 147 146 132 133 156 163 170 184 204 222 235 240 202 180 184 172 238 244 243 208 162 184 181 228 242 238 240 240 241 244 245 244 209 187 178 113 169 185 157 150 149 157 156 156 157 157 182 117 77 56 38 54 114 136 128 90 71 52 42 36 90 126 101 63 52 54 58 63 65 66 55 47 42 40 39 38 37 37 35 35 33 36 36 34 35 35 35 33 33 33 34 34 34 33 34 35 35 34 33 33 33 34 34 33 33 33 33 33 32 32 32 32 33 33 32 34 33 36 38 39 44 49 52 53 51 51 49 43 40 35 34 34 33 33 33 35 34 33 33 34 34 37 39 46 54 55 49 46 43 39 44 58 81 109 121 126 127 123 122 99 71 112 162 166 169 176 192 171 136 87 196 254 246 164 138 131 124 117 118 124 128 124 121 125 133 45 62 73 83 81 76 61 59 64 79 90 65 60 71 66 57 46 41 43 47 49 49 47 45 48 49 50 51 52 53 54 54 54 55 56 55 56 55 55 55 56 54 53 55 55 55 53 52 54 55 56 55 52 50 51 52 53 55 56 55 55 55 55 56 57 56 57 56 56 57 55 55 54 56 54 54 54 55 54 53 55 55 53 51 51 53 51 53 53 52 53 52 50 51 52 52 51 51 51 49 50 49 47 46 47 46 48 47 46 46 45 46 48 47 45 44 40 35 36 32 27 27 26 24 21 21 25 34 57 134 167 171 168 165 162 165 167 175 175 173 176 178 169 178 226 242 243 238 235 237 238 240 162 188 212 228 232 242 240 233 210 182 168 167 174 187 200 200 199 204 229 233 235 238 243 237 235 239 233 236 235 237 234 234 231 224 225 229 224 228 229 228 232 233 232 232 228 230 235 231 235 234 239 239 232 233 243 237 233 236 240 237 193 185 160 148 231 245 241 242 244 198 189 151 173 226 239 241 237 228 229 231 234 178 191 168 140 194 241 187 97 96 140 185 179 113 171 216 122 93 99 105 171 166 150 155 149 148 154 154 150 145 145 142 151 157 154 141 138 134 140 141 139 146 146 142 144 144 146 147 148 141 146 150 153 158 152 149 151 151 154 152 152 153 150 147 150 152 148 146 144 148 148 144 135 133 132 130 122 118 114 114 112 110 107 113 132 141 124 116 124 128 137 142 145 149 156 144 146 136 136 185 217 230 240 238 244 239 239 215 176 191 167 228 242 244 219 166 179 182 210 242 236 239 240 240 243 245 243 218 180 162 122 154 189 163 152 153 155 154 156 156 167 187 108 85 48 40 82 137 135 130 100 82 61 47 39 58 127 133 101 58 49 56 54 45 53 56 55 57 49 45 41 41 40 39 39 38 38 36 38 39 37 38 34 35 36 34 36 35 35 36 36 35 36 34 33 33 35 35 35 34 34 35 34 34 32 32 33 33 32 31 33 33 33 33 35 38 41 45 46 48 52 51 50 44 38 36 34 33 34 34 34 36 36 35 37 37 45 50 58 61 53 47 44 42 47 65 90 111 124 127 133 133 128 121 115 98 83 130 175 182 189 185 126 74 95 212 254 254 215 158 143 134 128 127 132 134 130 126 129 146 44 65 77 89 90 80 68 72 94 108 105 81 75 82 72 64 52 45 46 48 46 46 45 46 47 46 47 50 55 55 55 55 55 56 57 57 57 56 55 55 56 54 54 54 54 55 54 54 55 57 58 57 52 51 52 52 52 54 53 56 54 56 56 56 55 55 55 57 55 56 54 54 53 55 53 55 54 56 55 54 56 56 54 54 54 54 53 54 52 53 53 53 52 51 53 52 52 52 50 50 51 50 48 46 46 47 47 46 45 46 47 48 50 47 45 46 42 37 37 31 27 26 28 24 21 23 22 29 48 119 159 147 141 149 161 173 179 174 173 177 178 170 162 165 201 227 237 240 241 241 239 241 219 223 227 226 211 196 187 175 176 196 212 227 229 229 225 233 236 239 240 239 237 240 242 240 238 237 226 228 231 237 236 235 236 233 237 239 239 236 234 237 237 240 240 240 238 239 245 244 240 240 244 236 240 239 243 237 235 242 241 242 189 197 150 166 240 243 236 237 240 186 185 140 181 214 234 238 238 241 243 244 232 174 192 158 153 203 246 234 116 94 145 187 170 116 168 216 153 97 82 91 147 180 153 152 145 153 155 139 134 140 145 142 142 147 137 132 143 143 145 144 141 143 149 150 146 149 144 143 145 143 142 146 150 148 144 151 153 158 157 147 145 146 151 156 158 151 146 149 150 151 152 154 153 149 149 144 145 146 147 146 144 144 142 141 145 149 143 145 142 126 136 156 161 168 179 157 155 141 142 222 247 246 248 247 245 238 245 233 182 188 172 209 250 248 232 177 171 189 196 240 238 238 235 239 240 242 226 190 163 153 147 161 185 177 144 159 154 142 135 147 156 182 126 84 40 40 121 142 138 135 117 98 77 58 46 37 103 146 134 107 54 40 41 35 37 51 74 60 54 53 49 50 56 56 54 53 51 49 45 44 43 43 41 42 41 42 42 41 40 38 39 37 37 37 36 35 38 36 36 35 36 37 34 33 33 32 33 34 34 34 33 32 31 33 33 36 37 39 42 46 53 56 56 51 42 40 37 36 35 34 35 38 38 40 42 49 59 65 64 55 46 44 50 62 87 107 127 135 133 135 134 131 125 120 111 100 80 77 113 141 144 133 122 101 103 189 253 254 242 179 149 141 134 136 137 132 132 131 129 121 56 62 75 78 79 77 93 105 110 117 178 155 82 82 72 68 57 44 41 40 41 41 41 44 45 44 45 45 51 54 56 57 55 58 56 57 57 55 56 54 55 55 53 54 52 52 53 51 53 54 55 54 53 53 53 53 52 54 54 53 54 53 54 53 54 53 54 56 54 53 52 52 52 51 53 55 54 55 54 54 57 55 56 56 55 55 52 53 53 53 53 52 53 54 52 52 51 52 49 51 53 49 49 47 46 47 48 47 47 49 49 49 48 50 50 46 42 39 36 30 28 27 27 25 23 22 22 28 42 112 170 157 158 166 177 181 172 173 183 178 160 156 160 165 171 144 150 161 177 182 187 192 223 211 196 183 176 184 206 218 229 232 235 229 230 233 235 236 239 242 243 243 240 242 240 244 242 239 234 236 235 241 237 237 234 237 241 239 237 233 231 234 229 230 235 240 237 236 242 242 239 239 242 241 246 240 240 239 240 243 242 244 186 199 146 176 243 238 235 237 236 178 187 135 186 224 241 242 244 243 243 242 227 174 191 149 160 213 246 246 157 102 152 194 160 124 168 201 187 112 80 86 132 188 156 152 160 162 156 145 146 149 152 152 145 149 146 143 142 143 143 146 147 151 155 152 150 149 149 149 146 150 143 145 149 150 145 149 153 154 154 151 149 147 152 152 157 151 149 153 152 152 152 153 154 150 150 149 154 151 151 149 146 148 149 149 151 153 154 150 150 123 134 190 220 225 233 177 165 137 153 229 242 244 247 249 247 243 246 243 188 182 180 187 251 250 239 191 166 190 189 236 245 245 242 242 231 207 167 155 152 176 152 144 166 187 158 161 144 134 134 141 156 172 116 70 38 53 143 139 140 144 131 113 94 75 56 46 67 137 135 133 123 58 34 30 33 47 92 115 105 81 53 45 51 53 55 56 59 58 59 60 60 56 55 60 66 65 58 53 48 44 41 39 42 43 40 38 40 40 40 37 39 38 38 36 36 36 36 34 34 34 34 31 33 33 34 35 38 40 40 42 47 53 56 53 49 48 44 42 40 38 40 38 43 44 50 52 53 52 45 45 50 66 89 101 117 127 137 141 138 134 126 102 70 56 49 44 47 61 81 101 119 146 160 126 97 155 243 254 248 190 148 145 135 133 135 134 130 128 125 123 69 61 66 70 81 97 121 118 137 197 231 140 91 78 68 64 56 46 42 42 40 41 41 42 42 44 45 46 48 54 56 57 57 57 56 56 56 55 55 54 56 55 55 54 52 51 50 52 53 52 53 53 54 53 52 51 52 54 54 53 53 53 55 53 53 50 54 55 53 53 52 52 52 50 54 55 53 54 54 55 56 53 54 54 54 54 52 53 54 54 54 55 53 54 53 53 52 52 51 53 54 52 49 48 48 49 50 48 49 50 50 50 49 50 51 48 45 40 34 31 29 28 26 24 23 23 21 24 39 71 164 161 169 174 185 181 174 179 183 162 154 157 164 167 167 132 123 116 121 119 125 126 183 191 213 222 230 232 233 229 236 231 230 233 234 235 231 240 245 243 244 243 241 239 238 239 240 239 237 242 238 236 238 234 232 235 238 238 236 235 236 232 233 235 235 234 237 242 243 243 243 239 241 238 240 241 239 238 242 243 234 241 174 199 139 188 246 240 240 239 232 172 187 135 195 239 243 243 243 241 241 240 226 174 197 137 176 224 248 248 205 117 158 198 152 136 160 174 212 133 84 94 128 161 177 162 155 147 148 148 155 149 142 144 147 149 152 152 143 147 154 154 153 150 156 153 154 151 154 154 153 151 149 151 149 150 152 154 154 153 154 156 153 151 150 150 147 148 152 153 150 152 151 153 153 152 158 159 157 153 155 156 154 152 155 156 163 172 186 158 157 124 151 237 244 240 239 177 181 139 163 235 244 242 243 243 241 245 242 244 205 176 193 167 244 245 244 212 164 184 182 225 243 244 236 208 166 152 157 148 144 200 138 124 138 179 154 135 120 125 130 134 147 156 117 62 38 76 138 136 134 138 137 130 101 94 77 61 49 94 130 134 132 92 41 34 43 52 50 47 76 109 135 132 105 86 67 54 49 44 40 39 41 42 41 43 45 45 46 48 48 50 56 55 49 57 61 58 53 54 54 51 48 44 42 42 40 40 37 40 38 37 36 36 35 35 35 35 36 37 38 38 41 49 56 62 60 57 57 54 49 46 45 45 44 47 47 48 50 54 67 81 102 114 122 130 142 137 129 120 94 68 45 37 40 44 50 60 76 96 138 156 177 207 242 218 144 127 203 251 254 216 138 139 132 133 133 131 132 133 134 129 90 61 60 71 114 128 132 160 229 244 165 56 76 83 68 62 58 51 45 42 43 43 42 42 42 41 42 44 49 55 56 56 58 55 56 57 56 57 54 53 53 52 50 50 49 48 47 49 50 49 49 49 49 49 49 49 51 53 52 53 54 52 52 51 52 51 54 53 54 53 53 52 53 51 54 54 54 55 55 55 57 55 55 55 56 56 54 53 53 53 52 54 54 54 53 54 53 53 52 53 52 50 48 52 51 50 51 51 51 52 49 50 50 49 51 50 47 44 38 33 31 30 28 25 24 23 23 24 38 55 152 154 174 181 184 184 181 170 159 158 158 163 162 162 163 129 118 117 116 117 116 115 229 230 233 228 229 228 227 222 236 233 236 230 230 232 231 242 241 243 244 237 239 239 234 242 243 233 237 240 242 240 240 236 237 238 240 238 237 240 240 242 241 240 237 237 233 237 239 235 235 235 237 230 235 239 240 239 241 241 235 234 170 194 137 199 243 238 238 239 229 172 184 134 199 236 240 238 240 239 239 243 219 172 198 132 182 227 247 246 225 138 163 201 139 138 162 164 219 156 92 80 133 138 196 195 203 191 173 157 151 143 144 150 150 151 149 154 158 156 155 151 149 151 155 152 153 153 150 148 150 150 151 151 151 154 155 153 154 151 153 156 151 153 151 150 148 150 152 151 151 149 147 150 150 151 159 157 153 155 158 158 165 168 175 178 200 229 235 166 172 123 158 236 243 244 239 169 180 140 171 236 247 246 246 244 244 243 240 239 218 173 195 166 230 247 244 231 162 175 184 212 237 211 181 161 154 154 154 147 151 202 134 128 139 152 150 119 122 130 134 135 140 139 116 56 39 86 129 130 128 122 124 127 114 104 97 87 68 63 90 122 146 85 46 38 76 110 114 116 118 120 131 144 150 146 142 128 114 99 79 68 61 55 49 44 43 40 40 40 38 45 55 51 49 46 47 49 51 56 59 61 61 62 61 60 56 55 51 49 48 45 44 45 41 40 39 40 37 38 39 39 41 45 49 55 57 53 51 51 49 52 60 63 70 73 84 89 93 100 104 113 122 131 132 130 136 134 104 68 47 41 44 46 53 62 77 95 112 117 123 132 133 146 177 211 224 191 177 238 254 238 145 134 134 130 130 132 136 140 134 130 110 84 87 117 135 129 159 220 224 199 72 44 99 99 71 61 66 59 47 43 42 42 42 43 43 41 42 46 50 54 55 54 57 55 56 57 55 53 52 50 49 48 45 46 46 46 45 46 48 47 47 48 48 48 48 47 49 51 50 52 53 52 51 51 52 53 53 53 52 53 53 51 53 52 52 52 54 54 55 54 56 56 55 55 54 54 54 54 54 54 55 54 53 53 53 54 54 54 53 54 53 50 51 52 53 52 51 51 51 51 49 50 52 52 52 52 49 44 39 35 32 33 29 26 25 25 24 25 38 44 130 151 171 191 188 183 170 155 153 160 163 162 158 158 149 118 115 115 116 117 116 115 232 236 234 230 224 225 229 231 235 235 236 233 236 238 239 236 239 242 243 242 239 240 242 242 239 239 241 240 239 241 241 239 236 238 240 239 239 239 240 242 233 237 242 243 240 245 242 237 242 239 240 241 243 239 233 236 238 241 242 234 175 188 136 208 239 237 237 240 222 169 175 135 207 240 241 238 241 239 239 241 209 170 193 127 190 233 244 245 239 188 165 203 128 150 170 162 195 188 102 79 124 120 190 213 243 246 234 210 217 212 195 182 168 164 163 167 165 165 159 155 157 156 152 154 157 156 154 155 155 155 151 150 152 153 156 154 156 156 154 153 152 153 151 147 154 158 157 157 156 155 155 158 155 159 162 165 174 184 200 216 230 236 241 240 241 242 227 159 168 121 168 240 250 248 232 163 177 139 185 243 248 246 245 246 241 243 243 242 235 191 182 175 202 246 243 244 173 166 184 186 174 148 153 152 150 152 156 153 164 190 130 138 139 120 166 144 146 149 139 144 155 116 112 47 48 103 138 144 141 130 130 130 126 116 114 128 124 110 84 72 77 62 52 45 84 113 115 122 127 128 132 135 140 140 140 138 143 143 140 134 132 127 119 114 104 98 91 83 75 68 64 60 55 53 51 48 45 44 41 40 43 43 45 45 52 54 54 55 57 53 53 50 48 47 46 45 43 43 42 41 44 45 45 43 40 39 45 68 81 83 103 116 119 114 113 105 110 116 131 137 137 140 138 125 92 64 40 45 46 52 60 72 89 106 112 114 105 104 103 105 120 142 151 145 167 205 203 213 248 252 165 137 137 130 134 138 133 131 134 135 132 124 133 138 138 146 195 168 116 77 50 42 77 85 79 68 67 66 52 47 46 44 41 42 43 43 44 44 48 54 55 53 54 54 53 53 49 46 46 46 44 43 44 43 42 42 43 42 44 43 44 43 43 44 44 44 45 45 45 47 48 49 50 50 49 52 52 52 52 52 53 54 52 51 51 53 53 55 55 53 55 55 55 56 55 55 55 55 53 55 55 54 55 53 54 53 52 53 53 52 54 52 53 53 53 52 51 51 52 52 51 51 53 53 51 51 49 46 41 38 35 34 31 29 28 27 28 31 38 43 100 148 156 187 186 166 153 152 159 165 163 160 154 148 119 112 113 113 114 115 115 114 200 228 226 221 226 230 228 234 236 232 232 234 235 238 237 240 244 240 238 240 241 240 240 238 239 241 236 236 233 236 240 240 234 240 245 241 241 236 242 243 237 238 237 240 241 245 237 238 241 239 240 241 243 240 236 239 240 241 243 225 174 181 144 216 240 243 240 239 215 171 172 135 216 240 240 242 240 241 238 241 201 172 189 123 197 232 239 242 240 220 165 203 122 160 165 180 175 206 111 83 108 128 171 201 228 240 231 233 236 241 241 238 219 217 214 217 219 213 211 204 194 186 171 164 171 170 169 173 173 169 167 168 169 168 165 168 167 165 168 170 168 169 170 170 171 176 178 180 187 190 194 197 202 211 219 227 231 233 237 240 242 246 245 236 236 240 219 162 165 122 175 243 250 249 228 159 178 138 190 241 245 240 241 241 242 246 242 241 240 208 175 184 184 243 244 247 188 162 182 178 159 151 151 151 153 154 153 148 170 193 132 150 134 114 154 152 152 153 139 157 164 97 110 45 51 106 141 144 147 143 143 141 142 134 116 122 142 143 137 133 112 95 80 73 65 61 60 62 66 66 72 77 87 96 110 115 126 131 137 139 139 137 136 140 137 131 139 136 128 125 121 117 108 107 99 93 84 78 70 65 60 53 52 48 50 50 49 50 49 46 44 45 45 43 43 46 44 44 47 47 61 67 68 45 35 34 39 50 51 60 76 75 73 79 87 100 129 137 127 131 135 135 106 70 49 45 49 52 61 71 92 106 111 112 110 112 117 120 120 115 102 98 125 162 154 141 183 207 233 249 197 145 139 132 134 138 133 131 132 132 134 132 130 133 151 183 195 192 156 119 77 48 39 42 68 76 70 70 61 50 46 44 41 42 42 44 45 45 48 52 54 52 53 50 49 46 44 43 43 42 43 42 39 40 40 41 41 41 43 40 41 40 39 41 41 42 43 42 42 42 43 45 45 46 46 46 48 49 51 52 54 53 51 51 51 52 53 53 53 54 52 51 53 54 55 56 54 53 53 53 52 53 55 54 52 53 53 53 53 53 51 50 51 51 52 51 50 52 50 51 53 52 53 52 51 50 49 47 43 39 37 34 32 28 28 30 33 38 47 46 80 145 152 164 168 152 154 159 163 168 162 159 149 130 116 113 112 114 114 116 115 117 115 138 146 147 152 156 175 192 187 198 207 219 223 224 226 237 239 235 231 230 231 231 237 237 230 225 237 239 238 236 236 241 238 240 241 242 239 238 239 237 235 237 237 237 236 239 243 243 242 240 241 240 239 233 231 235 233 235 240 211 181 174 148 221 239 242 240 238 209 180 160 142 228 241 238 239 242 243 244 246 199 179 188 130 200 235 239 240 244 222 162 203 114 163 156 112 129 209 148 91 92 145 143 186 214 240 238 237 237 241 244 245 242 241 243 243 242 241 244 240 247 245 240 234 238 240 239 239 240 239 229 229 233 234 235 236 239 235 233 236 234 236 238 237 236 239 238 240 243 247 244 243 238 238 238 239 242 240 240 243 245 246 249 242 237 243 219 160 170 121 188 238 239 242 218 165 183 138 205 243 245 243 242 242 246 244 243 245 246 223 172 181 172 230 226 200 170 156 178 179 163 160 156 154 151 156 155 144 174 191 126 160 126 123 141 157 153 146 138 167 154 97 118 43 53 104 138 141 145 145 145 143 143 148 133 109 111 129 136 143 149 153 142 139 131 121 108 94 84 77 71 69 62 56 49 48 45 44 52 56 64 72 78 84 92 99 107 113 124 127 127 127 128 132 139 139 138 136 139 149 141 108 101 94 116 134 121 119 109 85 79 75 82 90 91 85 86 89 82 70 55 50 43 41 34 30 30 32 38 33 42 55 66 76 103 129 142 138 137 123 89 63 47 53 57 61 69 79 98 110 115 111 119 128 134 135 137 138 140 137 138 130 108 106 153 174 134 152 208 229 215 155 136 136 135 134 130 128 133 133 136 135 130 162 232 246 198 158 139 146 115 75 47 40 44 67 77 74 73 62 49 45 43 44 45 45 45 47 51 53 53 52 50 47 46 44 44 41 42 43 41 41 39 38 37 38 39 39 40 38 37 37 38 41 40 42 42 40 39 40 41 40 40 42 41 40 43 44 46 47 49 49 51 51 51 52 52 52 53 54 54 53 53 53 53 53 53 54 52 52 53 53 52 51 52 52 50 50 52 51 48 49 50 49 49 48 49 50 49 50 50 52 53 53 51 51 53 52 48 42 39 36 35 32 33 37 48 61 71 47 59 130 154 156 162 159 159 162 162 166 161 158 129 115 115 114 112 113 112 114 115 115 122 125 119 122 123 120 122 128 131 135 140 153 155 154 174 207 226 229 220 227 229 226 236 234 234 230 238 240 240 234 226 236 239 234 239 241 237 236 237 238 236 235 236 239 240 242 243 240 240 238 238 236 239 238 238 240 241 235 239 198 185 164 159 226 238 238 236 237 199 177 143 149 233 239 235 234 237 240 242 243 188 185 183 136 201 236 243 242 242 215 168 203 106 163 146 164 207 234 186 94 93 138 139 155 203 232 242 242 244 245 243 246 245 243 244 243 244 242 242 241 242 241 238 239 240 241 240 241 243 241 235 233 236 242 244 243 244 242 239 239 242 243 243 244 242 242 243 243 243 245 245 243 241 240 242 242 242 241 242 242 242 244 248 240 243 246 219 160 171 121 199 243 242 244 210 171 182 142 213 242 242 241 245 246 249 247 250 249 250 236 176 170 172 188 180 161 162 154 175 186 165 156 156 154 156 156 161 150 183 190 125 166 113 126 136 168 159 149 140 173 144 95 118 44 55 92 135 132 138 138 146 143 143 149 145 133 110 104 113 131 140 136 144 143 132 129 122 116 109 100 94 91 93 89 76 72 66 60 57 57 53 53 51 51 49 49 53 55 58 63 68 73 75 83 94 103 120 135 180 209 183 112 114 101 175 231 223 223 212 135 116 100 135 187 199 182 148 158 141 155 124 88 58 41 39 34 34 38 43 50 59 68 91 113 128 137 135 133 109 69 52 57 63 67 73 84 101 109 115 116 120 128 134 132 137 141 139 137 142 142 141 141 138 118 113 166 159 120 185 202 207 176 138 142 133 132 128 128 130 130 129 131 141 222 225 165 132 130 108 114 124 103 60 48 39 47 72 77 76 71 58 51 47 47 45 46 48 49 52 53 53 51 49 46 47 45 43 42 42 42 39 38 39 39 39 39 39 40 39 36 36 38 38 39 40 40 41 40 39 37 38 40 39 39 40 39 39 39 42 43 46 46 47 47 49 50 52 51 52 51 52 52 52 52 53 52 52 53 51 51 51 50 50 50 49 48 47 46 45 45 45 45 45 46 46 44 46 47 47 49 50 49 52 51 52 53 53 54 51 46 43 38 38 35 40 49 64 73 69 50 54 121 154 155 157 158 158 160 162 164 161 148 111 113 115 115 115 113 109 112 112 113 120 120 120 120 118 119 122 123 121 120 128 125 128 129 130 128 134 134 131 133 138 154 168 180 185 205 222 232 235 231 232 239 238 236 238 237 233 236 238 241 239 237 237 238 238 239 236 237 237 234 232 239 239 239 235 235 236 239 241 191 190 149 170 230 237 237 236 238 182 173 135 154 240 237 235 239 238 237 239 238 177 188 172 148 205 238 235 227 196 168 178 198 107 169 129 179 230 221 183 114 88 108 152 177 238 236 231 245 246 242 239 244 245 242 241 245 248 242 235 228 223 226 235 240 241 243 240 240 245 240 241 241 242 241 241 242 243 243 243 243 245 245 243 246 246 243 241 242 244 245 246 243 241 241 242 241 242 243 241 241 241 242 241 243 243 246 211 169 169 126 209 243 239 239 193 178 175 142 226 245 241 244 247 247 243 249 250 249 248 242 191 163 175 166 163 160 160 155 166 193 174 157 161 158 154 152 143 145 193 179 129 172 106 115 149 169 151 146 145 172 136 98 110 48 55 82 134 137 138 141 143 146 145 152 148 145 138 139 129 116 103 112 112 119 129 134 134 136 136 133 131 125 114 111 105 93 83 81 76 72 66 63 61 62 63 63 61 60 60 57 55 55 54 52 49 47 46 42 58 72 69 61 63 65 122 179 190 197 197 117 111 94 149 223 233 214 169 178 171 202 241 231 205 174 86 37 39 48 65 71 87 105 135 140 136 126 91 60 53 64 72 76 83 93 106 118 116 119 123 129 134 137 138 135 135 135 134 138 140 141 138 137 140 134 118 126 167 129 163 207 180 191 145 142 136 130 133 137 141 135 132 137 153 176 120 105 118 118 128 131 122 118 88 64 47 40 49 70 80 79 73 66 55 53 53 53 55 50 51 54 53 48 46 45 43 42 43 43 42 42 40 39 38 38 40 41 38 39 38 38 39 39 39 39 37 38 39 38 37 37 38 38 38 38 38 38 38 39 38 40 41 39 42 43 45 46 47 48 49 50 50 50 53 52 53 52 52 51 49 48 45 45 43 44 43 41 41 40 39 39 38 41 41 40 40 40 42 42 45 46 48 48 48 48 51 53 53 54 55 52 47 45 45 44 54 64 69 67 62 49 53 103 159 158 155 157 156 159 162 167 161 124 115 118 113 115 112 112 110 110 113 111 115 115 116 117 116 119 118 121 122 122 123 124 121 121 123 122 124 125 126 127 126 125 124 127 127 139 150 156 168 173 174 191 209 220 230 232 235 235 235 237 236 236 237 237 236 236 232 232 234 233 234 237 238 240 236 234 235 232 234 181 190 140 180 231 238 241 237 235 174 188 128 164 240 237 235 240 243 242 237 238 170 192 164 153 208 230 193 171 169 166 183 192 110 176 113 163 171 138 149 135 88 85 152 162 238 240 234 241 238 245 240 236 242 238 240 243 242 241 241 236 237 235 239 240 241 243 240 240 242 242 242 241 243 243 241 241 240 244 244 246 244 242 242 242 243 247 248 245 239 245 245 245 244 244 241 242 242 239 243 243 245 244 243 241 240 243 208 177 166 130 217 243 237 235 182 185 167 148 233 245 239 239 241 243 240 250 246 240 240 244 205 163 164 174 170 162 160 158 157 191 184 165 165 161 150 129 144 148 197 169 133 171 112 95 153 164 158 149 155 177 132 102 107 51 57 74 131 145 148 148 143 145 148 152 151 145 149 152 148 139 137 133 133 133 119 108 100 97 97 100 104 110 109 114 124 128 126 128 129 119 107 103 93 89 82 81 74 71 69 66 67 67 66 64 61 60 65 66 64 64 61 59 59 56 57 66 69 74 79 60 62 60 81 132 152 152 129 140 156 177 237 237 235 235 151 42 41 64 131 126 132 133 126 116 86 66 68 74 81 85 85 98 115 119 117 117 123 132 139 137 140 143 139 139 139 138 140 142 142 140 140 138 138 137 123 114 155 161 140 202 195 197 151 138 137 135 138 140 133 133 136 141 135 143 118 109 124 123 132 140 133 125 106 85 55 47 41 46 82 82 80 74 64 62 60 59 57 54 51 52 50 46 46 44 43 41 42 41 39 41 42 40 38 40 40 40 39 38 37 39 38 40 40 38 38 38 39 36 36 38 38 39 38 38 39 38 37 39 37 39 39 38 41 42 42 43 44 45 48 49 50 50 51 53 51 50 50 50 45 44 42 42 41 41 39 38 37 38 39 39 39 39 37 38 38 39 40 39 41 42 44 46 47 49 51 55 55 56 58 56 53 51 52 53 60 67 76 76 59 46 46 87 158 157 156 153 158 161 164 176 139 120 115 116 114 116 115 111 109 111 115 114 113 116 114 113 116 113 113 117 120 116 116 117 119 119 116 116 117 120 119 122 120 121 119 119 120 121 125 124 115 115 113 118 124 126 139 154 172 190 200 212 224 227 228 228 228 228 230 230 230 233 233 237 239 241 240 238 235 232 226 175 188 132 189 241 237 236 237 238 166 185 130 171 241 244 244 242 239 237 235 233 163 199 152 163 181 189 199 217 228 179 185 184 114 181 78 89 170 181 226 193 93 80 133 150 229 246 247 244 241 237 236 238 240 239 239 243 245 242 238 239 240 238 240 238 239 243 236 239 243 245 240 236 240 242 238 242 245 243 245 240 243 242 242 242 243 247 249 249 240 241 244 243 245 245 241 242 237 238 241 239 243 242 238 239 241 240 208 183 163 133 234 247 242 243 181 187 161 153 240 246 243 244 243 244 245 249 248 247 245 247 224 170 158 161 219 215 187 171 146 182 193 176 166 158 127 136 148 154 193 156 142 174 121 90 141 154 167 147 164 187 117 115 109 60 56 65 127 151 149 150 149 148 153 154 146 147 153 151 152 146 140 142 147 147 147 146 149 143 142 144 137 129 126 116 102 97 95 91 91 95 98 105 111 113 122 131 127 127 127 127 127 113 105 109 99 92 89 91 90 89 85 87 92 93 89 83 86 93 96 91 88 84 82 75 66 62 61 59 55 63 86 98 109 125 87 53 47 80 140 115 95 89 81 89 110 121 123 107 103 106 115 123 118 125 128 132 137 140 140 137 137 137 141 144 140 136 140 145 143 145 146 142 139 142 135 111 132 179 143 160 213 218 158 138 139 137 135 137 137 140 145 156 155 150 123 111 144 129 135 133 137 134 122 107 76 60 48 44 71 102 89 77 71 71 67 66 62 58 54 52 49 47 47 44 43 41 42 42 40 41 42 42 41 41 39 40 39 40 40 40 41 40 39 40 39 39 38 36 34 36 37 39 37 38 39 37 38 38 36 39 38 39 39 41 41 41 42 44 46 47 49 49 49 52 50 51 52 48 48 46 43 41 39 39 38 39 39 38 37 38 37 38 36 37 38 38 39 39 39 39 42 43 46 48 54 58 59 60 60 58 56 59 57 56 64 81 114 103 76 65 53 68 152 157 155 156 157 162 170 162 124 122 120 116 115 117 115 110 109 112 113 113 114 114 114 114 115 110 110 113 114 112 112 113 114 110 110 113 118 116 115 118 119 119 117 117 116 121 121 122 123 123 122 123 122 122 125 124 127 133 135 141 151 160 169 165 166 177 207 228 238 238 232 236 237 237 239 238 236 233 223 178 189 129 191 234 235 239 237 236 158 175 126 174 242 244 239 237 241 239 220 194 161 201 140 165 205 228 229 227 207 167 189 173 118 173 64 47 105 192 222 208 102 89 110 155 199 242 247 242 244 244 238 244 241 241 242 245 243 241 241 243 240 240 242 240 240 242 246 244 243 246 241 235 238 240 237 240 240 242 245 244 243 242 243 241 241 248 244 244 240 240 243 245 242 245 243 240 242 242 243 244 244 241 234 243 244 245 203 187 159 139 237 243 244 247 181 186 158 160 246 250 243 243 243 248 247 246 248 249 246 246 232 179 163 138 217 244 239 219 150 173 197 178 144 141 144 154 151 161 199 151 153 171 131 98 122 145 178 151 169 196 111 120 110 67 57 64 108 148 152 153 150 146 150 154 149 150 149 146 150 145 142 147 144 145 149 150 150 143 147 151 149 150 159 156 148 147 154 148 137 133 133 133 143 159 166 160 145 130 124 117 114 110 112 115 112 113 122 132 133 132 133 133 129 127 125 118 113 113 121 121 121 124 128 126 123 120 122 121 115 111 107 97 90 85 78 80 84 87 95 102 116 131 147 143 131 123 121 121 126 120 116 119 129 138 134 133 138 142 136 135 135 133 132 131 138 132 130 137 147 146 143 137 138 139 135 127 107 175 154 127 200 217 165 144 139 136 137 138 140 139 147 174 190 164 104 138 133 133 140 140 143 139 134 117 98 75 58 50 53 94 115 100 72 71 74 74 69 63 56 54 52 49 46 42 40 40 42 43 42 43 42 43 43 41 38 38 40 41 41 40 43 42 40 41 40 40 39 37 36 37 37 36 38 38 38 36 37 39 37 39 39 39 41 41 40 38 39 40 41 44 46 48 48 49 50 50 49 49 49 46 43 41 41 39 39 39 38 39 39 37 36 35 35 36 38 37 38 38 39 40 40 44 46 48 54 59 62 61 60 58 58 60 59 61 78 109 115 113 113 106 61 56 146 156 159 157 157 166 170 146 133 131 129 124 119 115 116 114 112 111 112 111 116 112 115 114 112 111 109 110 110 110 109 112 109 102 104 113 114 109 111 114 116 117 117 115 118 121 122 122 121 120 116 117 118 119 122 121 121 122 126 129 128 128 124 126 126 123 127 148 175 196 237 237 235 231 234 232 231 236 217 175 186 123 197 239 239 242 238 230 157 172 122 172 241 239 225 207 187 177 166 170 163 204 132 172 197 203 195 167 146 155 193 158 125 165 68 85 110 73 102 100 97 108 85 163 173 241 243 245 243 240 235 240 240 240 240 242 243 243 242 240 240 240 243 240 242 243 242 243 244 245 239 238 240 242 240 243 245 243 244 245 241 241 243 242 242 244 243 242 238 240 243 241 246 241 239 241 242 243 247 245 243 243 243 248 242 245 198 191 154 152 243 245 246 244 172 191 149 171 249 249 244 244 245 245 245 243 246 244 244 246 244 195 162 141 185 236 243 247 167 156 200 191 190 196 187 180 164 163 200 144 163 169 141 117 98 138 169 158 169 196 102 126 117 75 57 67 91 142 153 152 150 149 148 140 143 151 148 149 145 141 150 152 150 149 152 157 163 151 145 153 157 158 156 154 154 157 162 169 186 196 213 231 238 241 245 245 242 240 237 229 217 210 203 185 177 168 148 135 126 118 90 94 98 108 117 131 134 139 135 138 138 144 142 138 138 142 137 140 144 145 150 149 150 151 152 155 153 157 151 151 151 147 145 140 135 129 114 110 116 125 121 118 125 126 123 126 130 138 136 133 130 128 130 124 127 135 137 136 138 138 139 141 139 138 137 136 117 160 156 116 183 198 180 148 131 134 138 134 137 141 167 200 211 140 110 157 134 140 143 149 149 146 143 128 111 94 70 61 50 55 116 135 119 92 66 65 64 64 62 58 54 53 51 45 43 43 42 42 43 43 44 44 43 43 41 40 41 43 44 42 43 44 41 41 41 42 42 41 40 40 39 39 39 38 39 38 38 38 39 39 39 38 38 37 38 36 39 38 39 40 41 43 44 46 48 49 49 48 49 48 46 43 43 42 40 39 39 39 37 37 35 34 36 38 39 38 40 40 41 41 41 43 47 52 59 62 62 62 64 60 59 64 67 77 111 120 114 111 107 109 76 51 127 153 160 158 162 169 200 212 156 147 139 133 125 121 119 116 115 116 114 113 106 109 111 112 109 111 107 108 110 110 112 112 113 112 110 110 111 109 110 111 116 119 119 118 117 120 117 116 116 118 115 117 119 119 123 127 118 119 123 124 125 124 124 126 123 124 126 129 135 142 216 238 233 235 232 231 236 239 211 180 179 119 205 239 240 239 242 221 155 167 124 171 218 193 164 161 176 203 227 207 165 204 125 175 155 154 180 200 205 169 194 152 136 163 105 105 74 50 72 78 87 124 75 147 169 222 244 242 239 231 238 242 243 243 243 241 238 244 243 238 244 242 242 242 242 243 241 239 242 244 241 241 242 243 242 241 243 242 244 246 244 243 242 242 242 243 242 240 240 242 246 246 247 245 243 245 241 238 243 246 243 241 246 247 247 248 196 194 159 158 243 240 244 241 170 196 149 180 245 244 243 244 248 246 241 242 245 245 249 248 248 212 153 170 172 240 249 247 185 144 195 211 233 238 236 238 196 170 197 142 171 198 154 134 89 142 153 166 172 189 96 132 123 82 60 67 90 139 149 151 148 148 155 150 145 150 158 160 157 153 154 152 152 153 159 167 165 156 149 155 158 164 164 171 185 196 215 219 233 241 246 243 242 241 241 239 237 243 245 243 240 237 241 239 243 242 233 229 227 213 122 106 95 109 167 161 147 139 105 93 98 101 113 119 125 131 134 139 146 147 148 149 146 144 140 148 154 153 154 148 136 128 121 113 100 100 109 125 139 143 144 140 136 131 132 134 135 140 139 137 130 125 120 115 113 118 120 109 125 128 131 133 134 135 135 138 131 157 161 123 147 197 192 152 138 138 138 140 141 145 179 203 201 119 138 152 139 141 149 152 146 145 137 134 122 110 90 74 60 53 80 127 138 129 84 72 68 64 60 59 58 55 55 50 47 47 44 43 43 41 42 41 42 44 43 41 41 44 44 43 43 44 42 42 42 42 42 42 42 41 40 40 39 38 39 40 39 38 40 38 38 40 39 38 40 39 38 38 38 40 42 41 43 42 43 47 46 46 48 49 48 47 45 43 41 41 38 37 37 38 36 35 36 37 39 38 39 39 41 43 44 46 52 55 57 61 62 62 63 61 65 67 83 108 119 116 124 125 127 126 112 54 105 149 163 162 167 175 235 252 215 173 152 137 129 122 121 119 119 120 118 118 95 87 87 89 96 98 97 102 102 106 104 104 113 111 112 113 111 111 114 115 116 118 120 116 112 115 116 114 117 121 116 118 119 122 120 121 119 119 125 125 121 121 124 123 121 120 125 129 131 142 220 234 233 232 241 237 233 235 199 183 168 114 210 240 238 234 235 212 174 171 120 124 161 183 218 231 235 234 219 173 175 199 120 159 200 227 237 236 227 170 196 139 144 169 98 83 85 43 119 85 77 129 83 107 182 195 239 240 239 239 240 244 242 237 241 241 241 244 246 240 242 243 242 242 242 242 246 246 238 238 239 246 244 242 238 238 238 238 237 241 240 241 242 240 244 244 244 237 238 242 244 246 247 244 242 243 243 240 242 237 240 240 245 246 247 245 182 192 160 166 243 238 242 234 169 198 140 194 245 241 241 243 245 248 241 241 244 245 247 247 246 214 117 142 162 231 248 243 207 130 180 206 219 236 241 245 191 173 193 139 177 233 189 144 92 132 143 166 177 181 91 139 173 96 62 68 96 142 180 181 178 177 179 180 181 178 178 174 178 180 181 182 190 193 191 194 193 197 206 208 216 220 230 243 243 241 244 241 248 249 246 243 239 240 239 245 245 245 243 243 241 238 242 243 242 244 242 238 231 230 143 128 111 141 240 237 237 240 167 129 121 123 184 197 182 175 153 116 102 101 104 104 120 118 115 101 110 125 124 113 102 96 99 106 120 131 142 138 137 146 148 154 148 143 138 142 149 147 142 137 141 142 139 139 137 138 131 124 134 132 128 123 125 128 135 143 126 140 163 129 116 190 173 171 131 134 137 140 135 136 179 181 207 149 164 140 139 136 140 133 130 134 138 139 131 121 106 99 73 63 57 87 135 138 128 90 67 67 66 62 55 51 52 53 53 53 53 52 50 48 46 46 44 45 45 47 43 43 42 42 43 42 41 42 40 40 40 41 41 40 41 41 38 38 38 39 38 39 37 37 38 38 40 39 39 39 40 38 40 41 40 39 40 40 41 42 40 45 47 48 49 49 47 45 40 43 39 36 38 37 37 38 38 40 38 39 40 40 43 45 49 51 53 58 62 63 64 63 64 64 69 87 115 116 94 107 118 111 123 122 119 79 77 131 167 165 166 167 250 254 252 230 170 144 126 126 125 124 125 124 122 120 134 108 111 108 103 101 98 97 98 96 91 91 103 108 104 97 100 103 107 109 112 118 118 116 111 112 114 118 118 118 116 115 116 122 120 121 121 118 118 121 123 125 125 121 125 128 131 133 146 196 238 238 238 238 241 241 235 234 189 187 158 111 217 233 239 226 201 176 185 166 114 164 217 217 223 215 197 172 142 141 184 196 115 151 236 236 241 236 205 165 196 126 152 182 122 77 89 45 151 92 79 129 105 84 177 185 239 242 243 246 244 244 240 238 237 242 240 241 247 242 244 241 244 243 243 244 242 247 242 237 244 248 244 238 237 237 242 244 242 242 240 239 240 242 243 240 239 240 242 241 242 242 247 244 242 242 241 239 240 241 239 240 247 247 239 236 174 194 154 170 242 240 243 227 166 194 141 206 245 243 246 246 245 248 243 242 245 244 245 245 238 184 136 132 164 230 237 233 218 123 158 182 195 235 244 241 179 181 187 139 190 237 208 148 105 116 147 157 182 179 91 147 211 116 64 66 90 150 236 237 237 232 228 231 232 226 237 235 237 236 233 232 242 242 237 236 230 233 244 239 241 240 245 248 242 240 242 244 244 246 245 246 245 244 245 245 247 245 244 243 243 236 240 238 244 248 244 243 240 236 146 133 114 153 246 244 239 243 167 139 123 135 225 238 236 239 228 173 154 162 147 142 144 150 144 136 135 136 139 146 143 142 144 149 144 143 142 137 138 145 152 153 145 149 149 150 156 155 152 146 146 145 141 139 139 139 139 139 141 142 145 143 143 148 145 142 129 135 158 130 117 193 156 184 114 120 122 122 116 136 168 170 199 140 145 140 135 131 134 134 132 129 131 133 133 128 112 108 91 67 56 61 119 153 151 140 77 46 57 62 56 52 53 52 54 56 55 56 58 55 56 54 52 51 51 53 50 51 50 47 47 45 44 44 41 41 41 40 41 42 42 43 40 40 40 40 40 40 42 40 39 39 39 39 38 38 39 38 38 38 39 39 39 42 41 41 41 44 46 47 49 48 48 47 44 43 40 39 39 38 37 37 38 40 39 40 43 45 48 51 53 55 58 61 63 66 64 63 66 69 99 118 111 100 76 88 111 115 117 115 112 105 76 112 162 166 157 146 242 254 254 250 186 151 130 129 126 121 125 126 121 119 176 126 125 124 124 125 122 123 126 125 120 119 118 112 96 94 89 86 85 85 89 96 102 98 95 97 102 104 111 112 116 114 116 115 117 121 123 122 123 124 125 126 124 123 127 131 148 176 218 234 234 235 236 236 235 234 230 230 175 198 142 111 213 203 178 143 119 122 199 157 114 150 146 123 120 118 118 120 123 143 189 186 117 134 208 212 187 155 138 160 195 121 158 172 161 96 102 84 103 100 85 102 138 79 148 188 231 242 240 242 237 243 238 240 240 238 238 240 239 241 244 242 239 239 241 241 241 241 243 239 243 241 237 239 236 236 235 236 239 241 239 236 238 241 241 240 243 241 242 238 238 239 240 239 241 241 245 243 243 241 239 239 235 239 239 235 169 196 148 181 239 238 241 216 166 185 142 214 247 245 247 244 241 245 246 244 245 245 242 234 203 133 123 149 226 233 238 239 216 112 92 116 178 230 242 241 169 186 182 145 196 234 222 154 120 94 155 160 185 165 94 164 237 146 71 66 89 119 239 243 236 243 243 238 239 238 238 243 240 246 247 250 246 241 239 237 237 241 246 245 243 237 244 236 234 240 246 244 241 240 240 238 244 246 249 248 242 243 238 242 242 237 242 245 243 241 245 245 243 236 141 133 113 166 245 242 243 245 161 144 124 146 230 240 243 243 226 187 155 162 157 155 152 152 154 146 150 167 172 190 172 158 158 146 142 141 144 140 137 140 153 147 147 149 147 150 152 151 150 150 142 144 142 138 136 139 142 144 142 144 143 148 144 141 142 138 133 134 139 138 133 174 149 188 131 134 128 126 120 134 149 173 188 149 141 141 120 122 122 124 122 119 120 126 129 133 128 115 105 94 70 61 76 135 152 157 142 111 46 55 44 47 57 62 65 65 63 62 58 57 57 57 55 57 58 59 56 58 57 55 54 54 52 51 51 51 49 48 50 51 50 49 48 49 46 47 45 45 44 42 41 40 39 38 37 37 39 39 39 39 43 42 40 39 39 41 42 43 42 44 48 48 50 49 48 46 42 40 41 41 40 39 41 41 41 42 45 50 53 57 60 61 64 63 62 65 67 70 84 111 127 109 84 71 73 79 85 75 64 58 56 64 83 89 136 160 131 116 204 250 253 250 185 151 133 126 120 123 123 122 122 120 200 141 120 122 121 121 119 122 120 121 123 123 124 124 123 126 131 128 123 118 114 114 112 108 100 94 91 82 90 96 103 105 109 105 104 109 117 119 120 124 125 123 126 125 134 168 216 233 233 232 230 235 230 230 225 227 228 230 168 199 137 102 135 128 121 119 125 125 208 150 110 103 110 113 119 117 119 121 121 147 192 175 123 109 126 128 119 124 142 165 195 116 164 145 177 147 110 108 144 131 105 113 156 91 119 193 197 209 218 218 232 242 242 243 238 235 237 245 244 243 245 243 243 244 242 242 240 238 237 237 238 237 245 244 239 237 237 238 235 235 237 237 238 241 243 243 244 245 242 242 243 241 241 244 244 243 241 240 239 240 236 242 242 239 239 235 166 198 148 189 243 241 242 207 175 176 147 219 245 244 247 245 241 243 247 246 235 210 178 161 138 147 182 195 234 235 206 176 146 120 142 189 234 239 245 242 163 187 173 148 203 243 234 177 124 84 154 168 188 154 101 172 240 172 77 66 88 101 230 247 244 245 244 242 247 241 244 245 242 246 246 248 247 249 243 234 235 241 248 248 246 241 243 237 240 243 247 245 243 241 239 243 244 246 247 247 243 243 243 246 249 246 247 248 243 240 246 246 242 229 139 134 113 176 248 245 247 246 158 148 125 156 242 244 243 244 215 192 157 155 160 163 158 157 157 152 155 165 173 193 177 162 160 152 147 147 151 149 144 144 152 148 144 143 144 152 159 157 147 147 143 141 143 141 140 142 144 145 142 142 147 149 152 152 143 143 141 135 133 157 126 162 131 175 142 146 145 145 143 133 134 160 185 170 138 145 129 126 125 126 123 122 122 127 124 130 136 126 110 107 89 75 65 89 150 191 212 212 84 56 46 44 56 63 60 67 80 83 75 67 57 54 55 55 57 58 57 58 59 55 56 54 55 55 55 56 54 54 55 55 56 55 53 55 52 50 50 49 47 46 45 43 40 42 42 43 42 42 42 42 42 42 41 38 37 39 41 42 43 45 47 48 50 52 49 49 46 45 44 43 43 44 45 47 47 49 53 58 62 63 63 66 64 65 65 62 74 100 124 126 120 85 60 52 48 46 42 40 38 40 46 55 92 120 127 141 175 137 164 231 253 252 194 151 138 128 124 126 124 127 128 125 209 173 127 126 120 117 118 122 120 121 120 123 122 122 124 124 126 122 124 124 125 126 127 131 130 127 125 126 121 121 120 116 111 107 100 96 94 92 98 108 112 115 122 125 192 230 231 236 238 231 229 235 234 236 230 230 213 184 165 197 126 99 117 116 119 120 120 123 222 143 101 103 110 113 109 110 115 118 121 151 192 168 121 107 118 116 123 161 145 168 193 111 160 135 160 131 146 127 162 167 118 118 153 120 90 177 185 136 132 134 144 169 186 182 170 178 189 205 217 223 224 221 232 236 230 238 239 238 239 238 236 239 240 243 241 242 243 244 243 243 243 247 243 244 244 243 243 245 238 240 243 241 244 244 242 243 239 239 235 236 237 236 239 240 241 229 163 202 146 198 245 241 240 196 176 165 150 228 245 241 243 247 239 226 200 181 164 155 174 191 208 234 242 234 204 166 145 162 196 223 238 243 239 245 245 234 164 192 165 152 205 236 244 208 136 93 129 164 187 141 111 188 244 205 84 65 85 90 191 243 239 236 239 246 244 246 243 241 246 242 241 244 247 243 240 242 239 237 244 246 247 249 243 240 240 244 242 240 233 235 237 240 247 243 240 244 243 239 245 250 250 246 241 243 243 242 243 241 246 218 143 138 113 183 249 247 248 242 148 153 125 169 246 245 246 247 236 210 158 158 149 169 165 162 163 159 158 169 172 195 185 165 159 158 153 151 154 149 144 138 146 147 143 147 154 156 153 149 150 154 151 149 148 146 139 141 135 133 136 141 147 148 147 149 151 151 153 125 146 183 118 155 120 138 158 151 153 149 142 122 147 140 167 173 131 146 130 127 133 140 138 132 121 133 139 137 143 144 125 119 111 105 87 73 107 193 230 230 96 71 58 107 123 125 155 170 187 200 170 106 99 88 100 97 84 77 69 65 63 61 55 57 59 56 57 54 53 54 53 55 53 48 49 53 57 57 58 56 52 52 52 51 49 48 48 48 47 45 45 45 42 40 39 38 40 41 42 43 45 47 48 50 53 56 54 55 52 51 51 48 46 47 50 52 54 56 60 63 65 64 64 64 61 66 79 97 127 130 126 122 93 52 43 39 38 39 45 47 55 72 89 104 116 129 133 134 209 227 202 203 253 254 221 154 137 132 130 133 127 127 128 130 203 184 136 122 121 120 122 124 123 122 119 121 125 125 127 126 129 126 124 125 127 126 129 128 126 126 124 122 121 123 126 125 124 125 125 125 127 127 125 126 125 139 175 187 207 216 214 221 224 222 224 219 233 235 225 191 143 128 174 189 118 98 115 117 117 119 121 130 225 137 96 102 112 112 112 113 112 112 116 155 198 153 128 133 139 133 112 131 144 174 187 110 160 128 123 137 126 146 159 184 124 122 142 149 77 147 193 147 129 129 132 128 132 133 132 132 130 134 145 149 149 151 159 163 169 176 180 188 204 223 231 232 234 240 240 241 241 244 243 243 241 244 240 243 243 234 241 243 240 239 241 241 242 241 241 243 243 243 241 239 241 242 243 242 242 229 163 205 141 204 246 243 241 185 183 167 154 231 244 240 230 212 185 160 154 169 205 223 239 241 241 237 211 172 153 174 210 226 238 239 237 240 243 244 246 232 164 192 160 151 211 240 241 225 143 110 126 167 190 131 119 200 245 227 101 69 76 89 163 240 240 241 238 239 243 240 244 242 240 227 229 245 249 241 239 244 240 243 241 240 246 247 247 247 248 244 240 236 241 245 244 248 247 240 244 240 236 235 244 249 250 246 243 238 237 241 242 246 249 215 148 138 115 198 248 247 246 234 148 161 122 180 247 248 245 248 248 229 159 176 138 178 173 165 162 159 160 170 174 195 194 170 152 156 156 154 152 151 141 136 144 154 148 150 161 160 153 153 156 157 159 155 155 156 153 150 145 139 140 146 142 139 143 145 152 153 150 122 155 184 115 160 120 117 167 146 147 146 137 118 185 148 147 177 127 146 139 134 137 144 150 148 148 152 150 152 168 184 186 143 130 151 144 117 91 96 145 163 78 74 69 188 221 219 231 232 231 232 177 104 105 96 171 200 186 166 144 127 102 87 76 73 70 64 63 60 58 55 55 56 56 53 51 56 57 54 56 55 54 54 53 55 56 55 54 53 52 51 50 49 48 48 47 47 47 47 48 47 48 49 50 51 53 55 57 56 55 53 54 52 50 52 55 57 59 61 65 63 65 64 64 70 83 100 124 132 132 132 116 84 52 40 41 42 44 50 61 82 106 131 160 162 163 169 165 154 149 165 192 191 242 254 240 172 137 131 134 136 128 127 129 132 177 198 152 128 122 121 122 121 124 123 122 122 126 126 126 125 124 122 123 125 124 127 131 129 127 127 126 123 125 125 122 123 127 127 125 129 134 131 143 163 210 234 242 244 245 242 239 240 235 230 220 202 184 176 155 145 127 124 185 177 111 96 111 112 111 113 111 146 222 130 87 105 107 108 110 108 103 101 109 158 200 134 125 129 149 139 110 114 139 176 182 110 153 116 117 139 129 100 154 196 148 123 126 173 86 110 197 165 119 117 116 115 126 126 127 128 128 127 133 133 134 133 133 135 131 134 129 129 127 128 142 146 154 165 170 169 179 200 203 211 224 228 236 241 243 241 240 244 241 239 240 240 241 242 242 240 240 238 240 243 242 241 241 241 241 219 164 200 137 209 242 237 236 172 187 161 163 230 217 175 143 152 178 198 224 238 242 242 227 198 170 173 185 192 225 234 242 240 238 239 234 239 242 243 241 216 167 194 154 150 221 240 241 241 165 125 131 171 190 122 128 212 244 240 132 68 72 90 140 233 241 235 232 238 238 242 241 241 234 237 235 239 243 243 246 245 240 243 244 245 245 246 250 249 250 248 242 241 242 239 246 246 238 241 237 237 236 239 245 246 248 246 248 242 237 240 246 246 249 211 160 137 123 214 245 239 243 220 152 171 124 195 243 237 239 247 243 217 168 180 154 209 236 225 205 191 178 179 172 187 195 187 194 147 143 150 145 143 140 142 153 156 153 150 149 161 160 154 156 160 155 153 156 149 149 147 150 143 145 138 125 133 140 143 148 152 144 128 171 183 118 164 116 112 169 140 148 153 135 142 203 164 134 178 134 147 140 138 144 151 156 163 174 189 210 227 240 241 240 212 139 139 165 168 162 146 120 97 91 82 71 91 111 126 144 162 178 192 137 94 100 92 190 220 218 222 225 224 195 122 111 101 127 147 121 107 101 97 92 87 78 75 69 69 63 63 58 58 59 57 55 56 56 56 57 59 57 56 56 55 53 53 55 54 54 55 55 53 52 50 53 53 53 51 53 57 53 52 52 53 55 57 59 62 69 75 80 79 83 93 105 118 130 135 132 127 113 87 52 46 44 45 46 55 73 100 135 158 136 132 142 137 130 126 132 157 183 170 139 144 203 241 252 197 139 134 134 132 131 131 130 134 146 206 170 143 124 122 123 122 124 125 123 124 126 125 124 124 124 124 123 124 124 127 128 127 130 131 128 128 129 126 121 125 131 136 137 138 136 167 212 225 233 234 234 235 237 235 235 225 206 186 172 170 174 190 195 181 141 132 184 173 106 105 118 113 110 104 100 158 216 123 85 96 98 100 106 105 97 80 102 164 199 126 133 139 146 137 107 112 134 176 176 108 145 117 111 119 155 90 132 187 171 114 110 164 115 87 188 174 125 113 113 114 124 122 123 124 123 126 126 125 126 125 126 128 129 132 129 131 125 125 135 139 137 136 139 139 137 143 147 147 155 159 184 207 239 242 242 243 243 238 241 246 241 244 235 240 243 248 246 247 244 244 243 245 244 212 163 194 141 216 245 240 237 171 193 151 165 170 151 159 187 213 238 241 245 235 204 169 154 167 195 218 232 241 228 229 246 240 227 238 239 237 239 239 241 209 171 194 151 153 233 238 239 238 186 135 132 171 187 116 137 219 244 244 159 72 67 89 121 221 244 239 236 239 240 242 245 246 244 241 238 240 243 247 244 243 239 242 239 239 246 246 244 238 236 243 247 251 249 246 247 244 238 239 239 239 242 240 244 243 238 242 240 238 240 243 243 238 246 200 167 134 133 222 246 242 247 212 158 170 128 209 235 206 224 223 223 219 172 168 178 212 250 249 245 239 231 222 170 179 199 208 234 166 148 144 147 150 151 145 148 151 154 149 156 158 151 146 153 160 152 154 154 147 147 143 147 146 151 144 138 141 146 150 153 155 146 116 175 180 120 170 105 118 167 152 155 149 129 158 200 159 138 169 139 150 144 153 164 181 207 214 225 237 239 240 241 242 242 243 197 137 130 153 161 165 170 167 156 139 131 119 106 98 91 89 85 87 73 70 69 68 100 129 146 168 199 214 202 120 111 93 145 153 134 128 134 138 132 131 133 129 129 131 128 116 94 86 80 75 70 65 67 64 63 64 62 60 60 60 59 57 59 57 56 56 55 57 55 54 58 60 61 58 60 61 56 53 49 51 56 57 58 64 85 92 94 104 121 128 128 132 130 130 122 98 63 50 52 50 49 55 69 101 139 143 140 135 123 118 131 137 142 143 126 111 131 181 183 148 194 213 245 203 147 143 138 136 135 135 134 134 108 190 187 164 122 123 122 126 128 128 125 126 123 123 121 120 127 126 124 125 127 129 129 130 131 129 131 126 121 118 114 120 122 131 147 175 215 239 243 233 240 246 241 232 214 197 175 165 176 193 217 233 206 173 133 122 124 132 180 150 93 103 118 117 116 114 112 153 185 106 100 116 101 93 92 93 85 76 105 167 196 118 133 133 133 142 96 106 137 184 164 112 135 114 110 102 149 119 98 145 189 123 100 137 156 78 154 187 140 122 122 121 119 119 122 126 122 124 126 124 125 120 120 126 132 136 131 131 126 129 125 124 122 128 134 136 134 134 135 135 137 137 138 139 191 238 245 240 241 241 243 240 236 242 240 243 244 248 244 243 239 242 244 240 235 200 166 190 140 217 238 228 217 159 188 144 159 175 210 237 245 244 233 213 171 146 146 169 216 234 235 240 243 245 239 242 235 229 230 238 240 237 238 241 240 194 177 190 149 158 234 241 242 239 206 144 150 173 180 107 145 224 238 238 190 79 67 83 108 186 238 242 242 238 242 244 250 249 247 245 241 244 243 245 241 240 242 243 242 240 249 250 246 243 239 237 238 244 247 242 245 238 241 247 244 241 246 245 239 239 243 243 242 244 246 245 239 237 240 188 177 136 140 229 247 244 242 202 162 159 135 218 249 248 248 246 245 244 179 151 187 202 241 241 247 245 243 241 179 170 196 218 244 226 214 204 192 178 160 155 158 162 158 154 150 148 150 150 154 154 149 154 148 148 147 148 147 145 154 154 152 150 158 155 146 145 146 112 173 177 126 171 84 121 155 165 155 153 126 164 193 135 151 148 147 152 191 214 234 243 243 241 240 243 239 240 239 240 244 245 241 213 146 117 131 151 163 162 162 164 169 169 171 169 165 161 153 142 134 126 114 106 97 85 77 72 70 69 69 59 67 63 77 84 88 94 103 115 123 124 127 136 151 167 191 202 153 137 134 131 124 122 117 112 107 101 99 95 90 85 83 82 80 79 78 82 82 82 87 90 92 88 76 67 58 56 51 46 44 40 39 39 44 48 52 71 115 136 132 132 131 130 120 98 59 47 54 55 59 63 80 109 138 150 131 130 131 132 127 122 127 132 138 138 148 158 126 106 165 188 178 194 195 190 163 140 137 139 138 141 139 141 110 154 201 177 124 126 129 129 131 130 128 126 124 127 123 124 126 127 128 129 126 129 132 132 132 128 133 131 128 121 125 132 136 152 214 236 238 231 233 236 238 240 213 176 158 172 199 218 237 247 233 192 144 129 126 123 120 134 142 101 80 105 113 116 111 112 113 137 135 99 100 114 111 112 116 117 122 119 128 173 191 111 130 128 128 142 93 102 142 187 156 121 124 96 95 91 126 150 88 130 188 169 120 116 175 93 127 189 148 125 120 120 118 115 119 123 121 117 117 120 126 124 120 125 127 128 128 129 132 135 125 125 129 131 134 133 137 138 139 139 133 132 136 141 160 222 242 242 242 246 246 242 240 240 244 240 240 239 240 242 243 242 240 239 236 194 173 184 140 215 203 163 149 144 184 135 168 231 234 239 239 214 160 136 138 176 213 227 235 236 240 243 246 245 243 243 236 228 232 240 245 238 241 245 239 186 181 186 146 161 233 236 237 236 223 156 160 178 176 101 152 227 236 237 207 94 65 76 104 166 249 246 242 245 240 244 249 248 247 249 244 247 244 244 246 243 239 242 250 247 251 248 244 246 241 240 241 247 244 243 246 244 243 246 239 237 246 245 243 239 239 238 238 243 243 235 235 233 241 186 177 140 150 232 243 242 240 192 170 157 141 221 248 251 245 243 242 242 186 126 184 198 235 245 243 240 243 243 194 147 190 208 240 240 239 242 239 231 224 218 214 211 204 198 187 177 176 174 169 162 161 163 157 157 165 162 157 155 158 157 139 142 155 151 151 150 138 121 176 170 131 172 80 118 149 162 152 159 130 166 191 124 156 134 149 162 241 242 240 241 241 243 240 244 230 232 237 239 243 243 246 240 226 200 160 142 138 130 126 135 153 162 166 164 155 152 155 153 153 155 157 157 157 154 149 142 129 128 120 108 93 85 75 72 64 59 60 64 63 67 75 81 91 106 133 157 136 128 125 128 132 135 137 140 137 136 135 135 133 131 133 130 128 127 125 126 127 127 125 123 117 108 74 50 43 41 33 36 37 36 33 38 42 50 88 121 139 137 133 135 130 107 68 56 55 58 62 63 75 103 142 154 138 128 128 133 134 133 129 129 129 131 134 135 139 146 158 141 118 175 164 144 167 176 170 140 137 144 143 142 152 162 149 126 203 172 153 131 130 129 128 130 132 128 125 132 130 129 126 129 129 128 124 130 134 136 136 132 134 134 135 134 146 143 141 153 198 207 201 205 184 179 169 166 178 199 228 240 246 242 221 183 144 134 135 130 124 120 117 88 54 48 56 95 107 111 119 118 91 99 95 88 90 104 108 112 116 121 122 118 138 179 183 106 127 118 130 139 113 105 150 189 152 127 114 91 94 95 108 168 95 120 170 202 153 114 159 121 97 183 161 123 111 109 109 110 117 118 117 116 113 114 119 123 123 123 126 125 126 126 128 132 126 127 128 129 130 129 133 131 131 132 138 140 140 142 183 235 244 245 247 248 240 242 237 237 249 246 244 241 239 238 238 239 246 241 239 184 178 174 122 134 139 161 168 146 179 127 169 230 206 179 148 131 148 140 208 225 218 224 229 225 228 237 238 245 249 243 237 233 240 244 238 206 222 239 236 176 187 180 142 168 242 240 239 241 232 172 163 182 169 100 144 217 223 228 216 107 62 67 101 134 240 244 244 248 238 236 249 248 247 248 249 246 244 238 242 245 245 246 248 249 245 242 246 246 240 247 249 247 244 246 247 244 234 243 240 240 246 244 243 242 233 241 237 237 247 250 246 244 238 179 173 143 159 233 246 248 247 189 181 159 150 233 250 249 244 246 247 240 158 90 140 170 216 241 242 246 247 246 196 114 175 192 223 236 244 242 239 239 236 238 241 241 244 246 244 241 240 238 236 230 232 230 230 225 225 228 225 221 215 210 206 209 210 202 191 198 167 142 178 158 146 170 77 108 142 208 223 220 142 168 187 117 160 115 143 151 241 239 242 238 246 245 240 244 241 245 243 240 234 236 238 237 244 244 237 229 209 205 184 172 166 141 130 132 136 142 150 151 152 154 158 154 156 154 155 154 153 153 160 164 164 164 155 152 149 138 130 125 113 103 93 86 78 71 65 64 64 56 58 61 68 75 84 91 100 110 118 121 125 129 130 132 137 138 135 137 141 139 139 141 141 141 137 119 89 68 49 40 44 40 46 57 76 106 134 138 139 135 124 106 69 54 61 63 69 72 84 107 146 161 145 130 133 130 135 137 131 133 132 131 132 131 132 134 140 141 144 157 132 123 183 153 155 177 189 156 156 168 190 208 228 239 176 120 197 175 163 134 132 131 130 131 128 126 129 130 132 130 131 128 133 131 128 133 136 137 134 132 137 139 151 181 209 201 184 164 145 149 144 144 149 171 184 204 216 217 226 228 212 187 149 136 135 134 133 127 123 120 110 75 50 43 63 101 115 118 118 111 94 82 57 59 87 103 114 117 120 119 118 122 141 184 176 110 126 121 122 123 121 110 154 193 146 125 121 121 124 126 123 160 124 100 162 199 157 150 148 152 80 160 178 126 90 89 101 104 111 115 116 116 117 118 117 116 115 115 123 123 124 126 128 126 124 126 124 126 122 122 125 127 129 128 131 138 147 164 221 239 249 247 244 245 240 244 239 241 247 244 240 247 247 243 243 242 242 236 228 168 184 167 114 136 173 180 159 146 173 124 126 148 134 127 124 131 159 131 144 146 153 165 166 174 186 207 224 242 243 240 233 233 240 247 240 228 231 239 226 170 193 178 140 179 243 238 242 242 239 197 163 186 158 99 136 132 134 114 101 71 66 68 92 113 229 238 235 237 235 240 246 244 243 249 244 246 242 238 248 243 242 245 244 245 242 245 247 245 246 250 249 246 244 244 246 246 240 239 240 239 246 246 244 243 240 240 244 244 244 249 249 248 238 177 170 138 165 237 244 243 239 179 185 157 158 238 247 247 246 247 236 188 104 80 123 184 236 243 243 245 243 244 180 85 106 126 207 243 247 244 241 238 238 242 241 241 240 236 236 243 246 244 241 241 241 242 238 240 246 244 243 244 244 240 234 242 245 243 238 239 187 158 181 150 158 166 80 102 138 216 246 233 154 175 184 115 164 110 136 141 232 235 237 238 247 245 244 241 244 247 243 239 238 239 240 237 231 233 240 245 239 244 238 232 232 218 198 190 179 166 151 126 107 110 112 116 133 136 140 143 155 157 158 156 167 163 161 160 157 157 154 156 152 153 152 152 147 142 138 131 121 113 99 88 77 68 59 54 62 64 61 61 66 68 73 81 91 99 111 120 128 132 136 138 139 137 141 144 136 130 113 70 55 45 57 87 118 130 134 135 128 108 73 60 59 65 74 76 81 103 143 158 154 140 135 132 132 130 134 140 136 136 138 138 135 136 135 135 136 139 141 143 138 125 159 175 143 165 211 194 214 231 242 243 245 246 165 140 173 195 149 146 131 134 133 136 132 129 130 131 130 128 134 134 136 133 127 133 138 141 142 143 142 144 198 203 198 192 187 177 169 170 177 183 183 185 184 189 183 168 150 143 134 134 128 127 130 129 128 128 124 116 106 93 89 94 108 119 123 121 112 99 75 59 65 77 106 115 116 122 124 123 122 125 149 191 165 110 126 124 124 124 127 121 158 196 138 124 126 124 121 123 123 131 161 88 143 181 170 145 164 176 84 129 194 153 127 123 119 112 104 106 104 103 105 104 100 99 102 108 114 120 113 116 119 125 129 127 122 121 121 123 123 124 129 128 135 142 186 228 235 234 238 242 236 236 240 249 243 241 244 245 249 248 245 246 235 209 185 160 134 138 191 160 107 118 121 122 132 151 167 120 112 124 122 119 112 111 111 108 109 112 121 123 117 112 118 121 128 155 186 181 154 154 168 170 164 164 196 197 178 167 198 173 140 183 233 237 241 244 249 227 162 189 144 101 131 107 54 54 46 49 68 67 78 93 204 239 243 240 242 242 245 245 244 243 243 243 244 236 243 239 234 241 248 247 240 241 245 237 241 247 239 240 241 239 244 246 243 244 243 245 245 243 240 241 237 232 235 239 243 247 242 245 236 176 168 127 173 241 240 241 236 173 194 145 173 237 239 232 208 171 135 134 162 181 223 242 236 237 238 232 212 182 118 91 113 152 231 244 242 242 242 244 244 246 247 249 238 236 240 242 241 242 246 244 235 238 242 245 244 249 248 247 246 242 243 246 247 240 240 239 181 165 184 145 168 157 87 94 132 206 244 232 158 178 180 113 173 104 114 116 216 236 237 240 241 239 243 242 250 242 242 241 243 241 247 241 241 242 238 240 244 241 238 236 237 237 238 238 244 244 242 191 123 129 118 163 188 181 163 141 109 103 103 103 111 116 128 132 137 146 153 152 155 161 158 155 157 155 154 154 158 159 160 156 154 150 143 132 125 120 109 100 91 81 74 69 64 61 56 56 63 68 69 75 82 90 102 108 116 122 129 83 60 52 68 126 129 123 109 94 68 62 74 77 82 85 92 108 140 167 148 134 137 134 137 137 139 140 137 139 141 138 139 140 137 137 137 137 136 141 143 145 152 128 141 179 161 142 193 214 244 243 245 244 243 244 146 166 157 194 142 162 139 141 140 137 134 132 133 135 134 135 135 134 136 137 138 143 144 147 162 177 181 193 207 215 216 219 219 228 238 238 243 243 242 242 240 229 187 151 139 138 137 130 123 124 126 124 125 122 125 119 119 116 119 121 120 122 125 122 112 103 98 96 105 113 121 121 121 124 127 124 125 126 154 192 158 113 128 126 125 127 127 126 160 198 131 125 125 128 126 123 123 121 164 108 123 165 181 140 144 185 110 101 194 160 127 117 121 124 124 124 123 120 126 126 121 116 110 108 115 121 106 101 106 119 135 139 121 120 124 125 124 123 126 122 127 185 231 235 239 239 246 243 237 235 241 245 243 245 242 240 246 243 223 197 161 139 132 129 127 145 192 152 104 117 124 120 132 161 160 113 109 122 118 109 107 110 109 111 110 108 114 118 117 114 116 120 125 128 132 129 116 121 124 122 125 126 130 134 145 168 196 166 143 152 164 176 187 186 197 201 163 195 135 108 114 53 44 49 43 42 66 67 72 94 170 236 241 240 237 240 244 245 238 243 248 243 239 236 237 237 236 244 245 242 241 239 237 238 247 241 237 243 242 242 243 240 240 240 238 240 240 239 240 242 240 240 236 235 239 241 241 245 232 174 169 124 184 243 244 243 233 173 196 139 181 234 210 163 139 140 165 205 236 236 239 241 244 238 199 165 143 127 145 190 218 229 236 240 236 234 236 241 245 247 247 243 238 247 242 240 243 243 248 247 246 246 251 246 244 245 236 239 247 247 242 238 242 240 238 242 181 168 187 146 177 146 94 90 128 190 246 219 166 180 176 110 179 103 102 98 195 240 244 244 243 245 241 240 245 239 227 240 241 239 248 247 249 247 234 238 244 237 227 227 237 238 238 238 248 247 242 182 135 134 116 200 241 239 234 221 143 121 133 122 117 118 131 122 112 110 106 105 108 114 115 123 132 139 148 157 160 161 166 168 164 160 155 154 154 155 150 150 144 138 131 129 120 116 110 102 95 90 80 78 72 67 63 62 66 68 70 62 59 58 59 75 71 66 67 79 108 125 114 102 101 112 131 152 145 139 140 141 142 137 140 139 141 142 142 144 142 139 143 140 142 141 142 141 142 145 161 180 202 162 124 172 181 137 175 204 245 242 245 248 246 244 144 172 163 189 150 149 147 141 142 138 135 135 134 137 146 145 142 145 144 146 152 154 170 200 245 252 250 252 253 251 245 243 244 249 247 244 250 250 247 244 224 167 136 136 133 133 132 132 131 129 127 125 123 124 129 127 125 125 125 125 126 126 124 124 118 120 120 120 121 130 132 130 131 132 127 124 123 125 161 197 148 112 126 126 126 124 127 128 163 200 128 124 123 125 126 125 125 125 148 148 100 158 171 161 122 163 152 85 176 177 132 122 127 127 125 124 123 123 127 127 127 130 134 131 130 132 133 130 129 130 131 128 124 126 126 118 106 111 121 127 163 207 231 228 225 229 237 237 236 244 241 240 242 237 243 225 181 156 138 138 133 125 124 124 123 146 192 143 97 119 120 118 127 168 150 110 101 103 107 108 107 106 103 104 107 106 110 113 115 112 117 119 118 117 119 119 118 121 121 123 122 120 119 119 143 171 194 158 147 141 139 144 142 137 129 135 171 195 124 114 95 45 45 52 45 40 59 64 67 92 136 211 234 236 237 246 249 243 237 247 250 245 240 241 244 242 243 245 242 234 229 237 246 245 244 238 243 244 243 241 236 240 239 240 237 240 236 233 245 243 237 240 240 239 242 245 245 242 220 170 177 122 193 245 245 239 225 170 192 131 182 150 139 158 199 228 240 242 243 244 236 224 202 168 145 152 174 198 234 241 244 243 244 241 244 245 250 250 246 248 243 238 239 245 245 249 248 244 245 237 244 245 250 249 240 236 241 241 241 241 242 239 235 233 238 241 175 173 182 140 187 134 100 89 122 167 243 209 176 187 163 111 189 111 95 104 173 245 239 239 240 236 236 236 235 239 236 240 224 234 246 247 247 246 241 241 239 241 247 238 239 239 244 242 241 244 238 170 143 132 127 210 240 236 237 230 160 169 142 128 114 130 186 182 144 143 144 140 138 134 128 125 120 122 117 113 108 105 106 112 121 128 137 146 153 156 164 162 157 154 157 156 152 151 146 147 147 146 144 138 136 132 132 128 121 116 112 108 108 105 110 115 131 145 145 146 136 125 129 146 161 165 150 137 137 142 141 139 140 142 140 143 143 142 144 142 141 144 146 139 143 146 157 171 191 211 234 238 241 214 117 163 191 141 157 195 249 248 245 246 247 245 144 160 174 182 175 134 157 141 140 136 136 140 142 143 143 145 147 148 148 150 173 207 237 246 252 248 248 248 249 245 243 246 249 247 248 247 250 251 245 209 162 144 143 137 138 133 134 134 135 136 135 131 127 128 131 131 128 126 127 128 129 131 131 130 129 131 129 128 131 131 131 133 130 132 131 128 128 130 165 203 137 113 124 125 126 128 131 132 168 198 128 124 122 125 124 124 124 124 130 167 98 151 161 175 124 132 173 91 151 189 139 131 128 125 127 125 124 124 126 128 128 127 132 129 132 134 134 133 133 133 133 133 136 138 137 138 142 143 169 214 236 236 238 234 229 227 229 224 222 228 230 227 237 229 192 155 137 141 140 139 134 128 126 123 126 147 193 138 96 121 124 119 127 180 142 103 92 101 108 107 108 105 101 100 103 104 111 113 116 113 115 116 117 116 118 118 117 120 122 120 121 117 119 118 148 173 195 147 146 139 136 137 139 132 122 136 174 194 115 124 90 57 49 57 49 42 58 72 65 81 119 150 160 169 179 209 229 230 233 239 243 242 232 237 246 239 238 240 236 240 244 240 241 242 244 244 245 245 244 244 241 242 240 242 239 239 238 237 244 244 238 238 243 245 248 249 249 247 220 172 174 124 204 249 247 240 216 168 189 130 184 164 202 224 242 245 237 239 242 229 184 158 153 163 189 214 234 238 243 244 247 242 234 236 249 249 249 249 243 244 243 240 241 243 246 247 244 242 241 240 243 241 246 243 242 240 241 241 242 240 242 239 240 238 240 241 173 176 179 136 190 130 104 95 117 152 238 205 179 190 154 115 188 116 90 126 158 238 236 239 236 236 238 230 211 230 237 242 235 235 233 236 243 238 237 241 245 246 249 242 241 243 242 242 242 237 231 159 151 135 130 216 238 233 237 213 209 233 149 134 115 138 198 196 148 151 149 147 145 145 144 145 145 171 175 184 180 153 129 125 117 110 109 107 108 103 105 108 113 122 135 140 151 161 164 168 161 159 149 152 152 146 150 150 153 153 156 156 158 157 160 166 167 169 156 157 161 159 145 145 137 137 140 139 142 142 142 141 141 143 141 140 145 143 147 147 146 148 152 157 175 189 209 227 236 237 241 239 240 235 139 176 184 146 148 194 245 246 245 246 248 246 147 139 171 176 184 132 153 144 136 138 147 150 147 150 150 148 152 164 185 218 246 249 245 246 253 247 245 250 251 248 251 252 250 250 250 248 238 212 168 149 149 148 144 142 137 139 141 140 135 137 139 136 134 135 135 131 133 131 131 132 132 133 133 136 138 136 134 136 132 133 128 127 127 130 126 130 132 136 167 207 122 117 124 128 128 128 133 134 173 194 121 122 121 125 121 121 123 122 120 158 126 120 168 165 147 122 165 123 113 194 146 134 126 122 124 125 124 125 125 127 129 126 124 130 132 130 132 127 130 130 134 137 137 139 142 144 160 202 244 249 250 249 249 250 247 249 252 250 248 243 232 205 173 151 155 180 183 168 134 130 127 124 122 117 121 148 192 129 94 118 115 111 130 184 134 98 96 92 97 104 103 104 107 108 105 107 110 110 107 114 111 112 116 117 119 116 114 116 118 118 120 117 121 119 151 178 192 140 139 130 125 128 130 125 109 125 169 189 107 130 85 87 76 83 68 63 73 83 64 74 111 131 132 138 137 135 139 138 142 141 149 151 150 159 170 181 215 236 236 240 240 234 240 242 240 246 244 244 250 249 249 246 247 244 243 242 242 242 240 240 242 245 245 244 246 247 244 245 211 169 167 122 214 243 214 195 162 169 185 130 207 235 242 241 240 240 231 212 158 142 153 173 207 236 240 244 241 242 245 246 242 239 238 242 239 243 244 247 243 243 247 241 244 242 239 242 241 240 241 243 242 241 242 243 242 243 242 242 239 237 243 233 231 215 236 235 167 177 183 135 201 132 109 99 110 135 239 200 180 192 143 123 184 128 82 136 145 225 235 243 238 240 244 241 235 236 237 234 236 237 234 237 240 242 245 244 247 247 247 247 246 246 243 244 238 236 226 151 159 137 148 227 240 242 238 233 234 231 144 137 121 146 204 212 196 171 160 156 153 151 149 148 143 176 184 184 198 176 146 148 142 141 143 145 145 140 135 134 131 126 120 113 107 105 102 106 113 118 124 135 138 147 156 158 159 161 159 146 138 148 154 154 144 135 121 115 109 108 117 131 141 144 142 140 142 143 147 142 146 147 146 145 146 148 156 163 173 189 215 231 239 245 242 236 244 242 240 237 237 244 178 187 171 146 133 191 234 241 244 243 247 243 147 143 164 170 187 151 138 154 149 147 154 152 150 152 158 175 209 227 236 248 250 249 251 245 249 252 247 249 251 250 252 252 252 249 251 231 172 147 141 144 146 143 141 142 143 144 148 142 140 136 139 138 141 140 137 137 137 137 142 141 136 136 136 139 138 136 133 132 129 127 127 125 129 131 130 129 130 140 172 209 114 116 128 128 126 128 128 137 175 190 118 120 122 124 125 124 125 125 118 139 158 103 169 156 161 124 145 155 96 181 159 134 127 123 125 127 127 125 125 124 123 122 127 126 131 133 135 136 137 135 137 139 143 142 142 165 222 246 249 247 248 250 251 247 245 248 249 238 206 187 169 170 188 209 222 216 173 142 132 129 124 121 120 116 121 150 188 122 94 113 104 94 139 191 128 95 90 88 98 101 99 106 128 116 107 108 108 105 107 111 112 113 117 114 115 116 114 115 117 117 118 119 122 116 156 183 189 141 135 124 118 119 132 119 108 137 167 183 102 128 76 95 111 111 103 102 105 106 65 71 101 124 131 132 135 131 138 138 137 136 136 137 143 138 141 145 152 167 188 223 222 238 246 248 244 242 241 243 249 246 249 246 246 239 239 240 241 245 247 248 244 239 245 245 245 239 244 245 201 171 159 124 200 188 145 138 149 174 177 133 214 240 245 242 235 207 164 149 151 184 213 234 242 244 236 238 242 246 247 245 239 237 246 236 239 242 240 243 244 240 245 247 243 240 244 246 247 245 246 247 244 245 244 244 247 249 235 229 242 238 243 239 243 236 236 232 168 180 178 137 209 160 108 99 109 124 226 191 181 195 131 136 183 144 80 119 134 214 237 243 235 239 244 240 239 238 240 237 225 228 237 238 242 246 246 245 247 244 240 244 246 243 237 240 238 236 216 144 173 137 165 233 239 238 229 243 241 231 142 142 128 154 207 215 242 234 218 207 190 175 162 156 151 174 189 182 200 185 153 154 150 149 153 153 150 147 144 145 145 145 143 141 142 143 136 137 135 131 125 122 115 114 114 114 118 140 147 134 121 108 122 114 102 98 99 106 120 133 143 148 146 144 146 145 145 145 149 148 147 150 148 148 159 176 201 222 232 236 242 243 241 241 241 243 247 242 239 237 238 241 185 174 169 145 120 170 228 246 242 243 247 245 156 150 153 170 175 173 123 154 146 147 161 169 185 210 236 246 250 254 250 253 252 251 247 249 248 250 249 251 251 253 250 245 233 209 177 146 141 141 140 140 137 137 136 137 137 145 140 141 145 145 142 146 140 139 136 137 137 139 141 137 134 132 132 134 137 136 135 133 129 128 131 132 133 132 129 128 131 139 173 207 105 118 130 127 127 126 127 137 180 186 121 120 124 128 126 124 124 122 120 117 176 111 149 154 159 136 136 174 97 159 177 134 133 131 130 131 129 129 128 126 128 129 130 128 132 135 136 134 134 135 141 141 147 151 193 235 252 249 250 250 249 252 250 243 235 223 190 161 167 193 218 238 244 240 193 139 125 131 131 130 127 122 124 124 123 147 181 117 92 113 108 101 143 187 125 90 97 95 91 93 96 95 98 103 104 106 108 108 107 98 106 116 115 115 112 114 114 114 114 115 111 109 110 113 159 186 184 143 149 131 129 123 127 136 122 135 178 184 101 127 85 113 139 122 119 118 120 123 78 67 82 110 127 126 132 131 133 135 133 132 130 135 136 136 140 142 142 143 137 139 149 180 241 250 245 246 240 238 246 243 235 223 231 236 241 241 241 243 239 235 246 247 246 244 240 237 243 237 193 173 157 130 175 140 171 196 181 177 165 136 230 243 221 189 140 147 170 189 228 244 245 242 241 241 237 237 236 242 246 244 241 241 245 244 239 243 237 245 245 243 239 235 238 241 247 247 248 251 248 247 230 237 245 244 246 247 239 236 240 240 242 242 241 235 232 219 167 181 166 140 215 197 108 110 105 115 210 186 183 198 118 150 177 136 83 101 137 194 237 238 238 240 240 240 241 242 244 233 240 236 231 234 240 244 238 238 246 243 236 233 236 241 241 238 233 235 211 145 178 130 184 242 237 228 229 230 239 230 141 146 130 156 212 214 248 247 245 242 238 236 231 218 207 201 189 181 204 199 159 159 155 154 151 147 148 151 151 152 158 156 150 149 145 145 148 152 151 145 146 149 153 151 150 151 152 154 155 150 145 149 139 149 144 146 146 149 149 148 150 154 151 149 153 149 148 150 151 155 157 166 187 207 229 241 243 246 241 242 248 247 246 244 242 245 245 245 244 245 237 243 195 169 158 144 118 149 217 248 243 243 244 247 163 155 152 175 167 181 129 140 182 196 212 230 243 247 251 248 249 253 253 254 252 249 247 250 246 248 249 252 252 253 251 226 178 152 144 141 139 137 143 138 139 138 136 138 139 142 141 146 144 146 140 140 139 138 142 143 140 139 138 134 133 133 133 133 133 132 134 135 126 131 133 136 136 133 130 127 132 142 177 202 103 121 133 130 130 130 131 138 184 178 128 126 122 122 123 123 120 117 121 121 163 139 129 167 145 144 126 169 122 132 195 137 134 132 131 134 130 129 128 127 129 130 130 129 134 133 130 126 128 135 141 144 142 163 237 252 248 247 251 252 250 244 216 191 169 164 175 200 231 244 244 248 222 176 134 128 132 130 131 126 127 125 123 123 116 139 175 103 95 113 117 113 132 162 120 99 112 109 104 110 112 107 107 109 102 102 96 92 96 96 101 107 113 115 112 111 109 113 112 115 109 113 115 115 159 188 174 133 129 181 157 129 119 114 128 146 179 178 105 125 113 147 144 127 124 123 127 129 101 64 74 105 128 127 129 131 132 131 129 129 131 133 133 133 134 136 138 137 134 132 134 136 202 243 247 245 244 243 244 244 238 227 233 243 242 240 239 242 242 244 248 246 246 241 240 240 236 222 174 179 157 135 197 208 232 242 185 182 155 142 193 172 142 143 168 203 231 236 237 243 244 240 241 241 240 240 240 245 244 242 239 245 243 243 244 246 238 246 246 247 241 239 247 248 243 242 239 241 247 246 241 240 246 244 245 245 244 241 241 239 244 239 239 241 240 214 171 185 162 144 222 220 111 114 104 115 192 186 183 198 111 155 199 140 82 96 150 182 243 243 236 237 242 241 242 238 242 239 242 238 235 237 238 243 241 242 243 240 243 241 241 240 238 242 236 236 198 153 175 123 198 245 228 234 235 233 235 224 142 150 127 162 210 211 239 242 246 243 239 241 242 242 243 240 184 162 208 205 207 205 201 194 185 179 171 169 163 162 164 162 156 155 153 152 156 157 157 154 148 149 156 156 157 161 160 153 148 148 149 150 149 152 148 148 150 154 153 153 154 151 152 153 155 156 156 164 175 192 210 223 235 239 240 240 242 244 240 242 244 244 244 244 242 243 246 246 247 246 240 247 201 164 139 146 116 142 205 247 243 242 245 249 159 162 168 185 173 181 156 124 226 252 250 249 243 245 244 249 249 250 251 251 252 251 252 252 251 249 248 250 248 238 181 149 144 147 147 141 136 135 145 140 142 142 140 139 139 141 141 141 141 138 138 137 137 140 140 142 136 136 137 132 138 138 135 140 134 130 133 135 130 135 134 136 131 129 132 132 130 143 185 195 102 126 134 135 133 133 134 142 189 169 129 127 121 119 118 121 119 120 118 123 141 173 113 181 134 153 131 150 160 112 192 147 135 131 133 132 130 130 132 131 131 130 134 132 128 127 124 125 135 138 148 158 150 137 171 210 236 232 212 199 186 169 172 186 208 225 245 248 245 247 241 213 149 133 127 128 129 129 132 126 125 122 117 114 105 109 115 79 94 112 115 107 147 130 107 97 111 112 116 118 117 119 120 119 116 119 118 121 121 120 114 113 121 125 116 115 107 105 106 99 99 110 114 115 166 192 153 122 129 133 147 137 104 110 129 151 184 170 100 120 107 163 144 130 124 124 124 125 125 70 68 93 121 126 129 130 129 128 129 129 130 128 128 129 130 127 129 128 127 130 138 140 168 231 245 247 248 249 246 243 244 246 245 248 244 238 239 243 243 245 241 243 243 238 236 220 179 141 151 188 153 130 210 213 198 206 170 186 147 129 125 123 138 201 228 229 235 230 233 234 232 237 236 233 235 242 237 241 241 233 238 242 234 242 243 246 244 248 244 239 237 242 247 243 242 241 238 240 244 243 243 245 244 231 229 239 243 241 242 239 235 241 242 240 243 197 174 186 152 152 226 230 115 113 102 115 167 183 183 195 105 162 217 151 82 85 152 158 228 241 242 241 241 239 236 238 241 238 242 238 235 237 238 238 241 244 242 246 246 245 243 238 238 239 241 241 181 161 174 126 210 235 228 239 245 237 239 212 144 158 125 172 161 162 230 245 245 244 247 243 243 245 243 244 182 133 206 204 239 244 243 246 244 242 239 238 234 231 226 223 218 212 200 193 190 186 181 179 176 173 171 174 169 168 158 157 157 156 157 160 158 161 159 161 163 163 170 172 174 177 182 189 199 213 224 232 239 242 244 239 242 244 242 237 243 241 246 250 244 246 244 244 244 247 246 246 241 243 245 247 199 139 153 168 124 143 192 245 242 240 246 246 167 226 237 240 189 175 181 125 188 250 242 243 243 246 247 251 250 253 254 253 252 251 246 249 248 238 220 224 189 175 151 149 144 140 143 136 127 133 142 145 145 145 140 138 138 140 141 146 145 144 141 141 140 139 140 141 140 139 137 129 134 136 136 140 137 135 136 135 135 142 138 136 130 130 134 138 139 146 188 184 104 129 137 137 132 131 127 143 192 160 132 127 126 125 122 120 117 121 127 128 131 178 123 166 147 147 141 136 178 114 180 159 137 139 133 131 128 128 133 133 134 129 133 131 130 132 132 132 134 153 207 225 204 185 179 165 166 163 154 147 150 170 198 212 209 209 203 200 208 209 175 151 138 134 127 127 130 131 132 131 127 125 119 117 102 109 75 53 89 114 122 95 117 110 92 90 108 111 116 114 116 118 120 119 123 125 124 124 126 129 131 130 133 130 122 122 123 121 119 117 117 122 122 122 167 192 137 121 139 141 151 146 91 109 125 152 189 161 106 118 94 166 140 134 120 121 118 119 134 76 71 87 113 130 127 128 127 131 131 132 130 134 130 130 130 127 128 129 127 130 137 141 193 232 239 243 243 245 247 244 240 239 243 243 241 238 240 239 243 246 242 245 241 228 186 143 125 125 154 188 147 123 132 126 123 130 153 192 139 122 119 119 127 145 151 152 156 151 159 163 170 183 184 200 222 234 243 245 240 234 245 241 241 242 245 249 245 240 241 240 240 243 245 241 239 237 244 245 242 242 238 237 242 245 245 248 242 240 241 237 234 233 242 241 239 188 176 190 145 161 229 235 126 112 94 115 147 180 183 192 104 170 230 163 89 82 147 152 236 246 233 227 224 230 240 244 237 242 245 239 246 242 236 238 240 239 240 244 244 244 244 245 240 239 238 238 181 168 170 127 217 225 235 236 235 236 244 206 150 159 127 177 92 141 240 244 246 244 245 246 248 247 242 243 178 114 191 198 241 243 245 247 242 243 245 243 243 245 245 243 245 240 241 240 238 241 233 234 234 231 227 224 222 224 221 216 211 217 216 217 213 215 212 219 224 224 228 230 231 231 234 238 238 240 241 239 241 244 241 239 245 246 241 240 241 242 243 245 242 246 245 247 243 245 243 246 240 245 245 246 188 127 181 177 122 149 188 243 243 243 246 244 147 238 248 248 225 172 197 142 143 232 243 238 246 251 249 249 247 249 253 254 248 249 250 246 221 187 156 150 149 153 151 149 146 144 145 138 142 141 152 153 149 145 143 143 143 142 144 145 144 139 140 140 141 146 143 140 141 143 138 136 135 135 136 139 139 138 136 137 140 137 133 127 124 124 130 136 138 150 191 173 105 133 136 131 125 126 126 143 197 150 134 125 120 122 123 122 126 129 133 131 128 160 161 139 175 136 153 135 167 136 163 172 142 138 128 131 127 125 129 132 134 133 128 127 130 132 136 139 149 198 208 191 186 177 174 174 179 189 190 190 190 189 188 190 191 182 170 148 135 129 132 133 134 134 129 129 130 125 125 125 124 122 109 101 104 88 66 76 105 113 109 112 97 66 55 93 114 120 122 118 124 127 127 128 126 127 127 127 126 129 129 130 128 127 120 119 120 125 125 122 124 130 127 132 170 194 124 119 127 138 151 180 93 107 126 158 187 149 108 127 94 157 143 136 116 119 121 121 137 98 67 75 106 123 124 127 125 126 128 129 132 133 131 132 128 127 129 131 131 137 140 184 237 237 241 240 237 239 237 231 222 231 243 243 241 239 240 242 242 239 235 211 165 143 133 130 125 127 155 187 134 112 115 116 113 118 157 191 130 117 119 122 124 133 128 126 119 121 117 121 122 115 120 125 134 141 152 158 166 184 202 190 192 213 222 222 221 231 233 235 242 231 242 243 238 240 243 241 240 237 240 242 242 244 241 240 238 230 219 231 238 243 241 239 234 183 176 188 141 174 217 233 147 112 87 105 137 180 185 184 109 186 237 174 103 87 125 144 223 233 238 238 237 236 235 236 240 238 242 244 234 241 240 240 242 241 238 237 244 242 241 236 237 240 237 238 179 189 171 132 222 227 232 231 235 239 228 186 159 157 131 184 184 225 244 245 245 242 247 247 244 242 237 235 135 87 116 127 210 245 242 245 241 242 249 247 242 241 244 243 247 244 243 243 242 243 238 242 242 243 244 243 242 244 243 243 246 247 242 243 246 246 246 245 246 245 243 240 244 244 243 246 242 241 240 242 239 242 244 239 244 241 241 238 236 239 243 243 244 247 245 244 241 246 245 244 245 241 243 248 177 133 184 163 123 159 187 242 241 243 242 241 119 210 247 249 244 188 181 164 121 199 246 242 248 249 250 250 251 252 253 251 251 243 205 186 164 155 160 158 153 150 151 151 152 154 153 147 155 150 145 145 146 146 143 145 143 143 145 145 139 139 141 141 146 148 148 144 144 145 140 138 136 139 140 140 142 138 137 137 138 133 127 124 127 129 133 137 138 153 197 165 110 132 129 130 124 122 123 145 199 141 138 127 128 127 128 129 131 134 137 135 136 147 181 135 186 140 155 142 153 160 152 190 146 145 128 130 131 127 132 138 141 142 138 136 137 137 149 165 178 196 211 213 221 225 230 237 243 244 241 238 242 243 243 244 244 213 164 140 135 134 132 133 133 132 126 128 128 130 128 124 123 122 115 96 85 85 102 108 109 105 91 80 68 75 94 112 122 126 128 124 129 130 129 128 124 123 126 129 132 135 132 132 126 126 122 124 126 130 129 127 125 129 125 136 175 193 120 116 122 131 161 188 88 107 127 161 188 144 113 149 109 142 156 136 112 111 116 120 134 117 64 70 101 120 127 129 128 126 125 127 131 131 129 129 127 126 127 130 132 136 170 222 236 235 236 239 238 232 241 238 233 233 244 240 243 240 244 238 225 198 160 134 126 128 128 124 122 126 153 187 130 109 115 115 115 121 161 186 123 111 123 122 122 127 120 116 113 114 115 118 123 122 123 125 126 126 129 130 130 135 138 132 134 140 143 144 151 153 157 170 181 177 199 192 189 204 209 223 236 238 234 239 238 236 234 237 236 231 234 236 244 246 237 234 231 179 174 188 136 181 219 241 159 111 88 97 134 184 186 172 114 194 242 192 103 90 111 142 201 233 237 237 238 243 237 238 240 233 244 245 243 244 244 236 237 242 240 240 244 242 236 231 236 240 243 238 179 199 162 139 225 231 234 231 226 198 156 156 173 157 132 205 247 247 244 244 243 244 248 247 241 234 209 167 101 77 87 128 226 244 243 243 241 241 247 246 244 244 247 243 251 250 239 245 246 245 245 242 241 240 241 241 242 243 243 244 244 244 242 243 244 244 244 244 244 244 245 243 244 244 244 244 243 244 243 244 242 241 241 244 244 240 239 242 243 243 244 246 245 245 246 247 245 246 241 243 244 243 243 246 171 143 192 158 125 164 189 246 241 243 242 244 101 159 249 252 250 220 164 179 119 147 250 252 251 252 248 252 250 252 251 241 211 169 140 144 148 146 159 161 151 151 150 150 149 148 150 147 152 147 149 150 143 141 141 145 149 146 145 144 145 144 143 143 144 144 142 143 145 146 139 137 135 138 140 138 135 133 138 140 133 135 139 140 140 138 140 142 143 150 203 158 112 136 134 133 132 127 134 150 197 136 141 126 125 132 132 135 132 135 134 135 138 136 181 156 168 162 148 151 140 175 153 196 156 151 131 129 128 127 134 141 143 142 145 146 150 170 227 247 245 247 249 248 248 245 244 248 243 247 246 247 246 248 246 248 233 162 137 138 132 132 131 134 134 132 126 125 129 131 129 128 127 125 126 126 121 119 122 121 118 112 104 106 105 114 121 122 120 124 130 128 125 124 125 124 122 123 126 129 132 130 127 128 125 127 123 124 124 127 132 130 121 118 126 141 180 188 117 121 115 134 182 170 99 114 124 165 191 136 118 160 140 111 173 134 135 126 124 125 133 134 66 67 103 117 123 126 124 124 128 125 125 128 127 126 128 130 128 130 135 176 230 237 235 233 231 234 237 234 232 230 238 236 237 237 236 229 211 185 141 132 132 131 129 125 121 117 112 119 156 189 123 105 111 118 125 125 158 181 114 112 115 115 114 113 111 109 106 108 110 115 119 122 125 121 124 126 128 126 128 126 125 125 125 127 126 127 130 126 128 131 130 128 125 124 126 128 131 135 144 154 157 179 180 179 191 198 208 212 220 224 233 237 235 238 225 176 174 187 134 187 232 241 176 116 90 86 138 184 189 157 120 202 241 210 103 93 99 155 181 237 229 238 242 243 241 240 236 233 243 244 237 234 235 237 233 237 238 239 238 236 235 229 234 239 242 237 189 208 149 157 229 229 217 197 148 126 134 154 179 155 133 218 244 245 241 243 241 241 242 229 198 160 132 129 145 179 219 236 245 243 243 243 242 239 243 244 244 244 245 242 244 243 244 246 242 241 246 243 246 242 239 238 244 243 243 244 244 244 244 243 245 244 243 242 243 246 247 243 242 241 244 244 243 246 246 244 246 243 247 245 242 241 239 240 242 238 245 245 248 244 247 245 245 248 240 244 247 246 246 249 146 151 194 153 136 176 194 248 242 248 243 244 101 118 229 252 251 245 164 186 130 121 224 253 252 251 252 252 248 234 210 177 144 140 155 153 150 150 155 152 151 154 154 151 147 142 149 145 145 148 153 149 145 149 143 147 152 148 142 147 171 180 153 141 139 144 143 146 149 146 136 135 132 133 135 131 133 135 138 141 138 141 146 147 141 139 141 141 143 153 203 151 118 141 135 135 138 141 137 153 192 130 140 128 132 137 135 134 137 136 139 138 135 135 158 171 157 187 131 149 142 168 164 189 171 142 146 134 136 138 142 145 145 144 145 148 185 229 250 247 245 248 247 249 249 246 247 250 245 247 246 248 250 247 250 244 185 139 137 135 135 132 132 134 134 133 131 129 132 134 129 129 128 128 128 129 126 123 121 119 117 116 119 122 123 125 127 125 121 123 127 126 125 125 126 124 122 124 127 127 127 128 126 127 127 127 127 125 128 128 128 129 122 122 129 145 183 184 114 119 103 143 159 141 120 121 129 169 191 127 124 148 168 97 180 132 140 126 126 129 131 141 75 67 102 119 125 127 126 125 122 117 114 122 120 120 126 129 128 133 161 219 239 242 236 241 238 239 242 239 235 237 235 239 237 233 199 156 142 134 137 132 128 132 129 128 124 120 113 116 161 184 118 98 113 117 121 126 154 173 111 104 110 110 111 114 108 106 106 106 108 114 118 121 123 121 121 124 127 126 127 125 125 126 125 125 124 121 121 122 129 130 132 130 128 128 129 130 131 133 132 128 127 127 129 133 132 136 144 144 145 153 164 174 179 194 194 172 177 182 130 191 238 243 195 119 93 74 139 181 191 149 127 206 244 225 108 98 92 163 169 234 235 237 240 240 232 231 236 236 237 239 239 233 239 239 232 233 233 231 224 231 232 231 235 237 240 231 202 212 144 173 231 205 150 130 128 143 189 169 183 153 141 225 245 246 241 245 242 231 194 159 140 140 161 193 226 243 241 240 242 246 241 243 242 241 245 244 243 243 243 242 244 248 247 244 246 240 244 246 242 244 243 242 244 242 242 245 246 246 247 246 245 245 244 243 241 247 248 247 246 244 245 246 244 245 245 243 244 243 243 243 246 244 239 237 242 241 242 244 247 250 246 245 243 248 241 244 244 245 245 240 133 151 187 144 138 186 196 245 240 243 243 243 110 107 185 250 253 250 189 179 156 111 165 243 248 249 236 225 177 149 143 150 148 152 149 150 154 153 153 152 156 155 157 150 147 147 150 153 151 154 151 148 145 148 145 142 146 148 159 177 162 140 139 142 143 141 143 145 140 141 138 135 132 140 146 147 147 141 143 144 150 147 142 142 139 140 137 137 143 159 203 145 122 144 132 132 135 140 136 159 187 126 141 134 137 137 137 135 136 138 135 140 136 135 139 183 145 190 142 138 144 147 177 179 188 137 157 141 137 144 147 146 144 147 167 209 244 250 251 248 248 248 241 245 245 244 249 247 247 246 247 247 242 235 205 163 133 134 134 135 131 132 131 131 132 134 132 128 129 131 130 127 126 126 130 130 129 129 124 122 121 125 129 131 131 132 128 126 125 127 125 126 128 129 131 131 130 129 128 124 124 125 127 126 120 125 126 127 124 122 125 127 128 128 133 147 187 174 117 124 118 123 123 123 124 122 135 171 184 121 125 124 183 101 170 136 136 131 125 126 126 142 95 68 100 118 127 128 125 127 128 119 120 128 129 130 132 139 146 174 226 239 235 234 234 234 235 231 234 241 235 230 235 235 224 178 131 135 157 163 133 127 128 129 125 125 127 127 119 121 165 179 112 98 110 113 114 121 164 167 104 101 107 112 111 113 110 110 107 107 109 113 117 117 119 121 123 127 128 124 124 123 121 122 125 123 117 116 121 124 126 125 123 121 119 119 128 130 129 130 130 126 126 133 133 129 130 133 132 132 134 136 138 136 133 132 146 171 179 176 133 187 163 165 147 117 98 66 146 183 191 135 134 200 231 221 115 116 82 153 167 235 237 228 230 237 238 236 234 233 239 240 232 228 228 227 221 230 218 216 220 231 232 235 237 236 244 224 223 209 137 183 156 129 133 147 186 225 233 171 185 149 147 229 239 240 240 219 184 148 140 154 185 214 234 240 240 244 243 242 243 243 241 239 241 241 243 240 241 243 242 244 243 246 247 243 246 242 241 248 247 244 243 246 242 242 244 243 244 246 245 243 239 244 243 243 241 241 241 241 244 244 244 247 246 245 245 247 246 247 246 244 243 242 247 242 247 243 240 243 245 244 247 248 243 249 247 245 247 246 245 231 126 154 186 133 145 189 193 243 242 240 237 241 163 158 175 224 233 228 202 168 169 115 137 230 253 244 192 165 143 143 149 150 149 149 150 149 151 145 151 150 151 155 153 151 148 149 151 148 146 145 149 149 147 153 152 148 146 149 149 148 144 147 148 145 149 144 144 147 141 138 140 142 144 147 152 154 148 145 145 144 149 146 140 136 137 138 131 130 143 164 201 138 126 143 131 137 135 138 140 164 177 129 140 140 141 140 139 141 141 141 139 143 141 137 139 173 159 174 166 132 147 130 180 174 191 149 150 148 146 153 154 150 162 189 233 248 250 248 251 250 248 248 241 246 251 250 249 249 245 243 243 238 225 181 143 139 137 138 138 138 134 134 133 133 132 133 131 130 130 129 126 126 129 128 127 128 129 129 127 127 125 124 124 125 132 135 136 133 128 129 130 129 129 132 134 136 135 134 134 129 126 126 127 128 127 124 128 128 127 123 124 129 130 130 129 152 195 164 116 126 125 123 123 122 123 127 142 176 182 120 124 118 183 121 152 157 129 133 122 125 124 136 115 72 97 116 126 129 126 128 128 128 128 131 132 135 137 143 183 234 247 244 244 246 247 247 245 239 236 243 243 235 213 204 161 142 156 171 201 154 125 126 125 122 119 117 117 119 112 123 171 180 111 96 107 103 100 115 167 163 101 97 100 103 97 107 110 109 106 108 112 113 113 115 115 118 123 124 123 120 122 123 120 121 122 121 117 121 124 124 120 119 120 122 118 120 128 131 133 136 135 131 127 135 129 123 124 124 129 130 132 132 137 133 131 132 145 172 182 167 140 181 128 125 118 118 100 68 148 180 192 126 147 162 136 119 94 135 74 135 168 223 233 233 236 240 240 240 234 225 230 240 226 230 233 235 234 234 230 232 236 234 233 237 241 240 244 214 223 204 134 181 124 136 178 217 235 239 232 167 182 151 155 230 234 213 171 148 143 154 191 219 242 241 239 239 239 243 246 247 244 243 238 239 243 244 244 240 239 242 241 249 250 243 241 244 244 243 240 244 243 243 243 244 241 241 244 242 240 246 244 245 241 241 241 243 240 239 239 238 244 242 239 244 249 249 247 245 244 245 246 244 244 242 244 248 246 244 245 246 244 244 245 244 245 245 244 243 246 246 247 226 133 162 183 123 153 185 195 242 238 238 236 242 156 163 173 176 180 186 186 188 188 186 178 192 200 188 174 173 166 162 158 153 149 152 152 148 146 150 149 141 146 148 150 149 153 149 151 147 147 148 148 150 145 143 146 151 154 152 149 148 145 147 149 147 144 145 139 144 139 136 145 143 144 150 147 147 147 146 150 147 146 141 134 131 130 129 133 139 150 166 201 130 132 144 144 144 143 144 140 169 169 133 138 145 141 139 142 142 135 138 143 148 145 143 140 150 181 155 188 131 140 125 165 169 189 175 136 155 153 158 173 197 237 251 250 252 252 250 247 248 249 248 251 250 249 246 247 247 250 244 235 203 147 140 144 143 138 137 134 134 136 134 132 132 134 134 131 129 130 130 132 130 130 129 124 131 128 126 128 131 131 129 126 126 129 134 133 131 131 131 128 131 125 128 132 133 131 130 134 132 127 130 127 127 128 128 124 125 127 127 122 122 128 127 130 158 198 147 119 129 124 122 123 122 126 125 149 180 183 121 123 115 168 153 124 181 121 135 125 127 125 127 136 80 89 110 122 125 125 128 128 130 134 136 131 133 143 189 244 248 245 248 249 247 246 244 246 245 240 235 204 170 149 163 192 216 232 200 139 124 128 125 116 112 110 106 107 111 110 125 174 177 106 94 101 100 99 118 173 151 97 94 100 99 97 101 102 102 106 108 110 110 110 114 112 115 116 116 114 114 119 121 114 115 113 112 115 118 121 117 108 113 119 123 121 121 122 123 127 129 132 130 133 133 127 129 123 126 129 128 126 130 134 128 129 129 144 172 183 159 148 164 125 117 117 116 111 73 160 182 189 120 155 123 89 78 75 151 77 110 172 203 235 238 238 237 239 238 238 240 243 244 238 234 231 234 237 242 239 236 234 236 241 240 239 241 240 199 219 200 129 177 180 220 239 235 238 240 227 163 186 141 166 188 148 132 148 171 210 229 241 239 237 240 237 234 240 238 243 244 244 243 243 240 244 244 245 240 242 244 244 244 248 247 242 243 246 243 241 240 241 244 242 242 241 240 240 244 240 241 238 238 239 238 239 239 239 237 237 238 236 237 239 243 244 246 245 243 243 241 243 240 242 239 244 244 243 243 241 242 245 245 241 244 246 243 244 242 243 244 247 213 152 167 181 112 167 179 194 241 240 238 237 242 97 97 100 102 105 113 119 130 146 154 166 175 184 184 189 189 191 191 188 186 183 180 176 173 168 167 158 153 154 151 148 149 153 156 155 145 145 144 149 149 137 138 144 147 149 152 148 149 149 149 146 145 139 145 151 145 140 139 144 150 154 156 153 154 147 151 156 148 133 134 132 131 135 141 140 146 150 168 199 127 136 149 147 145 144 147 144 169 161 131 137 144 134 133 141 145 142 142 151 151 147 146 145 139 185 151 185 149 135 139 158 170 185 186 131 157 187 211 235 246 250 249 250 250 253 252 250 249 249 249 248 249 248 251 249 248 247 226 177 149 141 139 143 145 139 141 140 139 140 137 131 130 132 135 133 132 133 134 133 130 129 127 132 127 128 127 133 133 133 128 129 131 131 133 137 136 136 138 130 130 126 125 125 126 129 128 127 127 128 127 125 126 167 145 122 122 124 125 123 121 124 125 129 162 196 138 120 130 126 125 123 120 119 121 153 182 179 118 121 117 150 175 114 187 129 136 123 127 123 125 146 93 84 109 119 127 125 127 130 132 136 136 135 134 173 231 247 248 245 245 248 242 246 244 242 227 184 167 156 168 209 232 246 237 182 145 134 130 129 127 124 122 118 115 117 117 113 124 164 162 105 94 95 95 95 120 178 147 98 91 99 100 101 99 100 101 96 102 110 110 112 113 112 117 114 111 109 112 117 117 111 112 114 114 116 118 120 117 113 114 121 120 119 115 116 118 119 122 127 123 126 127 126 125 114 128 128 125 124 125 128 125 127 126 145 171 183 151 155 154 120 123 125 118 117 88 164 183 188 113 164 112 84 79 70 161 84 94 179 191 237 234 236 238 238 236 238 237 243 243 243 236 235 235 231 236 238 235 232 234 239 239 237 241 232 187 218 189 125 190 230 235 237 235 239 240 221 162 194 146 169 143 140 170 210 234 242 239 239 242 240 240 241 236 233 233 238 240 242 242 243 241 244 244 242 241 240 243 244 246 244 241 239 237 244 243 241 240 243 242 240 241 241 242 243 240 243 240 240 237 237 240 240 240 239 238 238 236 237 240 238 240 242 245 241 241 244 240 246 240 240 236 238 238 241 241 243 239 242 243 242 244 243 243 245 244 244 242 246 200 171 170 182 107 178 179 191 243 244 242 240 238 57 60 61 61 61 64 65 69 74 80 93 96 100 105 112 111 113 119 129 140 149 156 165 171 178 182 187 192 195 193 192 191 190 183 176 173 173 171 168 164 165 160 149 148 156 150 149 151 148 152 153 156 149 148 158 152 145 143 148 151 154 158 152 162 156 150 152 150 143 139 137 138 140 142 144 144 146 176 193 121 141 145 147 150 152 149 146 174 150 135 135 142 146 147 145 149 149 148 147 145 139 137 142 139 171 169 162 178 128 154 152 178 177 189 147 187 251 249 251 249 251 251 246 250 253 250 248 249 250 249 250 249 251 250 247 245 207 156 146 145 144 143 142 142 140 136 141 140 139 137 140 138 133 135 140 136 140 135 129 126 125 125 130 129 133 139 141 140 133 130 132 136 135 135 134 132 136 136 135 135 132 130 129 131 129 129 129 120 125 127 128 127 127 128 126 127 123 117 110 112 122 125 130 166 195 130 125 132 129 126 122 120 121 119 159 188 164 121 114 118 131 185 124 181 148 130 124 123 120 125 149 108 80 110 113 123 120 128 131 133 129 133 136 139 178 230 240 244 246 247 246 246 232 209 168 148 158 190 225 245 250 248 226 172 134 133 129 126 125 126 128 125 121 120 119 119 117 121 148 125 91 96 108 110 109 134 173 127 97 95 103 103 103 102 101 102 103 107 105 103 105 108 107 108 109 111 109 113 115 113 113 113 115 118 118 116 115 115 114 118 119 119 120 118 108 113 122 123 114 116 122 120 117 120 125 128 126 123 123 121 121 123 125 125 150 172 187 141 159 143 123 123 123 120 126 135 166 183 186 106 167 107 88 82 66 161 100 83 170 181 239 238 239 237 232 229 233 239 241 240 228 229 231 234 235 231 232 232 234 235 236 233 220 183 170 167 215 176 117 202 233 232 233 234 229 224 192 160 198 147 172 184 217 239 241 237 234 238 236 237 239 233 231 233 240 240 239 241 244 247 243 242 240 240 240 243 242 242 241 242 243 240 242 240 239 241 243 242 240 240 242 241 240 242 242 240 244 238 242 243 242 241 241 240 242 245 244 243 242 242 244 242 244 243 241 238 245 246 243 239 238 238 237 236 245 241 240 237 240 240 239 236 240 236 240 242 242 241 245 187 187 173 169 105 185 177 197 248 244 243 242 232 43 42 45 47 48 50 52 54 60 63 66 69 75 85 79 79 79 87 98 97 102 108 107 111 114 115 121 122 135 140 148 158 165 174 178 183 189 190 193 193 191 191 192 188 186 184 184 182 182 179 176 174 173 172 172 174 167 162 161 156 155 161 154 162 158 153 154 153 154 152 141 139 143 141 137 141 154 180 185 123 148 154 155 152 152 146 148 179 143 139 138 145 151 151 150 151 149 149 151 142 134 139 144 147 158 187 146 184 137 155 189 199 171 186 163 168 252 252 252 253 251 247 244 248 253 251 252 253 250 250 248 244 252 253 235 189 154 145 147 148 147 144 145 146 143 139 140 141 141 141 142 141 136 137 140 138 137 133 130 126 128 129 130 135 134 138 143 145 136 134 137 140 137 137 141 136 138 136 135 135 133 129 131 135 133 131 131 128 127 130 128 131 130 132 133 134 128 111 107 114 122 124 138 168 190 122 128 130 125 125 125 122 125 123 163 192 153 127 114 126 130 187 141 167 164 128 126 121 125 126 143 125 82 112 125 120 126 126 129 136 129 130 147 150 146 161 175 205 214 211 201 186 165 160 175 194 226 244 251 251 245 208 149 133 133 130 127 128 126 126 125 127 121 122 119 118 120 120 126 96 66 87 105 106 103 102 105 76 72 92 106 109 108 107 111 113 113 115 110 109 110 111 101 99 101 103 106 111 115 111 110 111 119 120 118 118 118 119 121 121 120 119 120 120 121 124 124 120 112 111 117 117 116 120 123 124 125 122 123 121 119 122 125 122 152 174 188 136 159 139 125 125 126 121 136 143 167 182 181 103 166 100 92 85 77 155 119 77 157 181 222 240 239 239 241 238 231 235 223 232 224 226 222 225 231 230 229 231 235 236 225 184 137 113 142 168 215 166 122 205 228 213 203 198 182 154 149 163 200 144 177 200 214 222 234 236 237 236 239 238 240 240 237 238 237 236 236 241 240 242 245 241 241 240 246 246 244 243 240 240 240 240 240 239 240 238 237 237 239 241 242 243 242 243 245 244 242 242 239 243 242 241 243 239 241 244 243 246 249 248 247 246 246 244 242 242 242 245 237 239 245 241 240 243 243 238 239 236 237 238 237 238 242 241 239 240 239 239 239 175 193 176 160 109 188 173 198 248 241 237 239 228 35 37 36 39 42 47 56 57 59 61 64 63 63 64 61 60 59 57 58 63 65 64 67 71 80 84 87 92 95 98 94 95 97 92 93 101 111 116 129 135 142 144 152 161 167 172 176 179 181 185 192 192 191 193 195 196 197 196 199 201 198 197 194 193 193 190 185 181 175 173 165 154 153 158 157 153 157 189 168 127 158 157 150 147 145 145 148 181 135 138 143 153 157 157 154 149 149 155 147 147 151 154 163 169 178 201 156 172 161 144 241 234 169 182 180 145 236 251 251 253 251 250 252 252 251 251 252 250 253 254 249 246 232 194 154 154 150 149 152 152 145 141 142 142 140 141 143 142 140 144 141 139 139 138 134 136 137 135 135 131 131 137 138 130 130 135 145 137 141 138 136 134 132 134 138 138 138 133 133 132 134 133 134 135 135 135 133 132 129 132 137 133 133 134 133 129 128 129 131 130 127 124 145 177 178 118 131 133 129 131 130 126 130 129 166 188 141 127 118 125 124 168 169 153 191 124 135 127 129 125 133 146 81 106 135 123 130 131 138 133 129 173 231 233 205 183 164 150 142 147 147 150 159 183 198 199 204 209 208 195 167 141 138 133 130 131 131 131 127 125 128 129 122 121 118 110 105 81 51 42 49 87 105 108 91 47 44 42 50 89 104 107 109 113 114 116 117 119 120 122 122 122 124 127 124 121 118 114 115 113 113 113 116 115 118 121 121 118 121 123 122 117 117 119 116 115 118 116 117 111 117 118 120 122 124 125 125 124 123 124 124 125 124 122 156 172 187 128 155 129 125 125 125 135 146 125 166 183 174 105 155 100 96 93 101 150 145 77 143 191 223 238 234 234 240 237 229 225 218 225 233 236 231 226 225 226 227 228 216 178 128 112 119 176 201 177 209 151 110 136 140 138 137 140 143 147 150 168 200 141 168 145 146 152 156 159 165 167 171 171 176 183 192 196 211 231 232 241 241 243 245 247 249 245 246 242 238 239 238 239 237 239 236 239 240 239 238 236 240 240 241 241 242 242 240 242 245 243 246 245 244 239 238 241 242 242 240 242 244 245 248 245 244 247 248 244 241 238 237 238 239 239 240 244 246 242 238 236 234 233 238 237 241 244 239 238 239 238 233 175 186 182 146 124 183 172 195 241 239 231 235 218 35 36 37 39 43 51 57 55 51 53 57 57 59 60 59 59 57 55 59 60 56 50 46 47 47 49 51 52 55 58 62 64 71 73 76 80 85 89 93 99 99 102 105 103 108 113 117 121 127 130 140 145 156 168 178 184 190 192 193 193 193 192 191 194 196 196 196 196 197 198 199 199 197 198 193 192 188 196 177 151 162 157 155 153 150 146 148 178 130 142 148 155 153 157 157 152 149 150 151 162 184 201 217 229 238 238 169 157 177 135 220 246 181 178 189 146 212 252 253 249 248 250 251 251 250 251 253 253 253 251 233 203 171 162 151 152 158 157 154 152 148 147 144 141 138 139 143 145 143 143 139 141 145 142 137 138 137 140 134 135 137 138 136 131 135 136 140 138 142 139 138 136 133 137 142 142 139 133 133 137 139 139 136 134 134 132 135 134 130 132 136 134 132 132 134 133 128 129 130 129 128 128 149 184 168 120 131 134 131 131 134 130 131 130 169 188 134 130 117 128 126 152 190 158 204 133 141 134 129 123 127 154 92 104 138 119 129 132 135 133 144 199 200 190 179 171 166 160 165 177 185 187 191 187 177 178 188 189 158 143 140 139 136 134 132 130 128 127 131 129 129 129 121 116 115 103 92 76 58 58 74 98 110 107 91 55 40 42 62 93 107 112 114 116 120 122 118 119 119 122 123 122 123 123 123 123 124 125 123 122 122 122 121 124 128 126 126 126 125 125 121 115 117 119 113 118 123 118 118 114 117 118 121 124 124 124 123 125 125 125 129 125 124 121 159 173 184 129 129 125 128 130 137 150 139 119 168 184 167 107 162 117 115 113 119 145 165 85 128 189 218 238 235 240 236 229 235 236 234 232 232 232 235 231 232 228 223 198 145 126 116 111 174 165 150 178 204 140 107 109 115 118 118 121 121 122 137 170 199 145 150 120 125 119 116 122 120 120 118 118 122 126 132 138 146 152 162 173 176 199 228 233 233 229 234 235 231 234 238 240 239 241 242 243 240 241 241 243 243 242 242 243 241 242 241 241 242 240 242 242 243 237 238 244 244 241 241 240 241 244 246 245 243 244 247 241 244 240 239 241 243 242 241 240 241 240 241 242 239 238 242 239 240 242 244 240 239 241 230 181 179 191 130 140 176 174 193 237 234 229 233 205 38 38 38 40 44 48 53 52 51 52 54 55 55 53 59 60 56 55 57 55 51 45 42 42 39 37 37 38 36 36 38 39 37 36 38 38 42 44 45 48 54 56 65 70 75 79 84 86 91 92 101 103 100 97 100 100 104 114 128 136 146 158 170 178 186 192 193 194 195 196 201 203 203 209 210 211 214 220 225 223 212 196 175 161 145 142 153 180 127 144 150 151 149 158 169 178 196 212 226 240 247 252 250 252 253 252 204 149 185 156 177 244 206 175 194 162 168 245 251 252 251 249 251 251 252 252 253 250 239 211 169 160 157 157 151 150 154 152 152 151 146 140 142 144 142 146 145 149 147 149 147 140 143 144 139 136 137 139 138 137 136 136 135 134 136 139 139 136 135 137 138 139 135 137 140 141 137 133 134 137 146 143 138 134 135 132 132 133 134 133 135 135 131 130 133 132 127 128 130 128 132 130 155 189 153 118 135 135 135 136 135 133 131 132 173 184 124 129 118 128 126 129 195 172 205 156 133 136 135 130 126 155 112 102 141 121 134 134 135 144 160 175 191 198 215 226 233 236 243 248 246 246 251 247 245 247 241 190 142 141 135 132 131 131 132 128 126 126 128 131 126 127 130 126 117 107 97 90 91 96 104 108 109 104 95 86 80 85 100 104 113 116 120 119 123 123 122 121 121 122 121 121 121 120 122 123 122 123 121 120 123 121 121 121 124 123 123 127 126 123 117 118 120 122 125 129 130 124 123 122 123 120 123 117 113 119 121 120 122 123 126 122 119 117 164 174 183 121 121 129 173 162 157 140 142 133 168 187 153 114 155 114 120 122 119 126 177 93 111 188 206 237 242 243 239 231 240 244 236 233 227 227 222 220 220 198 142 122 134 142 128 124 124 116 133 179 202 132 103 112 113 116 116 118 118 116 133 179 198 140 137 114 115 114 115 113 111 111 113 112 115 116 122 123 125 127 127 126 125 127 130 134 138 140 141 140 141 144 157 167 171 175 199 217 224 228 238 241 242 242 240 239 239 240 237 237 241 242 242 241 239 239 240 241 239 240 240 241 239 239 241 243 245 248 244 246 246 245 241 242 243 242 240 238 239 240 242 240 240 242 239 238 241 242 244 242 242 243 222 182 172 198 114 158 162 172 196 242 238 233 240 194 35 36 38 39 41 45 47 49 50 51 51 53 57 58 56 58 54 54 54 51 48 47 48 48 43 41 40 41 36 36 36 34 35 36 37 37 37 39 40 39 37 36 37 38 41 42 44 45 47 49 58 63 62 65 76 79 90 93 106 109 115 116 135 132 130 135 134 140 146 158 172 185 203 214 215 226 239 246 249 248 243 229 219 211 180 159 157 178 127 148 159 175 191 202 225 231 246 251 251 249 248 247 246 248 252 251 227 156 177 172 151 231 227 175 189 180 142 230 250 251 253 248 249 252 252 252 250 230 184 162 158 156 154 153 155 152 151 153 149 148 147 147 144 146 150 151 150 150 151 145 149 142 141 142 136 135 141 141 143 142 140 142 136 135 138 141 142 140 141 140 137 135 137 140 139 143 137 137 134 137 141 140 140 137 133 130 130 134 135 135 137 138 136 134 136 134 134 135 133 130 133 131 158 193 143 121 138 139 138 139 136 134 132 138 177 179 120 128 125 129 127 126 185 179 200 180 125 132 129 128 128 149 132 101 145 128 139 135 163 211 229 237 244 247 248 246 250 248 246 246 248 245 247 246 247 244 197 147 139 139 137 136 131 129 129 128 130 130 129 131 131 130 128 121 117 116 108 112 114 119 115 115 116 111 106 104 103 106 112 115 117 119 122 121 123 128 129 123 118 120 121 123 123 121 126 125 124 123 123 123 124 124 123 126 127 125 123 124 123 123 120 117 121 125 123 122 128 126 125 125 125 122 123 123 123 123 126 126 131 128 125 123 117 118 166 176 175 115 132 123 152 178 175 115 123 135 172 187 144 121 147 118 121 122 121 125 179 106 102 184 200 233 232 235 240 241 241 240 235 230 227 226 216 191 149 131 125 135 182 199 152 113 115 113 136 185 196 123 103 109 108 111 115 117 117 115 134 185 191 134 124 111 111 108 109 109 107 107 113 113 115 117 119 120 120 120 122 122 122 124 124 123 123 125 123 124 122 123 122 124 127 130 134 144 148 153 171 184 207 217 223 229 229 228 227 233 239 237 242 242 239 241 240 241 239 238 241 241 240 237 243 243 243 242 238 246 245 240 241 240 243 243 240 241 241 244 243 241 244 242 243 241 242 240 243 243 244 247 215 187 172 196 109 171 147 173 194 242 234 236 239 182 38 38 39 40 42 41 43 45 47 48 46 48 52 54 53 52 51 49 49 48 46 48 51 51 50 49 49 47 42 38 39 42 46 45 43 44 42 43 45 45 44 45 45 45 45 44 44 45 45 48 47 47 47 48 45 47 47 47 50 56 65 74 86 91 98 110 99 116 103 97 97 104 109 123 145 163 193 224 246 251 253 245 231 217 215 211 186 172 135 147 231 247 249 249 243 244 250 250 250 250 247 249 250 249 250 249 244 185 152 179 150 201 241 187 178 194 139 197 250 252 247 246 250 249 240 212 173 159 158 156 155 150 149 151 152 151 152 153 155 155 152 154 150 151 153 152 149 152 149 147 147 144 144 142 143 147 144 145 146 144 142 144 141 141 139 139 145 143 148 144 143 138 140 143 140 142 138 140 140 139 139 138 138 138 138 135 134 138 138 141 140 137 137 136 142 141 138 138 133 134 139 139 161 190 134 125 142 139 138 137 136 135 130 140 178 172 116 129 130 137 140 131 169 187 184 201 123 135 130 130 134 139 154 103 144 141 138 166 233 247 242 248 247 250 252 251 244 245 246 247 250 244 245 246 234 195 137 133 136 136 140 137 137 135 138 136 134 133 126 127 129 128 126 128 129 127 123 127 128 129 125 121 117 115 115 114 118 117 119 119 119 122 123 123 121 124 123 117 118 120 122 123 122 122 122 125 126 125 125 125 126 125 126 129 130 132 128 125 126 122 124 125 126 126 124 124 125 125 125 128 129 123 123 122 126 126 127 127 127 130 133 131 130 122 174 175 161 111 119 117 148 140 104 107 117 134 178 195 128 131 139 113 110 118 133 175 176 126 93 171 193 226 226 232 231 229 232 229 231 231 222 192 139 123 126 130 123 147 187 140 122 116 117 114 141 194 190 119 99 110 108 110 115 116 116 117 142 190 181 136 117 112 109 109 110 110 108 108 109 115 117 117 120 120 117 120 121 119 117 120 125 120 118 118 118 118 120 124 128 127 125 124 128 130 130 131 132 127 130 134 135 137 138 137 142 154 171 185 202 210 221 229 233 237 235 239 242 241 240 237 241 242 241 241 242 242 237 236 239 237 237 242 238 235 236 239 237 239 238 242 241 238 238 243 239 243 242 246 201 182 174 190 108 182 129 178 193 239 232 234 233 164 38 41 42 42 43 43 45 44 43 44 41 41 46 46 48 48 47 45 44 45 45 47 50 49 47 46 47 45 42 39 40 42 45 46 45 45 43 45 46 46 46 48 48 47 46 46 46 48 47 50 50 51 50 50 50 50 51 52 51 51 49 51 49 49 51 56 58 60 62 65 69 72 78 80 88 94 118 141 174 188 225 226 230 206 205 201 201 192 165 160 248 249 248 243 244 248 252 243 241 251 250 251 252 250 246 250 248 213 142 175 158 169 248 206 171 188 153 162 251 248 247 246 246 219 172 158 155 160 160 155 146 143 143 146 150 148 152 150 154 155 155 154 148 148 151 149 152 153 148 146 145 141 144 147 150 147 143 143 144 145 142 143 147 146 142 141 144 143 146 144 146 142 146 146 140 143 138 140 141 139 137 139 140 140 141 140 138 141 139 140 140 138 139 137 142 142 143 141 139 136 136 144 163 191 125 127 144 140 139 140 141 142 136 142 180 166 117 129 132 142 142 139 150 196 176 208 138 134 133 131 130 132 160 113 136 146 151 216 246 242 243 241 236 242 249 250 243 241 245 241 245 247 244 235 177 144 132 128 136 140 141 138 136 139 139 135 133 130 131 129 125 126 126 125 128 127 129 127 127 122 119 122 122 118 119 120 121 123 123 122 120 120 121 121 122 122 120 117 121 123 122 121 122 122 123 123 129 128 126 126 128 129 124 125 126 129 127 127 129 126 124 127 126 125 127 128 128 125 122 124 126 127 129 123 123 123 123 127 128 130 134 132 128 125 173 178 150 109 117 118 147 144 98 102 115 134 180 200 120 135 132 114 118 118 154 198 176 140 87 154 198 219 225 229 235 232 229 223 220 211 158 132 124 131 174 185 145 126 108 108 116 114 113 114 147 192 183 114 97 109 109 114 117 117 115 118 142 195 174 131 111 107 106 105 105 110 113 114 112 115 115 115 115 117 120 120 117 116 118 119 121 120 118 118 115 114 117 118 120 121 121 123 128 127 128 126 126 125 125 124 126 128 131 131 131 131 133 134 135 137 143 154 164 171 181 195 209 216 226 231 233 238 237 242 245 242 241 238 239 239 235 238 238 237 238 237 239 240 237 236 237 240 240 240 244 242 242 246 194 179 175 179 115 185 114 176 190 235 230 235 230 166 41 41 43 42 41 41 43 44 42 41 42 41 41 40 41 41 40 41 39 41 42 44 47 47 43 43 43 41 38 37 38 39 41 40 40 38 41 40 41 39 40 41 41 40 42 42 40 40 41 43 44 44 45 43 44 41 42 44 47 47 48 46 45 47 47 45 47 48 46 44 42 44 44 44 48 49 57 63 76 80 82 90 123 140 159 181 180 185 188 176 221 249 250 248 250 252 250 248 250 250 250 250 247 249 253 248 250 238 153 153 178 142 220 225 168 178 165 129 228 235 227 209 159 140 134 146 158 160 160 156 148 149 150 152 156 153 153 155 153 152 149 151 147 141 146 143 144 146 147 147 148 145 145 146 141 143 146 146 147 145 151 148 142 140 136 138 143 144 138 138 146 140 143 143 130 135 141 142 144 142 140 139 141 138 140 142 140 140 144 144 141 140 141 142 146 151 153 148 151 151 149 150 165 179 127 129 145 147 146 144 144 149 142 145 183 155 124 132 131 133 139 137 147 193 177 199 164 129 142 136 134 133 158 130 136 149 163 239 244 242 241 238 239 244 246 249 248 245 242 244 246 250 225 173 143 140 134 135 132 136 138 136 135 134 130 129 132 135 133 126 124 126 124 124 123 122 128 129 123 121 118 122 130 123 122 123 127 129 129 128 120 121 120 116 121 121 121 120 125 128 123 120 122 127 128 146 162 136 128 128 128 126 127 123 124 126 125 121 125 124 127 124 122 122 122 125 123 122 126 124 123 126 130 125 123 121 126 132 137 141 144 145 144 138 170 185 137 111 119 120 147 138 87 95 109 135 181 195 112 143 136 134 136 171 239 249 198 159 85 131 199 214 227 226 233 228 223 220 173 130 128 133 155 197 234 226 155 107 102 108 110 108 105 106 153 198 176 106 91 102 105 108 109 110 108 105 148 198 166 122 105 106 105 103 103 107 111 111 114 115 111 112 112 114 119 117 116 115 118 118 115 112 115 120 114 114 115 115 116 117 118 120 118 122 120 121 122 121 121 120 116 121 124 126 126 128 131 126 124 122 121 124 128 130 125 125 127 133 137 141 148 157 165 176 191 198 205 213 220 225 232 234 234 240 242 240 241 240 237 239 238 238 240 239 245 240 243 245 185 182 179 161 124 178 98 188 211 232 238 243 220 158 40 39 41 42 39 39 41 42 41 39 42 41 37 38 40 40 37 39 38 40 41 39 43 43 41 43 44 40 37 36 35 36 37 36 36 35 36 35 37 33 34 35 35 36 35 34 35 33 37 36 35 35 37 36 36 36 35 36 40 41 41 42 42 42 45 45 46 46 43 42 42 41 41 39 40 41 45 47 50 51 53 57 59 68 85 100 125 159 177 180 179 214 251 251 253 252 252 249 251 250 249 251 246 250 253 248 247 249 182 139 182 145 190 243 174 169 174 129 197 216 168 137 134 139 146 150 157 158 159 156 157 160 151 151 150 146 147 153 145 143 151 151 150 145 148 141 143 143 138 138 143 146 148 143 140 143 144 146 147 145 143 143 142 144 146 150 144 138 122 121 127 125 117 119 123 131 139 138 141 142 143 138 136 137 138 140 143 140 138 141 145 143 148 154 159 162 168 174 176 180 184 184 182 179 160 154 154 149 147 146 144 154 149 151 184 149 129 131 136 137 140 135 148 183 184 192 184 127 150 140 141 139 157 139 140 159 156 234 245 244 246 245 245 245 246 247 244 245 246 249 239 222 171 148 142 138 137 134 133 134 137 134 130 131 129 130 131 134 133 129 124 127 123 125 126 125 128 130 125 126 127 126 123 123 126 129 127 125 128 131 125 123 119 116 121 125 126 122 124 128 125 125 126 129 127 153 173 138 130 128 130 127 135 164 160 128 123 121 123 121 122 124 124 123 120 120 119 123 126 122 122 125 124 123 123 125 132 185 211 210 212 214 192 147 172 190 129 115 112 120 144 130 87 96 110 142 186 197 106 150 138 139 159 222 248 249 209 175 87 121 198 217 252 252 249 249 223 184 153 138 151 191 223 222 215 171 114 98 91 87 88 93 95 101 159 200 166 101 97 101 100 99 102 106 107 107 149 205 156 112 105 107 105 104 103 103 106 106 108 111 108 111 111 112 115 113 114 114 118 119 116 113 112 115 113 112 114 115 117 118 120 119 117 117 118 115 110 111 116 116 114 121 120 116 105 118 126 124 123 125 124 128 128 128 125 126 123 123 125 127 125 128 132 132 132 134 140 143 150 151 160 168 179 196 220 228 236 237 239 240 241 242 248 244 243 237 239 243 178 179 186 151 133 171 91 154 203 235 240 241 216 158 43 44 44 42 41 40 41 40 40 39 39 40 40 41 38 38 39 39 38 38 39 39 39 38 39 40 40 37 37 36 36 33 33 32 32 30 30 29 31 31 31 31 30 29 29 29 30 31 31 30 30 29 29 30 30 30 32 32 33 34 37 40 40 43 42 43 41 40 38 36 35 35 37 36 36 38 41 40 41 40 40 40 40 40 52 62 78 85 112 136 172 164 205 246 251 251 251 252 249 250 250 250 251 250 247 247 249 249 221 148 166 164 156 235 204 162 187 144 143 149 126 127 129 145 151 155 156 153 158 158 153 156 155 156 147 147 152 156 155 150 146 145 150 150 148 147 145 146 144 142 144 145 148 143 145 146 144 144 147 145 144 143 144 147 149 149 139 129 121 115 116 118 118 127 131 135 140 140 140 147 145 141 140 142 139 143 138 138 138 138 131 133 136 137 138 140 142 143 149 154 163 168 175 178 180 186 185 184 182 178 170 173 163 161 179 149 136 136 146 142 140 136 147 172 191 182 203 136 147 148 159 180 193 148 138 161 154 218 247 245 247 248 247 246 246 243 241 240 245 237 198 146 137 135 129 130 135 134 132 132 131 131 131 129 130 131 136 138 134 133 129 131 129 132 129 127 128 132 134 128 127 124 119 122 125 128 134 126 132 138 132 125 120 120 118 121 123 121 122 129 135 133 143 161 159 151 123 132 181 164 127 129 130 167 155 124 122 122 121 119 122 119 121 122 119 116 115 118 123 124 126 123 125 127 131 131 129 146 152 146 144 139 130 138 172 192 118 124 126 124 132 124 105 109 120 147 187 192 105 157 131 140 214 246 247 245 222 185 99 105 195 202 247 242 218 184 156 148 163 194 235 248 250 237 177 140 134 125 92 84 92 97 99 111 155 198 152 97 95 102 104 105 101 100 101 104 153 206 145 102 99 98 96 98 102 103 106 107 107 107 112 111 108 109 108 108 107 110 111 111 111 111 110 110 107 108 111 109 111 115 119 120 118 118 117 115 111 113 115 121 121 123 121 117 117 121 121 121 119 121 123 125 124 124 123 118 115 117 119 123 124 126 128 129 129 127 128 129 128 125 129 129 126 126 129 135 155 172 198 218 235 238 246 248 241 241 245 242 175 180 187 138 142 152 95 111 187 239 243 230 205 154 52 52 50 49 48 46 47 44 40 40 40 39 39 38 38 38 39 37 38 36 38 38 38 37 38 39 39 37 37 36 36 31 32 30 30 28 29 28 29 28 27 28 29 29 29 29 30 30 29 29 28 27 28 29 29 30 29 28 29 31 35 38 40 42 42 41 38 36 33 32 31 31 33 33 34 35 38 39 38 38 38 38 36 35 39 44 53 64 77 86 123 156 162 206 253 251 251 249 253 254 251 250 244 248 251 251 251 251 239 171 145 175 136 213 221 160 186 166 124 158 137 130 140 148 154 157 151 153 156 155 152 151 156 161 149 150 156 156 157 161 152 146 151 156 156 153 148 149 149 146 147 146 148 147 149 150 147 146 151 149 143 147 151 147 146 140 137 136 131 126 122 128 129 124 132 138 140 145 144 144 146 150 146 142 137 139 140 136 124 122 120 117 112 112 113 117 116 118 123 125 132 137 145 148 149 155 161 165 171 173 178 182 183 185 188 184 179 174 170 166 156 150 152 165 190 173 208 151 144 174 222 238 231 160 135 157 160 200 251 245 245 250 249 248 251 243 241 246 236 184 141 135 132 127 124 128 130 129 131 136 129 127 131 131 131 136 139 139 136 137 132 130 130 131 131 133 133 134 132 133 127 124 126 130 127 124 122 121 128 131 131 130 120 118 119 120 126 126 123 128 138 131 157 208 178 153 130 126 141 139 133 135 125 123 119 120 121 121 119 117 116 118 119 117 117 118 114 116 122 123 126 123 123 130 132 126 127 128 130 132 134 134 137 145 173 190 115 147 131 128 128 131 131 128 132 156 190 185 107 163 127 133 219 248 247 251 236 191 113 94 188 190 227 181 153 144 163 190 226 243 246 243 226 181 146 143 131 120 110 110 112 115 113 115 146 190 125 90 102 108 108 106 109 108 108 106 155 205 130 96 98 96 93 98 99 100 102 102 105 103 102 105 108 106 104 107 106 105 103 104 108 112 112 111 108 108 112 113 112 116 118 120 117 120 119 116 116 115 117 118 116 120 120 119 121 118 119 120 119 118 119 120 122 122 123 122 121 121 122 122 120 123 123 124 125 123 125 126 126 127 127 126 126 124 123 125 127 132 136 146 177 219 239 248 246 241 247 231 172 178 190 131 155 136 95 113 193 245 235 222 204 148 54 55 55 55 56 58 57 54 51 49 51 48 43 43 41 39 39 37 36 37 37 37 39 39 39 40 39 37 36 34 34 32 32 30 31 30 29 27 26 27 26 27 27 28 28 27 29 28 27 28 26 26 27 27 28 28 27 28 29 31 34 35 39 40 39 38 36 34 29 29 29 29 29 29 33 32 33 36 35 38 39 38 37 35 35 37 39 45 56 70 81 98 142 155 207 249 247 242 246 251 248 250 247 244 253 251 251 254 250 206 139 174 128 152 182 159 174 185 113 150 131 132 131 135 151 157 157 154 147 145 153 158 158 154 150 148 149 150 148 153 149 145 154 151 155 152 147 146 149 150 147 149 151 151 150 151 151 152 148 145 144 142 141 144 147 148 146 142 143 146 142 138 138 140 143 148 145 148 144 137 135 138 146 140 136 135 141 120 104 99 99 96 96 94 94 99 101 101 100 101 101 108 110 113 112 116 120 123 130 131 135 139 146 152 156 160 166 168 175 178 184 188 186 184 189 183 187 176 177 209 224 231 231 178 143 156 158 174 251 247 247 250 249 248 247 245 242 216 156 140 141 137 128 132 135 131 133 133 138 139 134 129 128 132 134 136 138 134 132 133 132 129 133 134 133 135 134 136 132 128 129 132 130 126 120 115 111 118 130 125 123 126 122 122 125 127 127 125 126 131 135 131 133 135 133 126 126 126 124 129 162 200 132 123 123 121 122 124 119 117 118 118 114 111 113 118 116 114 116 120 123 127 123 127 128 127 135 133 129 129 133 136 129 146 176 187 112 156 129 130 131 135 139 139 134 157 193 176 112 166 140 132 152 186 221 239 235 190 135 84 181 190 126 137 155 185 236 249 253 251 239 207 164 144 143 136 118 112 116 114 112 115 113 105 117 125 73 65 111 113 109 115 114 112 103 105 152 177 109 99 102 105 105 108 110 111 106 98 112 108 97 91 91 86 82 82 84 83 83 82 87 91 98 102 108 107 110 117 116 117 116 117 116 116 113 115 115 113 113 115 111 113 114 115 114 113 116 118 113 114 118 119 119 118 121 123 123 123 124 126 124 124 124 123 123 120 121 121 122 124 126 125 124 123 124 125 127 127 128 129 127 132 190 233 248 243 244 218 170 175 187 124 168 122 93 121 202 236 216 228 164 150 55 55 56 55 57 57 57 57 56 53 54 52 47 46 42 41 41 40 40 41 45 45 49 48 48 46 41 39 35 35 33 33 45 44 38 32 35 31 27 27 26 27 26 26 26 26 28 26 27 27 26 25 25 27 27 26 27 29 28 31 33 35 37 37 38 36 34 31 27 28 28 27 28 27 30 29 31 33 33 36 38 37 39 39 36 36 36 38 42 49 63 76 110 137 160 224 250 246 250 253 251 254 250 247 249 253 253 253 249 230 144 148 141 125 164 156 159 188 127 138 127 130 136 137 153 158 161 156 150 149 156 156 158 161 153 147 144 141 141 140 138 142 153 152 151 153 147 146 149 148 146 148 153 159 151 149 150 150 148 148 148 143 143 144 146 152 151 144 146 148 148 146 142 144 143 143 146 149 150 143 144 143 142 138 136 132 105 79 64 59 54 50 51 51 53 55 57 60 64 69 75 87 92 98 100 106 102 105 106 108 110 110 114 121 124 127 130 133 139 141 144 147 154 160 170 172 177 180 183 183 190 196 202 192 184 181 177 173 221 231 235 239 242 244 244 243 215 161 141 140 140 137 135 138 133 131 130 132 134 133 135 131 131 132 131 131 139 137 133 131 133 130 132 134 133 137 135 133 134 131 130 124 126 126 127 125 121 125 131 126 122 121 123 129 130 125 123 124 126 129 127 126 127 125 118 116 121 124 124 123 128 129 118 123 122 122 121 122 118 122 121 121 118 117 122 120 114 113 113 113 119 123 124 126 124 126 129 126 127 129 128 134 132 149 176 180 115 159 129 132 136 138 134 134 131 162 196 167 119 160 158 164 140 140 155 168 173 172 152 83 167 199 141 182 214 239 250 252 241 210 168 144 143 140 139 122 103 114 115 116 120 119 104 74 55 54 45 58 108 117 119 114 118 114 102 111 133 144 100 83 102 106 106 110 115 117 113 103 125 113 118 118 115 115 113 112 108 102 100 96 91 90 96 101 109 99 97 105 107 109 109 110 111 114 111 110 113 114 114 117 113 110 113 111 110 112 111 110 111 112 115 115 115 116 120 119 117 119 121 122 122 124 125 124 123 119 121 122 123 123 126 124 126 125 124 124 128 129 131 132 128 128 141 204 240 235 234 202 169 176 184 116 178 119 93 111 184 226 219 217 136 151 57 57 58 58 57 56 56 57 57 55 56 54 51 44 41 39 40 42 41 41 47 49 53 52 52 51 48 43 37 34 32 30 47 54 51 40 34 30 28 28 26 27 26 26 26 27 28 25 26 24 25 25 26 27 26 26 26 28 28 29 31 34 34 38 35 33 31 29 28 26 25 25 27 27 29 28 29 29 29 31 37 37 37 38 37 37 37 36 37 39 44 50 75 99 139 161 236 247 251 252 254 253 252 248 250 252 249 248 234 208 154 139 138 104 152 138 149 186 147 116 143 120 127 138 152 154 146 145 145 141 139 135 141 147 153 154 147 141 133 135 141 144 146 153 150 145 145 148 148 147 146 153 152 154 146 143 149 148 148 150 153 150 148 148 149 147 145 145 144 148 149 147 144 144 140 142 145 148 146 146 151 142 138 134 133 89 67 57 39 31 28 28 30 34 39 44 35 34 35 36 36 40 41 43 51 55 60 67 74 77 83 89 96 96 95 99 103 105 109 110 110 112 115 116 122 127 132 136 139 143 148 154 160 160 162 168 179 185 185 187 188 191 193 197 199 199 181 170 161 154 152 154 152 152 146 140 131 130 132 134 135 139 138 136 134 136 136 136 134 135 133 133 131 132 135 136 133 133 135 135 135 131 130 134 135 137 130 128 130 133 132 122 122 128 125 122 121 119 122 127 131 126 122 122 126 127 121 122 124 123 121 122 122 121 117 114 120 123 121 114 121 122 118 117 116 112 112 120 122 120 120 124 125 124 121 126 125 123 125 129 128 128 130 152 181 174 113 160 130 128 130 131 132 134 134 168 200 155 129 166 165 220 209 195 194 189 161 160 170 93 146 207 169 193 200 197 198 187 149 136 134 132 135 136 133 108 107 114 118 118 116 111 98 79 62 54 58 82 105 111 116 115 116 115 106 81 77 75 57 52 99 110 113 113 116 118 123 122 121 123 124 122 120 123 122 124 121 121 123 125 121 125 126 125 121 117 116 115 115 113 107 108 114 110 103 100 101 102 103 102 101 101 102 103 108 109 110 110 111 110 108 111 112 112 113 113 112 113 117 117 117 118 118 116 117 120 117 120 125 126 124 123 122 120 123 122 124 129 128 130 131 128 130 182 241 235 227 178 177 177 179 115 188 116 97 81 83 137 207 177 147 149 60 60 63 60 57 59 59 57 57 54 55 53 54 45 40 40 39 38 41 42 45 50 52 55 55 54 50 43 38 35 33 31 29 34 46 48 40 29 27 27 25 25 24 24 25 27 27 25 24 24 25 26 26 27 26 27 28 27 26 28 31 33 35 36 35 34 30 28 27 27 24 26 27 28 28 26 29 29 28 31 34 33 36 38 38 38 39 37 36 36 41 46 53 70 110 144 184 237 250 250 250 250 253 251 249 251 240 213 170 158 161 141 129 93 133 129 136 174 169 106 141 124 130 146 150 148 147 149 151 151 147 143 144 147 147 156 155 148 147 150 149 145 144 146 144 147 151 148 149 150 153 155 153 155 160 152 152 152 154 152 152 151 149 148 149 145 142 143 144 145 146 145 144 145 146 148 150 148 148 151 149 141 139 133 121 79 58 41 24 21 20 24 27 31 37 42 26 24 25 24 26 31 36 39 48 49 51 50 48 46 45 48 51 52 54 57 61 64 68 69 75 77 78 82 86 92 96 98 109 114 120 125 131 135 133 130 134 140 146 146 148 153 162 171 174 178 181 184 186 189 188 191 191 190 186 179 172 169 164 156 153 150 144 139 132 134 139 141 138 137 138 138 134 132 133 133 136 139 136 136 133 131 135 137 134 135 130 127 128 132 139 131 123 124 126 121 119 118 119 128 126 124 125 124 123 119 117 121 122 116 110 115 113 113 116 116 119 119 119 116 120 121 118 118 119 120 120 118 117 120 121 122 125 122 121 125 123 125 124 121 123 126 126 155 186 166 119 157 129 125 127 130 135 139 138 172 199 142 138 171 159 200 195 176 174 175 161 156 184 101 133 208 167 177 183 188 155 134 134 137 135 131 129 125 114 102 110 114 114 119 119 111 101 94 91 90 92 99 103 107 112 112 115 117 109 76 48 43 48 64 102 112 117 117 116 120 122 124 127 126 123 121 123 121 124 126 123 122 123 125 125 122 124 125 122 121 121 122 126 126 125 125 125 122 118 112 111 109 104 102 104 96 97 104 106 106 104 99 100 97 98 102 103 104 108 108 111 113 115 114 115 117 114 115 114 116 115 119 119 123 125 121 121 121 123 122 123 125 124 126 125 127 133 186 238 238 231 173 180 181 172 114 195 117 107 88 99 192 204 163 156 147 99 89 79 74 67 63 64 62 62 58 57 56 52 48 44 42 40 41 40 42 45 49 52 56 55 55 50 45 39 34 30 28 29 27 33 47 51 40 27 25 24 24 24 25 26 26 24 24 23 24 26 26 26 27 26 26 27 27 26 29 31 33 34 34 32 32 29 27 26 26 24 25 25 26 27 27 30 28 28 29 29 32 34 36 35 36 40 41 39 36 40 42 46 49 75 107 153 204 253 253 252 251 249 248 232 196 165 155 152 156 156 139 136 95 101 129 116 138 188 111 121 134 140 144 149 144 142 144 151 151 149 148 151 150 148 149 152 154 157 160 151 144 144 147 150 156 158 151 149 152 153 149 148 152 149 149 151 153 154 157 150 152 151 150 149 149 149 149 143 143 146 145 148 149 150 153 151 149 144 143 141 140 138 141 117 59 48 26 21 20 19 22 27 30 35 36 22 21 23 22 23 25 31 35 41 45 51 56 54 50 43 41 43 40 37 37 38 40 43 44 45 44 44 44 46 48 47 48 50 53 54 57 65 72 76 80 87 95 102 104 116 123 127 129 134 136 138 142 140 146 145 147 152 159 166 170 176 184 195 199 200 200 195 192 187 181 174 170 163 158 153 150 149 144 144 142 139 139 137 134 131 131 136 137 134 131 131 125 125 129 127 126 119 122 125 121 118 121 118 117 117 118 116 115 116 115 110 111 113 112 110 112 116 119 116 119 115 116 118 118 120 118 119 116 117 118 114 112 115 115 118 120 119 118 119 126 124 129 133 126 121 125 128 160 185 152 125 151 127 126 128 132 135 134 139 176 198 133 144 168 162 156 174 178 196 213 229 230 181 117 115 202 201 241 244 241 152 135 142 139 135 133 126 111 100 113 118 116 116 120 117 112 110 107 108 116 114 112 113 114 119 121 116 118 112 98 84 77 82 98 112 118 122 123 127 129 125 124 125 122 125 125 123 122 122 121 125 122 123 125 124 123 122 123 124 123 119 120 121 125 122 123 122 122 119 120 115 112 114 116 115 124 124 127 127 126 116 111 110 106 102 103 94 91 86 84 94 99 107 107 114 114 113 113 110 107 106 110 116 119 121 119 116 118 120 121 121 120 118 119 121 122 152 215 233 236 226 168 179 184 165 119 206 149 126 118 179 184 141 175 141 149 163 158 146 139 122 104 87 76 65 59 56 59 58 55 52 48 45 44 43 44 46 48 52 54 56 55 51 46 39 36 33 32 31 27 29 35 57 45 30 24 24 24 25 26 26 25 23 23 25 23 27 26 25 27 26 26 26 26 29 29 31 34 32 34 32 30 29 28 25 26 25 26 26 27 27 27 28 26 27 28 29 30 31 34 34 37 40 42 42 38 37 39 44 46 52 83 131 163 242 253 253 252 240 209 165 149 146 150 149 151 150 140 136 107 82 110 119 121 180 119 104 134 142 144 154 153 151 145 148 150 145 143 149 156 154 160 156 156 155 154 152 151 147 148 146 151 155 149 148 145 141 142 149 152 153 152 153 154 154 153 152 151 154 152 153 151 153 153 151 150 147 149 151 152 153 152 150 151 144 147 146 146 148 144 118 54 34 23 21 19 20 24 31 29 34 35 20 19 21 20 23 24 30 34 37 37 45 55 58 59 48 43 40 38 35 36 37 37 38 37 36 35 35 36 39 40 38 39 39 40 44 44 45 47 47 49 51 55 59 60 64 65 70 74 78 81 83 93 100 108 116 117 127 136 136 137 139 144 152 157 163 166 174 179 188 200 195 194 193 195 196 193 194 193 189 186 177 174 168 160 152 147 143 141 130 125 128 127 127 130 130 129 126 124 122 120 121 119 113 110 118 122 119 117 111 108 107 107 110 115 116 117 118 122 121 117 116 116 116 119 117 113 116 114 118 118 115 115 117 117 115 115 117 117 120 122 123 126 130 129 122 125 131 161 187 147 130 147 131 133 129 126 129 130 141 178 196 123 155 159 173 197 237 236 243 243 245 247 192 131 107 193 198 235 247 235 147 137 141 144 139 142 121 105 112 118 117 121 121 120 118 116 109 108 113 118 116 115 118 123 122 123 120 117 119 112 107 106 108 118 120 120 124 127 124 123 124 124 123 121 124 127 124 123 126 128 129 124 125 126 124 124 125 127 127 125 122 124 121 122 121 121 123 126 124 122 119 117 121 122 123 126 123 125 127 128 126 126 129 127 126 124 122 122 114 113 120 120 119 116 115 115 114 116 104 93 98 100 100 111 116 112 106 106 108 113 119 117 116 118 121 125 196 228 231 232 215 168 176 188 155 130 214 225 206 204 172 157 116 173 135 150 170 170 170 170 173 173 172 166 155 148 129 114 101 92 84 79 68 63 57 57 54 53 55 57 58 59 57 52 43 40 37 37 37 37 38 34 63 47 35 27 25 25 24 24 24 24 24 24 25 25 26 25 26 26 24 24 25 26 25 28 29 30 32 33 32 31 30 26 24 25 25 27 24 24 26 27 27 26 26 27 28 29 31 34 34 36 38 39 41 39 38 35 38 45 47 60 100 138 195 249 250 249 210 175 167 165 164 174 170 165 157 143 109 108 66 86 107 107 147 124 98 120 141 139 141 139 144 142 136 133 136 139 141 145 148 142 147 149 144 142 142 144 144 147 154 161 153 146 153 153 157 154 152 154 154 150 151 152 145 150 154 152 153 152 152 152 156 151 148 151 147 147 148 147 147 148 147 147 148 152 152 150 151 149 116 49 31 22 19 19 18 23 32 30 32 34 19 18 19 21 22 22 27 33 34 35 40 49 59 59 56 51 40 39 36 36 38 38 34 34 33 33 35 35 34 35 36 36 36 37 37 38 39 41 42 42 45 49 56 58 57 57 58 56 56 58 57 54 51 49 47 48 56 65 72 72 80 87 91 98 106 112 121 127 140 148 152 154 159 158 161 165 169 173 185 187 195 198 203 204 208 208 208 206 202 197 190 183 176 171 167 161 156 152 145 138 131 129 124 121 118 116 120 117 117 113 110 108 109 110 114 117 118 120 117 110 120 121 118 119 117 116 113 114 115 119 113 115 110 112 118 119 119 120 118 119 120 121 122 123 123 126 135 166 187 135 139 147 134 131 131 130 128 130 148 185 192 119 159 139 180 190 246 240 243 248 246 248 204 148 101 180 199 225 247 217 140 136 135 135 136 136 109 107 118 119 120 123 121 118 117 117 121 121 124 124 122 123 122 120 122 123 123 118 118 113 113 116 118 122 121 121 121 122 126 127 123 123 124 123 127 128 126 123 126 128 128 128 125 124 126 122 125 124 126 127 125 122 123 124 124 122 124 123 123 124 119 117 121 122 123 120 122 123 124 129 126 125 124 121 121 124 120 119 125 126 125 125 126 126 127 124 124 127 123 119 112 108 108 104 104 104 94 89 90 90 93 90 90 100 113 134 215 219 215 214 204 165 177 193 135 148 168 150 223 244 168 137 120 138 128 157 171 171 172 172 172 171 173 171 171 170 170 167 167 163 158 151 143 138 132 125 113 105 91 78 76 71 70 66 59 51 48 52 52 49 55 49 70 54 43 30 26 26 24 25 26 24 24 25 25 25 25 25 25 25 24 25 26 25 25 26 29 31 33 35 33 31 30 28 25 25 25 25 24 25 25 24 25 25 24 25 26 29 31 32 32 33 36 37 39 38 39 37 37 43 48 51 79 117 167 220 242 241 205 166 140 139 144 157 160 157 156 143 90 85 67 66 101 98 110 110 96 104 124 131 132 129 131 133 131 132 142 143 141 142 139 139 137 137 134 137 137 141 143 148 149 161 148 142 150 155 157 156 154 151 150 151 153 154 152 155 153 148 151 148 152 153 159 156 150 147 149 151 154 156 151 155 153 151 152 155 150 145 146 147 116 45 27 20 19 19 19 22 32 32 31 37 21 18 18 21 21 23 27 31 33 35 36 43 54 57 56 53 44 40 37 40 37 36 35 34 35 33 34 35 34 35 36 35 34 35 34 36 37 38 40 41 45 49 55 57 56 56 58 57 57 59 60 59 55 54 47 43 43 41 43 42 43 43 45 45 51 53 59 58 65 72 85 96 103 111 122 128 130 133 141 148 155 161 166 171 174 179 184 190 192 195 198 200 203 207 206 207 209 207 204 203 198 194 188 186 180 175 172 167 160 154 145 140 136 127 123 121 122 123 119 117 122 124 123 120 118 117 120 118 122 125 122 122 120 119 124 124 124 125 124 126 127 123 125 125 122 126 139 169 190 131 145 146 129 132 137 134 138 132 153 189 187 119 157 124 184 175 250 247 240 248 246 249 216 164 99 168 202 213 214 158 133 133 134 136 128 114 109 116 123 123 122 123 118 119 115 113 121 122 126 130 131 127 127 125 126 123 122 119 118 120 120 124 124 122 122 122 123 122 123 128 127 128 124 122 130 128 129 125 125 124 123 125 122 123 124 122 124 123 125 124 124 122 124 124 122 124 124 122 122 124 127 121 120 122 123 122 123 125 124 126 124 125 124 122 124 123 123 122 126 125 122 123 124 126 124 117 119 123 122 122 123 123 122 122 124 125 120 113 117 114 110 105 104 107 120 166 210 207 207 210 178 160 177 198 131 144 157 111 144 205 169 123 141 124 128 159 160 166 150 165 173 174 174 174 173 172 172 171 168 170 169 167 166 167 166 167 166 168 167 171 162 164 159 158 155 153 148 139 132 131 122 118 108 62 44 30 26 25 25 25 24 24 25 25 25 24 26 25 25 25 24 25 26 25 24 25 29 31 34 34 32 31 28 26 25 24 24 25 25 25 24 25 24 26 25 26 26 28 30 31 31 30 33 35 36 37 38 37 37 37 44 48 56 84 147 167 237 234 225 205 173 154 138 135 138 133 134 132 82 68 65 58 71 96 82 87 94 93 108 128 130 132 131 123 127 131 137 137 140 145 139 137 136 134 135 139 146 150 148 155 156 150 143 139 150 157 156 152 148 146 144 150 151 151 145 144 145 145 150 154 154 148 154 158 159 151 155 154 153 162 159 154 152 150 152 152 149 149 148 147 108 48 29 19 17 18 19 21 32 34 30 37 20 17 19 19 19 22 25 29 33 33 33 39 47 55 56 55 51 44 39 39 37 37 36 35 34 32 33 34 34 35 36 36 35 34 35 36 35 38 39 39 43 48 52 55 55 54 57 56 56 57 56 56 55 53 46 42 39 38 39 37 37 37 35 36 36 35 36 37 37 37 40 39 37 38 36 40 47 50 60 68 79 86 96 103 115 127 138 141 148 149 155 163 166 172 176 182 184 191 197 202 204 205 213 218 219 218 220 218 220 219 217 217 217 217 213 210 207 205 203 200 195 191 186 184 181 177 172 163 159 155 151 146 142 141 142 139 135 131 127 127 136 134 135 132 135 138 147 175 188 124 153 145 132 132 135 137 139 133 158 192 181 121 160 108 184 162 248 249 245 246 248 250 226 178 109 154 208 175 146 139 136 133 133 121 110 109 120 122 125 128 124 122 120 124 125 123 126 125 130 131 131 129 129 128 131 130 126 123 123 127 126 124 126 127 130 122 122 122 126 125 125 126 125 126 123 124 124 122 120 122 125 126 125 126 125 127 129 127 125 125 123 120 126 123 123 127 127 125 123 125 127 123 122 124 125 124 122 122 122 122 122 124 121 122 122 123 123 122 122 122 122 122 119 122 122 120 119 118 122 123 120 122 123 125 126 125 123 114 126 127 126 126 128 127 182 238 244 242 238 234 190 161 178 196 122 134 155 113 119 165 133 167 163 149 125 164 144 165 129 155 174 174 173 174 175 173 174 172 171 170 172 170 169 170 170 170 169 168 169 173 166 172 167 166 166 168 167 167 165 165 165 167 163 72 47 31 27 25 24 25 24 24 24 23 24 25 25 25 25 25 24 26 28 27 26 26 29 32 35 34 32 32 29 27 25 24 23 24 25 26 25 25 24 24 24 25 25 27 28 27 29 30 33 34 35 36 38 37 37 35 40 46 49 66 124 154 215 246 232 234 231 211 177 157 138 130 126 117 74 53 49 49 78 107 77 78 85 78 80 118 129 130 126 120 122 125 128 132 135 144 144 146 143 142 140 143 151 153 146 149 152 150 148 142 148 151 152 149 148 149 148 144 142 143 146 144 140 146 151 153 151 146 151 156 155 151 155 158 153 156 158 156 154 152 155 154 153 152 153 154 121 55 29 19 18 17 18 20 30 33 30 38 20 17 18 19 18 20 23 28 33 33 35 37 42 50 56 57 54 50 42 38 37 35 35 35 33 31 34 35 34 34 36 36 35 35 34 35 34 36 37 38 42 46 49 52 54 53 56 56 55 57 56 56 54 52 47 42 40 36 34 37 36 37 34 35 34 33 33 34 34 34 34 33 33 34 36 36 36 36 37 38 37 37 38 41 48 50 59 63 68 73 88 98 110 119 135 141 143 147 154 156 167 169 178 185 191 192 199 201 211 215 218 223 227 227 231 231 231 233 229 230 233 231 231 229 232 232 231 227 228 226 222 218 216 212 207 201 194 187 177 171 165 156 147 139 139 139 155 180 184 117 155 141 131 130 132 136 143 146 160 192 176 123 153 103 179 160 241 252 251 247 247 250 236 188 122 144 211 165 138 140 143 138 127 113 108 117 123 125 123 127 126 126 127 129 132 132 129 126 128 130 129 129 126 129 134 134 124 123 128 131 133 128 131 130 126 125 130 131 128 124 123 123 124 126 125 125 126 124 124 125 125 127 128 148 158 136 129 127 127 130 126 124 129 126 126 125 127 124 124 126 124 124 127 123 124 121 122 120 119 121 122 123 121 122 120 121 123 121 126 123 123 122 120 125 124 123 120 121 127 124 121 121 125 126 126 126 124 116 122 127 122 126 128 140 226 242 243 247 245 246 197 165 182 190 121 132 164 114 123 174 96 116 154 134 127 170 124 164 161 154 175 174 174 174 173 174 174 176 174 173 174 171 167 166 166 167 171 173 171 175 171 169 169 168 169 168 165 165 166 165 166 167 168 90 45 34 25 26 25 24 24 24 24 25 23 25 25 25 25 25 25 25 24 25 28 28 29 31 36 37 34 32 29 27 24 23 22 23 24 24 24 24 24 24 24 24 26 25 26 27 28 27 31 31 33 34 36 35 38 38 38 43 45 50 89 149 172 236 233 232 230 233 235 231 193 141 118 102 85 74 79 90 109 109 71 61 60 53 86 121 128 123 126 133 135 133 133 134 135 126 113 106 117 127 134 133 141 147 146 134 130 134 140 136 148 151 147 145 142 141 147 148 143 141 141 142 137 140 140 149 153 146 145 151 157 156 155 158 159 155 153 152 155 155 151 153 154 152 156 171 136 51 32 21 18 17 17 19 29 33 30 37 19 16 17 18 18 20 21 25 30 32 34 36 38 42 54 56 55 53 46 40 38 36 35 36 35 34 36 34 33 34 36 36 37 37 37 35 34 37 39 40 43 45 50 51 54 54 55 55 54 54 54 56 55 53 51 47 42 40 38 36 37 37 39 37 36 34 34 33 33 35 33 32 30 31 31 32 33 34 33 32 34 34 34 35 35 38 38 39 41 44 42 43 42 39 39 39 49 53 58 65 74 86 99 108 123 129 139 147 159 165 172 175 182 183 189 195 200 206 212 221 228 231 236 239 242 247 250 253 252 251 252 251 252 252 250 250 247 246 243 241 237 232 226 221 204 187 178 185 179 123 157 135 132 137 143 161 203 200 160 198 167 127 156 107 172 156 227 252 251 251 250 251 244 197 138 123 209 181 131 137 142 139 132 115 114 118 120 121 124 131 135 133 133 131 129 134 132 127 126 124 130 131 127 123 131 136 124 124 125 129 130 126 130 130 129 128 130 133 129 128 128 125 125 128 127 125 132 131 127 127 130 129 131 167 191 142 133 131 131 130 129 137 166 149 123 125 124 124 123 122 120 120 121 118 120 121 121 121 122 124 120 123 126 123 123 125 121 121 126 124 126 123 128 127 124 122 123 121 127 121 120 121 127 125 121 121 122 122 122 124 124 124 130 186 244 240 237 243 242 242 184 173 187 183 120 130 179 116 126 169 91 114 128 113 132 169 115 147 163 155 154 154 162 167 172 172 174 174 174 173 174 172 151 143 142 156 157 168 171 173 170 170 170 170 169 168 164 165 166 165 164 169 170 116 43 40 27 25 26 25 24 23 23 24 24 24 24 24 23 24 24 24 24 25 26 25 28 31 36 37 36 33 30 28 24 22 21 21 23 24 24 23 24 24 24 25 26 27 25 26 27 28 29 29 32 32 33 34 36 37 38 40 47 48 69 125 159 201 234 221 234 227 197 171 142 119 131 156 171 161 126 118 112 107 91 83 85 97 120 132 136 131 134 139 138 134 136 138 142 141 136 129 126 131 140 134 134 134 143 145 139 135 134 138 146 140 141 145 146 143 143 145 140 143 146 140 138 139 138 144 152 149 145 150 153 154 157 156 155 153 150 146 149 142 143 156 162 173 200 221 180 58 36 22 17 17 19 20 30 35 29 34 21 17 18 18 19 20 21 25 31 33 34 34 38 42 50 54 56 54 50 43 38 37 35 34 35 34 35 34 34 35 35 34 35 36 38 36 35 38 40 41 44 47 49 51 54 55 55 57 55 54 54 54 52 53 52 51 50 47 45 44 41 41 41 39 37 34 35 35 34 35 33 34 32 33 32 33 33 33 34 32 33 34 36 37 38 38 40 39 42 46 47 48 50 50 48 49 50 48 46 47 45 46 45 44 50 54 55 59 67 72 81 90 104 115 131 150 164 175 184 181 185 194 203 205 210 218 224 228 234 238 245 246 252 254 253 254 254 254 254 254 254 254 253 251 248 244 232 217 199 167 164 133 138 145 176 217 243 203 166 198 161 137 153 114 162 163 211 252 250 252 250 250 248 203 148 119 206 195 140 139 135 144 175 125 120 121 123 123 124 131 130 132 134 131 127 131 132 129 125 127 127 131 130 130 133 131 128 125 128 127 124 125 126 127 125 128 133 134 131 133 134 129 129 132 131 126 129 130 130 129 130 131 132 133 134 128 161 187 143 128 128 140 188 166 128 127 126 126 122 123 120 116 117 118 122 124 122 123 123 121 119 122 123 122 125 125 122 121 123 124 126 123 128 128 126 124 124 122 127 127 123 122 127 127 125 125 127 130 126 129 129 125 153 224 241 239 238 238 237 237 169 177 189 180 119 121 160 119 130 158 102 116 128 110 139 167 129 158 174 149 149 129 152 136 146 153 155 162 155 165 166 168 149 140 117 150 158 156 171 170 171 170 172 170 168 168 165 163 152 153 156 157 170 150 38 51 30 26 26 25 26 24 22 22 24 24 23 24 25 24 24 25 23 22 25 26 27 30 34 35 34 31 31 27 25 24 23 24 24 24 23 22 23 24 23 23 25 25 26 25 27 27 27 28 30 31 34 35 34 34 36 38 44 44 53 87 155 165 221 213 190 153 125 137 161 195 224 221 192 162 120 126 144 155 170 164 152 145 141 137 138 135 136 141 147 146 144 145 146 146 139 137 139 136 136 138 136 136 135 137 138 136 137 135 133 131 118 119 129 123 121 126 131 146 156 152 151 154 154 151 151 152 150 146 143 145 147 142 145 144 150 155 160 172 194 212 233 244 252 249 184 61 37 22 19 17 18 20 28 36 32 36 20 17 16 18 17 19 21 25 30 34 34 35 38 39 46 52 57 56 52 48 40 39 35 35 36 35 35 35 35 34 34 35 36 35 36 37 37 41 41 40 44 47 47 51 53 53 54 54 53 53 53 55 55 53 53 50 48 50 49 46 47 48 46 43 41 37 37 38 37 38 38 40 41 41 39 40 39 39 38 38 39 40 41 41 41 41 42 42 44 45 46 48 48 48 47 48 47 49 48 48 47 47 45 46 49 48 48 48 48 47 48 45 44 43 39 41 42 46 62 73 89 104 116 121 126 125 141 154 170 179 183 187 201 205 215 222 234 240 245 250 253 253 254 254 254 254 251 242 233 223 204 178 175 216 241 244 245 188 173 200 157 145 154 131 153 179 190 250 248 250 254 254 247 205 163 124 199 208 149 144 128 114 127 119 123 125 121 121 123 122 119 121 125 127 129 127 123 124 125 130 124 126 127 126 126 126 122 122 124 127 126 128 127 124 124 127 128 126 130 131 129 131 130 133 133 129 131 132 134 132 138 176 183 142 132 128 156 179 143 133 135 130 127 131 132 127 129 128 123 123 115 116 122 120 121 122 125 123 124 123 122 121 120 121 125 122 121 122 121 124 126 126 126 127 127 124 123 123 123 126 124 128 128 126 121 125 131 133 126 127 129 124 186 239 245 240 239 238 239 239 166 178 193 171 122 117 129 116 136 154 129 114 121 105 146 166 151 151 158 135 147 149 171 141 169 146 139 157 125 161 142 143 156 121 138 141 154 165 171 170 168 161 169 172 169 170 166 161 137 139 160 148 170 172 37 55 31 27 28 26 26 24 22 22 24 24 23 22 25 25 24 24 24 23 25 27 27 29 33 34 33 32 32 28 25 24 23 24 24 24 24 22 23 23 24 25 25 25 27 27 25 26 27 28 29 30 31 33 32 33 34 36 40 43 48 62 131 162 160 142 135 151 193 215 223 225 186 152 131 124 147 185 220 233 236 234 228 216 208 201 187 174 163 163 160 152 146 145 143 140 136 135 140 140 143 142 138 138 143 141 143 139 141 138 138 140 138 139 140 143 138 137 133 146 151 144 149 158 157 160 155 147 149 147 141 142 148 149 155 164 190 202 218 232 245 249 250 248 250 250 184 65 38 23 19 17 17 18 28 35 32 34 22 16 17 18 18 17 21 25 29 34 33 34 37 38 43 52 57 56 54 51 45 41 38 36 36 36 35 36 34 32 33 34 36 36 37 36 36 37 38 42 47 48 51 51 50 49 49 48 49 46 47 53 55 53 55 54 50 48 48 47 47 47 48 44 41 38 41 40 40 39 38 42 44 42 42 42 42 44 43 43 43 44 47 47 41 42 41 41 43 46 43 44 44 44 44 45 46 46 45 45 44 46 44 44 44 45 45 47 45 45 44 41 41 40 40 41 40 41 40 38 41 42 45 49 55 59 61 66 76 82 95 105 116 124 138 158 168 172 197 207 210 221 231 239 245 249 248 240 228 218 207 198 189 207 237 247 243 182 178 202 152 151 159 139 155 186 174 246 250 251 251 249 208 181 175 139 195 212 156 146 120 106 121 122 124 127 125 125 129 126 125 126 126 129 128 125 119 125 125 120 123 127 127 125 125 124 123 122 123 124 122 123 131 131 125 127 131 130 129 128 129 129 127 132 127 129 130 133 134 133 136 150 154 135 133 133 129 129 133 163 190 146 131 132 133 131 128 129 125 123 118 117 124 119 122 123 124 122 123 125 123 122 122 122 121 121 117 117 124 124 123 125 126 128 128 128 129 124 124 129 130 131 124 123 122 123 126 126 122 125 129 128 169 211 240 242 241 241 242 232 162 180 194 161 120 118 126 109 140 148 118 116 113 104 146 165 173 174 172 169 128 136 147 141 170 139 155 145 133 170 130 118 177 117 151 122 152 166 163 155 152 121 157 148 155 152 145 134 150 132 156 158 168 181 67 53 36 28 26 25 26 25 23 23 23 24 24 23 25 25 24 24 23 23 25 26 25 27 32 34 33 31 29 28 27 25 23 23 23 23 24 24 24 24 25 27 24 24 25 27 26 26 26 28 30 31 32 31 32 33 34 35 37 42 46 50 91 151 152 176 213 228 225 191 152 129 128 142 181 208 232 240 234 242 241 238 245 248 243 239 234 235 229 231 231 224 216 210 197 191 188 182 176 174 168 162 159 157 153 150 151 146 145 147 153 154 146 145 149 148 148 148 147 145 149 148 147 148 153 160 163 160 165 180 183 183 187 187 206 226 243 237 228 230 232 244 250 244 238 248 200 75 39 24 19 19 18 18 26 35 32 35 23 17 17 17 18 18 20 23 28 32 32 32 33 36 41 47 54 54 56 52 46 43 39 36 36 35 35 36 33 34 35 36 37 36 37 36 36 36 40 46 48 47 51 49 46 44 43 44 43 45 44 49 53 54 53 53 50 47 49 50 47 45 44 43 40 38 42 42 39 38 39 41 42 41 39 42 43 43 42 42 43 44 44 44 42 40 38 39 39 43 42 40 43 42 43 43 42 43 43 42 44 43 40 42 43 45 44 44 43 42 41 38 36 36 34 34 34 34 34 35 35 35 36 34 37 37 40 41 41 41 44 45 47 49 53 55 58 72 106 115 106 106 116 135 162 171 175 179 193 197 195 186 178 172 182 225 240 174 180 200 144 154 167 153 153 190 162 237 246 243 230 187 150 162 182 167 193 210 164 123 109 121 124 122 121 123 123 123 126 125 130 133 129 131 129 124 121 124 120 117 124 124 123 123 122 124 127 126 127 124 124 126 129 129 127 128 128 130 130 127 128 131 126 127 127 128 132 128 129 128 131 133 131 129 130 128 128 130 130 143 149 136 131 131 128 129 127 125 126 128 126 124 123 123 123 125 125 130 126 123 122 125 124 124 122 121 116 118 123 123 123 119 117 120 126 128 124 121 125 128 128 129 127 123 125 122 126 127 122 125 135 147 132 133 161 189 217 220 221 198 165 179 196 144 127 142 125 115 135 169 104 112 106 103 151 170 174 175 173 178 150 171 159 169 175 167 163 158 149 161 147 137 165 127 142 117 175 173 157 144 138 135 146 156 153 119 156 121 164 129 150 153 169 178 97 48 43 30 25 24 26 25 24 24 23 24 24 24 25 25 24 23 23 23 24 26 25 28 31 32 35 34 31 30 27 26 24 23 23 23 24 24 25 25 24 25 24 24 26 27 26 26 27 29 30 30 30 31 31 32 32 33 35 38 43 47 61 126 154 193 221 183 144 124 132 154 192 216 239 243 235 236 239 240 235 235 234 235 236 241 240 235 235 237 241 242 235 234 237 238 227 230 237 233 227 223 229 225 217 216 216 208 193 200 204 205 202 201 205 207 205 206 208 208 204 206 208 208 218 224 229 227 228 231 235 235 239 238 235 240 245 237 238 216 203 215 237 239 233 248 208 83 42 27 20 18 16 18 26 36 33 35 24 17 16 16 18 19 21 22 29 33 34 34 33 36 38 42 51 55 56 54 49 43 40 39 38 36 36 35 36 36 36 37 37 37 37 38 38 39 43 49 50 48 50 49 46 44 43 45 44 45 45 47 49 52 52 51 50 49 52 52 50 48 44 43 40 38 40 41 40 38 38 41 42 41 39 39 40 39 38 40 40 42 43 43 40 39 37 36 36 38 37 38 40 38 38 39 40 39 40 40 43 42 41 41 42 43 44 42 42 42 43 40 38 36 36 34 33 33 34 34 34 32 32 32 33 32 33 32 35 35 37 36 38 41 43 46 46 47 47 50 51 54 56 57 69 78 93 105 111 118 138 157 170 168 160 167 212 164 182 195 141 154 193 161 151 187 160 227 247 237 183 154 146 154 181 166 199 208 172 114 123 130 125 123 121 121 123 128 131 127 125 126 126 129 131 129 130 128 126 123 123 126 125 126 126 125 128 127 125 125 125 128 129 126 126 128 130 130 131 128 128 130 129 127 127 127 131 126 127 126 129 130 131 129 127 130 126 129 132 131 126 127 127 128 126 128 127 123 127 129 129 128 123 129 130 128 128 130 128 126 124 125 122 121 124 121 120 123 125 124 121 116 118 122 123 125 124 125 128 129 127 130 128 126 125 127 127 124 125 125 163 213 193 175 158 153 152 150 144 134 172 182 197 134 146 147 138 125 105 170 120 113 104 110 158 174 172 172 174 175 173 165 164 174 176 176 176 174 173 175 170 175 171 163 154 150 158 161 139 153 162 160 136 142 149 125 157 114 166 124 170 163 160 167 135 47 45 31 24 24 25 24 25 24 23 24 24 24 25 25 24 23 24 26 25 25 24 26 27 29 34 34 31 28 26 25 26 25 23 24 23 24 25 24 23 23 22 24 27 25 24 26 27 28 28 28 30 33 32 32 32 32 33 35 39 47 46 78 155 158 131 128 148 177 226 238 238 239 238 239 239 238 238 235 232 234 236 236 239 238 244 243 243 240 243 243 239 241 240 234 233 230 247 244 238 239 243 239 241 240 240 242 240 238 239 237 242 238 242 245 245 244 246 243 235 237 241 242 244 247 240 241 241 238 236 239 240 242 238 238 236 236 239 236 229 230 233 234 230 235 209 83 46 28 18 17 19 19 27 37 34 35 25 17 17 17 18 18 20 21 27 32 32 32 35 37 37 41 49 54 53 54 52 46 41 39 40 37 37 35 36 35 35 36 36 38 39 42 43 43 47 50 49 49 47 46 44 44 42 42 42 44 45 45 46 50 50 50 49 50 49 50 49 47 43 42 41 39 40 40 38 36 35 35 35 35 35 35 35 36 34 35 35 36 35 35 35 35 34 35 34 33 33 34 34 33 33 33 34 35 34 35 37 40 40 41 42 42 43 42 39 38 39 39 38 36 33 34 34 34 34 34 32 30 31 31 31 33 33 30 32 31 32 32 32 34 36 37 37 39 39 41 40 42 46 47 47 47 44 46 49 60 72 76 96 114 134 142 146 150 184 195 132 151 218 170 141 187 158 206 209 170 144 148 148 154 179 162 192 204 180 138 133 131 132 129 123 123 127 131 133 129 127 131 134 132 131 134 135 128 126 132 130 128 124 129 130 126 127 126 130 130 124 127 131 129 131 131 134 133 137 136 127 129 135 136 140 140 138 135 134 135 130 133 139 138 141 138 136 132 132 134 135 132 135 142 127 131 129 126 124 125 123 123 126 126 126 127 129 128 126 127 126 125 127 126 125 122 122 123 124 122 124 123 127 125 127 128 125 126 126 126 128 131 132 129 127 130 129 123 129 125 200 237 225 219 203 184 158 132 131 127 175 183 192 124 159 139 140 128 113 187 129 123 119 118 156 178 173 174 175 175 175 177 176 176 177 175 175 176 174 173 175 175 177 175 173 172 172 171 171 171 168 171 161 166 160 154 157 142 152 139 157 154 135 161 154 53 47 34 26 25 24 24 26 26 24 24 25 25 25 23 23 23 24 25 25 26 26 26 27 31 33 33 31 28 26 24 24 25 24 25 23 23 24 24 24 24 23 25 27 26 26 26 26 28 28 29 31 30 33 33 32 32 32 32 37 42 45 56 133 162 159 198 220 235 245 238 237 244 233 237 234 238 239 237 235 240 239 238 239 236 235 238 241 242 240 239 242 236 232 237 240 235 243 241 240 247 245 241 241 237 243 242 234 238 240 237 243 240 238 240 239 240 242 239 240 241 241 238 242 244 241 241 240 239 246 243 243 240 238 242 246 244 235 239 239 238 241 242 242 238 206 84 45 27 20 18 18 19 26 38 35 35 28 17 16 17 18 17 18 21 25 31 31 33 34 34 36 40 46 53 54 54 52 48 42 39 38 36 36 35 36 36 36 37 36 38 41 44 45 46 49 49 48 48 47 47 44 43 42 39 40 43 44 42 47 48 49 49 48 49 48 47 48 47 45 43 40 37 34 35 35 34 32 32 32 32 32 31 31 32 32 31 30 30 31 31 32 33 33 32 32 33 30 32 32 32 32 32 33 32 32 33 32 35 39 41 41 42 42 41 40 37 36 36 35 32 31 31 31 32 31 30 27 30 32 32 30 32 33 31 31 33 34 36 35 35 35 37 36 38 42 41 43 43 45 47 45 41 41 39 38 41 44 52 76 79 92 107 133 140 176 195 129 161 227 177 138 180 160 165 162 150 148 148 148 150 174 166 186 203 183 148 133 133 130 126 120 122 126 129 126 125 130 130 132 136 134 132 132 125 125 128 131 131 127 129 129 127 128 127 129 129 126 130 136 136 134 128 140 150 159 160 152 154 157 161 163 160 158 157 156 156 153 156 156 153 154 153 154 153 152 154 158 158 164 170 129 129 129 127 130 132 126 129 129 123 124 126 129 130 126 125 127 129 128 128 123 126 128 128 126 123 129 130 132 128 127 128 125 126 125 123 125 126 136 132 129 130 130 123 125 127 156 170 159 158 153 146 145 155 174 149 175 183 186 117 167 171 128 124 126 193 127 129 128 123 159 177 177 173 175 175 176 176 176 178 176 176 178 175 175 174 177 174 176 176 173 171 172 173 174 172 174 175 174 173 175 173 173 168 167 172 172 171 170 171 169 71 48 33 28 25 23 24 25 27 24 23 23 24 24 23 23 23 23 24 25 26 26 25 28 30 31 31 32 30 26 25 23 24 25 25 23 24 24 24 23 23 24 24 24 24 26 27 26 26 28 30 33 33 35 34 33 32 31 30 32 37 44 46 92 151 172 230 232 242 241 229 230 240 233 237 241 237 240 244 237 237 238 238 240 237 241 238 234 236 240 241 238 240 241 239 236 240 242 236 233 239 241 239 245 242 237 237 237 238 238 238 244 239 237 235 240 242 233 239 237 242 238 237 242 245 242 237 238 240 241 240 239 239 238 246 242 235 240 245 237 241 240 240 238 240 211 88 50 29 21 18 18 20 27 38 35 34 31 17 18 17 17 16 17 21 25 29 29 32 33 33 35 38 42 49 56 55 54 51 45 38 37 37 34 35 36 35 34 36 36 38 42 45 46 48 49 49 47 46 47 48 45 42 40 40 41 41 42 41 42 43 47 47 45 47 46 46 49 50 47 41 37 34 33 35 34 32 32 31 30 29 31 32 31 29 29 27 29 29 30 30 29 29 31 31 31 31 30 31 30 31 31 31 31 31 31 30 34 34 38 40 39 42 40 41 38 36 35 33 31 29 29 28 29 28 27 27 27 30 30 32 29 31 31 33 31 32 33 36 37 38 39 40 41 42 44 44 46 47 49 49 49 49 43 37 35 32 34 38 45 51 62 77 97 122 145 180 124 168 230 182 144 171 172 144 156 156 151 149 149 147 164 171 179 202 181 148 130 126 125 123 123 123 123 127 125 124 130 130 128 133 135 125 130 132 132 135 137 129 121 122 126 125 126 128 131 132 130 128 135 135 130 127 141 142 136 140 127 130 133 131 130 133 128 127 132 131 132 128 128 127 124 128 124 122 124 125 125 127 128 132 128 128 129 129 130 134 131 128 129 127 125 129 126 128 124 127 130 126 125 126 129 132 132 134 133 128 132 133 134 128 127 127 124 129 130 125 130 131 132 133 131 130 131 127 132 150 172 190 206 216 222 228 233 239 236 176 180 185 181 121 167 148 141 118 147 182 126 130 122 130 158 180 182 173 175 176 175 175 176 176 176 176 177 175 174 175 175 175 175 176 175 173 172 171 172 173 175 174 173 172 175 175 173 171 169 170 172 172 170 172 174 99 45 39 30 24 24 25 26 27 25 24 24 24 24 23 23 24 25 25 25 25 24 25 28 29 31 32 33 31 26 25 24 24 25 25 24 24 24 24 23 23 23 23 24 24 25 27 27 28 28 30 33 34 34 34 34 33 33 30 30 34 43 43 69 134 162 204 242 245 239 232 237 238 238 240 240 238 242 239 240 243 240 242 242 234 235 239 239 238 241 240 237 239 243 243 241 241 239 237 235 237 242 237 237 237 241 246 240 241 243 236 243 242 236 236 238 239 237 239 240 242 241 241 241 238 239 238 238 243 242 237 239 242 236 240 237 241 241 241 236 234 239 237 238 238 214 89 51 29 21 19 18 21 26 37 33 33 37 19 17 17 17 17 18 21 24 28 31 33 34 34 35 37 41 49 56 56 55 54 47 41 39 38 36 35 35 36 36 35 37 39 42 44 46 47 48 49 48 47 46 46 49 46 43 41 40 41 39 38 40 42 45 45 46 46 46 45 46 45 44 40 38 34 32 33 34 34 32 31 30 29 29 29 29 29 28 28 27 27 28 28 28 28 30 30 29 29 31 32 30 31 32 30 31 33 31 30 33 34 36 37 39 40 39 38 37 34 33 32 31 29 29 29 31 31 28 27 27 29 30 30 29 29 29 32 30 28 29 30 32 34 34 38 39 41 42 43 45 47 48 48 49 50 48 44 39 35 32 34 38 43 46 56 76 95 126 144 129 184 244 192 142 160 179 140 157 152 148 147 149 153 154 169 178 199 193 152 127 122 124 124 127 131 132 129 128 134 133 130 128 130 130 124 128 129 133 131 135 129 123 124 130 131 129 127 131 133 130 132 135 133 128 131 137 135 135 141 132 132 132 130 128 131 131 126 132 136 138 132 131 131 126 128 128 129 131 130 129 127 130 128 129 133 136 133 131 129 126 124 126 125 125 124 123 130 127 125 128 127 124 126 133 134 126 126 131 134 135 134 127 125 126 130 127 130 132 131 128 127 129 130 133 133 136 126 163 222 235 245 238 237 246 245 246 247 239 179 177 187 176 119 200 173 178 119 166 181 126 130 122 132 163 187 170 175 170 156 167 170 173 176 175 176 174 152 145 160 174 174 175 176 174 173 172 171 173 172 175 176 176 171 177 174 177 173 169 167 172 172 172 173 177 139 38 44 29 26 26 25 25 26 25 25 24 23 22 22 24 25 24 23 25 25 26 25 27 30 31 33 33 32 27 26 23 24 25 25 24 24 23 24 23 23 23 23 25 26 26 27 27 27 27 29 32 34 33 34 33 33 32 30 31 32 38 41 51 93 162 173 239 239 234 233 236 236 239 240 237 245 241 241 239 238 236 235 237 236 240 238 238 239 241 242 238 239 234 234 239 239 237 234 236 240 237 234 238 236 239 241 237 237 238 238 239 242 240 244 241 240 240 240 240 239 240 244 240 238 238 240 242 245 246 245 246 245 244 243 239 243 247 241 237 236 241 241 241 241 223 96 50 29 21 19 16 20 27 36 35 33 40 19 16 15 18 19 21 21 24 28 30 33 32 33 34 36 39 45 56 57 54 53 50 43 39 38 38 36 37 37 35 35 37 41 44 45 45 47 47 46 49 47 48 48 49 47 47 47 44 43 41 38 39 41 43 45 46 46 46 46 44 43 42 40 38 36 32 31 33 33 31 30 29 29 29 29 29 29 28 27 29 28 29 28 27 28 29 30 29 27 30 31 29 29 32 30 29 31 31 30 32 32 35 37 38 39 39 36 35 34 32 32 31 28 29 28 27 28 28 27 26 28 31 29 27 27 27 29 28 27 27 28 28 31 32 32 37 38 42 45 48 48 50 49 50 50 52 52 46 41 34 32 30 39 39 40 48 67 83 108 141 196 243 198 148 151 188 140 154 149 147 141 144 150 134 161 173 195 204 153 132 126 123 124 129 135 138 133 139 142 139 132 127 125 132 137 132 133 130 132 134 133 133 135 138 138 138 138 143 138 130 126 126 129 132 133 132 130 131 136 132 128 127 130 133 135 133 130 131 134 138 133 131 131 125 130 129 129 130 132 127 125 124 128 129 130 136 134 129 127 127 125 123 122 126 124 123 123 124 123 125 129 131 130 132 130 125 128 132 129 124 126 128 126 123 130 130 128 130 130 130 131 130 124 124 133 129 133 213 246 247 247 236 233 239 247 247 245 232 175 177 191 164 122 219 191 188 119 178 176 132 132 128 133 166 192 156 175 170 136 159 156 159 177 168 173 170 98 131 116 159 174 173 174 175 173 173 174 174 174 177 177 177 175 174 176 176 174 170 167 172 171 171 171 176 165 44 51 31 28 27 26 25 24 24 24 22 22 22 22 24 25 25 24 25 25 27 27 27 27 30 32 32 31 26 25 24 23 25 26 25 23 23 24 24 23 24 23 25 25 25 26 27 27 28 29 31 33 33 32 32 32 32 31 31 32 36 43 46 69 154 164 209 237 242 241 244 243 239 242 240 243 238 241 242 240 236 234 244 244 245 242 238 237 237 236 236 240 240 244 240 242 242 241 244 242 236 243 238 235 241 243 239 238 240 243 243 243 245 243 241 242 241 241 241 241 243 244 244 242 243 248 244 241 238 239 236 240 243 243 242 245 247 242 236 244 247 243 249 243 223 100 51 33 21 19 16 19 26 34 36 33 37 19 16 17 18 20 22 22 24 27 30 31 32 33 36 39 38 44 56 58 56 55 51 43 39 38 37 37 36 36 35 35 39 43 46 45 44 46 44 44 47 46 48 47 48 47 47 47 46 45 43 40 40 40 42 45 45 47 46 44 44 43 43 40 37 36 34 33 33 32 30 31 30 28 29 28 28 28 30 27 27 28 29 28 27 28 28 28 28 28 29 30 30 30 30 29 29 31 30 29 30 30 33 36 37 39 39 37 34 33 31 31 28 28 30 28 27 28 26 27 27 27 30 28 26 27 28 29 27 26 26 27 28 29 31 31 34 35 39 43 47 47 48 47 49 51 51 50 50 46 39 34 29 34 39 35 39 45 61 78 124 202 212 188 156 140 187 143 153 152 147 146 151 147 123 152 171 192 206 160 140 135 129 125 130 135 141 138 146 144 133 133 131 127 132 135 131 125 128 133 133 132 137 137 139 143 144 138 142 141 130 128 131 134 136 133 126 126 129 137 137 134 134 137 138 137 136 131 132 136 134 136 135 132 130 131 130 128 130 132 127 126 127 128 127 126 132 133 128 126 127 126 128 129 128 127 126 126 119 116 119 122 126 128 129 129 125 130 130 127 127 130 132 129 124 128 128 132 134 132 137 135 133 132 128 132 138 160 241 246 247 243 241 236 237 246 250 247 223 171 179 194 153 132 225 193 189 124 187 173 129 135 130 138 171 193 130 178 174 141 165 152 151 182 132 142 174 99 172 168 160 175 173 167 164 171 173 173 174 172 175 175 176 174 176 175 175 175 160 163 168 171 171 170 171 180 76 48 38 29 27 27 26 26 25 23 23 24 24 23 25 24 24 24 25 25 26 26 27 28 31 31 32 30 26 25 25 24 23 26 25 24 25 24 26 24 23 22 23 25 25 27 28 29 28 28 29 32 31 29 28 29 32 33 33 32 34 37 41 53 114 164 166 164 191 198 186 179 197 219 239 241 245 244 239 240 245 241 242 242 248 242 242 239 242 247 248 245 236 235 237 237 237 238 240 239 236 240 239 240 242 237 237 239 241 240 241 241 240 239 236 242 236 239 240 236 234 240 242 238 237 244 240 242 246 244 242 243 240 240 237 237 239 244 244 244 242 239 247 244 226 107 51 33 21 19 17 17 25 36 34 31 37 20 16 15 18 19 19 22 24 25 31 32 35 36 36 37 38 43 52 56 55 53 52 46 41 41 38 37 37 36 36 37 39 43 45 45 43 44 43 44 45 46 47 46 46 45 45 46 45 47 45 43 40 38 39 41 44 46 45 45 45 44 45 40 35 34 33 32 32 31 29 30 29 27 28 28 28 29 29 27 28 27 27 27 27 28 29 28 27 28 28 29 30 30 30 30 29 26 27 28 29 31 36 36 38 38 38 37 33 30 29 28 28 28 28 27 27 27 26 27 27 29 31 28 27 26 27 30 27 27 25 26 28 27 29 30 30 32 36 40 45 48 49 49 50 51 53 52 49 49 46 38 30 29 35 38 33 36 42 54 94 139 149 173 167 134 184 159 150 154 149 152 149 133 122 146 173 189 204 170 140 137 135 131 132 133 132 133 142 148 137 136 135 132 128 132 127 125 127 130 136 134 145 142 133 137 134 132 137 135 130 138 141 137 133 127 125 132 138 142 144 139 135 141 145 142 131 128 138 132 135 133 135 138 133 131 130 130 131 132 132 135 130 129 132 130 133 132 126 126 130 133 132 131 130 129 133 130 122 118 117 117 122 124 120 119 125 126 121 123 125 126 123 124 124 126 131 135 128 129 132 126 130 131 127 133 157 214 242 236 247 244 241 241 241 247 245 242 211 169 186 201 135 145 234 199 188 127 196 174 126 137 128 139 174 191 108 174 174 170 175 165 152 155 132 136 172 131 141 179 152 171 178 150 149 154 136 149 169 153 164 167 171 172 172 175 176 156 100 143 166 123 120 158 172 176 108 46 40 31 26 26 27 27 25 24 24 25 26 25 25 23 25 24 23 25 26 26 27 29 30 30 32 30 26 25 24 22 21 25 26 24 26 24 24 23 23 22 23 26 25 25 27 28 27 29 29 30 29 29 28 29 30 32 33 32 34 37 41 47 82 152 173 146 130 137 127 122 132 148 171 192 197 201 216 228 236 234 237 238 240 240 238 238 238 246 247 248 237 235 232 227 227 232 239 247 246 246 239 237 237 238 244 240 243 239 243 243 241 239 241 239 236 236 232 235 244 240 238 234 233 239 240 246 244 243 244 245 245 244 242 245 245 244 246 245 246 247 248 246 229 111 51 31 20 18 17 18 24 35 33 31 41 20 17 17 17 19 21 22 24 25 29 32 32 34 34 37 38 41 51 55 55 52 53 47 41 40 40 37 38 37 36 37 40 43 43 45 42 44 43 45 44 47 47 46 46 45 44 45 45 46 44 42 39 37 39 41 43 46 47 46 45 45 44 39 35 33 33 32 32 30 29 30 30 29 28 30 30 30 30 30 30 29 26 27 28 28 28 28 28 28 27 28 27 28 29 29 29 28 29 28 29 31 35 36 36 37 38 37 33 30 30 27 27 27 26 26 28 27 26 26 25 28 29 28 27 27 28 29 27 27 26 26 27 28 28 30 30 32 34 37 44 48 48 49 51 51 53 52 52 50 47 45 33 26 29 39 33 31 38 44 75 118 147 166 176 137 175 167 146 152 151 155 135 123 131 138 169 182 206 180 136 136 138 139 128 122 127 127 130 126 129 130 132 136 134 131 137 136 137 138 138 146 150 150 140 138 134 134 138 142 133 140 136 132 127 127 129 134 140 143 146 138 133 140 144 144 138 136 140 133 134 136 138 136 133 131 127 131 132 133 132 132 128 131 130 131 133 135 133 131 140 141 135 132 130 128 139 134 127 125 121 120 124 120 116 122 131 128 124 123 119 125 130 128 130 132 126 125 129 138 134 127 123 123 126 140 199 239 239 234 231 233 241 241 240 242 242 245 200 166 190 205 127 155 240 201 188 129 201 173 130 137 128 137 176 183 84 162 174 178 176 176 176 174 171 173 168 175 130 110 114 169 176 160 135 151 140 170 137 151 142 154 130 148 141 149 174 165 107 114 168 115 125 152 175 173 146 61 46 32 27 26 25 25 25 26 25 25 24 23 24 24 24 24 26 25 25 25 26 28 30 33 31 29 30 25 25 23 23 24 24 24 24 24 24 24 25 23 23 23 23 25 25 28 26 28 29 29 28 28 27 27 29 31 31 32 33 34 39 44 59 122 169 163 128 119 115 119 124 125 121 120 120 121 124 129 132 132 141 146 152 167 180 192 203 210 224 229 243 245 244 244 241 239 239 236 230 226 235 241 238 242 238 238 245 240 242 247 244 243 244 244 240 236 238 236 236 235 238 243 247 243 237 244 239 237 243 241 245 244 241 244 247 249 247 245 241 243 246 242 238 124 54 38 22 18 18 19 23 32 34 31 39 21 16 17 18 20 23 24 23 25 29 32 32 32 34 35 37 40 47 53 53 52 50 48 41 39 39 38 38 36 36 35 39 42 44 44 43 43 43 43 44 43 44 46 45 43 44 44 44 42 39 40 39 39 39 40 44 46 46 46 45 44 41 40 37 34 33 31 31 29 29 28 29 28 28 28 29 29 28 29 28 27 27 27 27 27 27 28 28 28 28 27 25 26 26 28 29 29 28 28 30 29 34 35 37 36 37 36 31 29 31 28 28 27 27 26 25 24 24 25 26 28 29 28 26 27 29 29 27 26 27 26 26 27 28 29 29 32 33 36 40 44 47 48 49 50 48 50 51 51 50 49 39 29 25 31 34 30 30 41 49 94 136 149 183 138 159 182 138 148 147 143 132 137 137 135 159 172 203 199 137 141 133 132 133 130 140 142 140 136 138 134 140 144 136 131 147 144 135 143 137 133 140 154 148 136 132 137 140 142 135 135 131 130 132 131 132 135 141 138 139 137 135 136 139 139 134 135 142 136 135 139 141 141 140 133 128 128 133 134 137 137 133 131 130 132 134 135 137 137 140 136 130 130 130 131 140 131 126 128 128 132 137 128 124 132 135 128 130 131 129 133 139 137 130 128 122 128 122 126 132 132 130 132 156 208 236 245 237 230 230 228 243 237 235 243 246 247 195 163 193 201 117 172 241 201 186 135 206 170 128 136 126 142 177 178 66 151 175 177 177 180 177 176 176 177 177 177 172 165 169 175 178 174 160 180 143 151 134 154 146 172 144 146 172 150 164 174 148 100 179 142 116 99 174 174 166 84 53 35 28 27 27 25 25 26 26 26 26 24 24 24 25 26 26 24 24 24 27 27 30 30 31 31 29 27 25 25 23 24 23 24 25 24 25 25 25 23 23 22 23 25 26 28 27 28 30 30 28 28 27 27 28 29 29 31 32 32 36 39 47 76 161 167 133 115 115 121 125 125 128 127 124 121 119 119 122 130 131 130 124 127 128 128 133 141 141 149 178 191 202 210 212 223 239 226 234 239 242 241 235 242 244 245 243 245 240 244 239 237 238 241 243 241 242 241 241 241 247 250 245 239 238 238 241 243 246 247 246 241 244 245 243 247 243 244 242 243 243 239 236 127 54 41 22 17 17 17 22 33 33 30 39 21 17 17 17 19 21 22 24 25 28 30 31 31 33 35 36 38 45 52 53 51 49 50 45 41 40 39 36 36 36 35 39 42 43 43 43 43 43 43 44 43 44 44 45 47 47 47 44 42 40 39 39 40 40 40 43 46 46 46 45 44 42 39 36 35 33 30 31 29 28 28 29 29 28 28 28 27 28 28 27 26 26 26 27 27 27 27 27 27 27 28 27 27 26 27 29 29 30 29 29 29 32 34 36 36 37 35 32 29 31 30 27 27 27 26 25 24 25 23 24 26 29 27 26 26 28 28 28 27 26 25 27 28 28 29 31 32 32 35 37 43 47 47 48 50 48 49 50 50 51 51 45 36 27 28 36 30 29 33 42 66 126 148 179 147 151 185 133 147 137 128 135 139 141 139 153 162 198 206 139 141 137 136 133 134 137 137 138 131 137 142 138 139 136 133 143 140 134 137 135 134 140 149 146 144 139 138 135 132 136 146 138 128 131 132 136 139 141 141 134 132 134 137 136 135 136 134 136 136 140 141 142 142 140 137 134 130 133 133 138 141 139 139 139 138 140 137 137 137 133 129 131 128 132 138 138 138 138 133 126 131 141 137 132 129 127 129 134 138 137 136 134 132 136 141 132 132 129 137 136 133 143 178 218 236 238 238 246 245 243 239 244 246 241 246 245 249 191 166 192 195 116 187 234 194 187 145 210 169 125 133 123 148 177 175 54 124 178 175 178 177 178 178 177 178 176 178 179 177 176 176 178 179 177 177 174 170 174 169 156 171 164 172 153 142 164 174 167 103 177 154 140 77 165 172 175 119 60 40 29 28 26 25 26 26 26 25 23 24 25 24 25 25 25 25 25 25 27 29 29 29 30 29 28 29 25 27 25 23 23 24 25 24 24 25 24 24 23 23 23 24 27 27 27 27 31 30 29 28 27 28 28 27 27 30 31 32 33 38 44 46 130 169 150 126 114 114 116 118 117 118 119 120 118 120 116 115 117 115 114 111 113 117 121 121 124 125 125 123 124 125 126 130 142 154 169 187 201 204 215 223 228 233 244 246 235 236 240 235 235 236 243 245 244 245 244 245 242 238 240 240 239 244 244 242 237 240 241 245 250 248 243 245 248 246 242 244 242 246 247 140 50 34 21 17 17 17 21 32 34 31 41 21 18 18 16 19 21 22 24 25 28 32 30 32 34 35 35 39 43 51 53 52 51 49 45 42 39 38 37 38 35 35 38 41 43 43 44 43 44 46 45 45 44 44 44 44 44 45 44 42 40 40 39 40 39 39 42 45 46 45 43 43 42 39 37 35 32 31 31 30 29 28 29 29 28 28 27 26 27 27 27 28 27 27 27 25 26 26 28 28 28 28 29 29 29 30 28 29 30 29 29 29 30 33 36 36 37 35 32 30 31 30 27 25 26 25 26 25 25 23 27 27 28 27 27 25 28 28 28 28 26 26 27 27 28 28 30 28 31 33 38 43 49 48 46 46 47 48 51 50 51 51 49 44 33 28 33 33 29 27 37 45 102 138 171 153 142 184 139 147 111 126 137 139 143 143 147 162 194 202 143 141 140 144 141 135 132 133 137 143 141 134 131 138 146 146 143 139 141 137 134 135 138 144 147 141 138 133 135 131 133 135 140 141 139 137 136 136 141 139 139 137 136 135 137 134 136 137 140 138 141 138 145 145 144 143 139 133 132 131 135 137 139 142 139 138 140 134 130 127 130 127 129 133 136 136 133 130 132 136 133 131 138 137 131 123 130 137 132 131 132 132 132 140 143 139 136 136 140 144 158 176 204 229 243 239 236 238 238 239 248 249 239 237 243 238 238 244 172 169 192 182 121 199 238 195 187 158 209 166 133 137 125 147 173 169 51 94 183 175 178 179 177 178 180 178 176 179 178 178 177 176 176 178 179 178 178 177 177 177 179 175 176 175 171 173 174 175 172 153 174 173 134 127 169 170 175 148 58 45 30 28 25 26 26 25 25 25 23 24 25 24 25 24 25 25 23 23 27 28 30 30 29 29 29 29 25 26 23 23 23 24 25 24 24 24 25 26 24 24 23 24 26 27 26 27 31 30 29 28 26 28 28 28 28 28 30 33 32 35 40 45 92 164 157 133 108 112 112 110 108 109 114 115 115 113 111 109 106 110 115 113 111 118 117 118 120 124 125 128 128 129 126 123 120 123 126 129 132 133 135 142 146 160 195 224 234 233 234 238 234 229 236 239 246 246 243 243 243 246 249 246 246 246 247 245 243 245 242 243 246 246 244 241 243 243 246 247 242 240 240 141 48 30 21 19 18 18 23 32 34 30 40 22 16 16 16 18 20 21 23 24 28 32 30 30 32 34 36 38 41 50 54 53 51 50 46 43 40 37 38 37 36 37 38 40 43 44 43 42 43 46 45 45 44 44 43 44 45 43 41 41 39 38 38 39 38 38 41 43 44 44 43 42 41 39 34 35 32 31 31 31 30 28 29 29 27 27 27 27 27 27 27 27 26 25 27 25 26 25 27 26 26 27 27 28 27 27 29 30 30 29 29 30 29 32 36 36 35 34 32 31 30 28 26 26 25 25 26 26 24 24 26 25 27 27 28 26 28 28 28 28 27 28 27 26 27 29 30 30 32 33 37 44 48 47 47 47 48 47 49 50 51 50 49 47 38 29 29 34 29 26 34 41 79 129 170 160 137 180 149 130 111 133 140 143 143 142 146 164 192 202 151 147 146 145 136 131 128 129 134 140 136 131 131 133 140 143 141 144 144 133 129 134 135 142 145 140 135 140 142 137 142 143 143 141 136 134 136 136 142 141 141 140 142 138 140 136 133 137 145 143 145 148 149 147 145 148 142 141 137 131 139 139 137 138 136 135 134 129 131 133 129 127 133 141 130 137 136 137 138 141 140 134 135 138 135 132 130 134 131 132 131 129 133 138 137 141 137 138 152 177 214 230 227 239 245 240 239 240 241 246 249 242 235 237 237 238 240 237 155 174 191 170 127 211 240 202 184 168 210 164 139 139 131 147 176 157 49 69 175 175 177 177 179 179 179 178 179 178 180 179 177 176 177 178 179 180 180 178 178 177 177 175 175 176 175 177 176 176 176 172 175 176 175 172 169 171 169 170 64 48 34 30 27 24 25 25 25 25 25 24 24 25 25 23 24 25 23 25 27 29 28 28 30 31 28 28 27 26 25 24 22 23 24 23 25 26 25 25 25 26 24 24 26 27 27 27 28 27 26 28 28 29 29 27 28 27 30 30 31 32 39 44 61 134 160 151 112 108 113 109 107 109 114 113 108 111 114 113 112 110 109 110 115 118 112 112 114 114 115 114 118 117 115 116 113 114 118 120 125 126 125 123 123 125 123 129 139 145 150 156 163 171 188 197 211 222 232 241 237 239 243 243 245 243 241 238 240 241 242 249 240 240 242 244 243 242 245 241 243 239 240 140 50 33 20 18 18 18 21 30 35 32 38 21 17 17 16 17 17 19 22 24 27 31 32 31 31 34 35 37 41 49 54 54 52 52 49 45 41 38 40 39 37 38 39 40 41 43 42 42 44 45 44 44 44 44 45 43 42 41 40 39 36 36 37 38 37 37 41 43 45 45 45 42 41 39 35 34 31 32 30 30 30 28 28 28 27 26 27 27 26 25 25 24 26 25 26 25 26 26 26 25 25 25 27 27 28 28 28 29 29 29 29 30 30 33 36 37 35 34 32 31 31 28 26 27 25 26 26 28 26 27 25 26 28 27 25 26 27 28 28 27 27 28 28 27 28 28 29 31 31 32 37 45 48 47 47 45 48 48 47 47 50 50 50 49 46 36 29 32 30 26 29 39 53 106 168 165 139 168 159 135 135 141 142 139 142 146 150 157 183 198 171 151 150 146 136 134 134 135 138 136 130 135 135 132 143 142 137 141 145 147 142 140 142 140 136 137 140 139 141 139 140 137 140 138 135 145 144 138 140 142 144 141 142 146 143 137 136 133 135 139 141 144 140 138 137 138 147 146 144 139 134 131 137 150 142 133 134 133 133 139 142 139 141 140 138 143 136 133 135 142 142 134 136 141 137 136 135 135 137 139 139 129 134 144 152 159 179 199 224 238 248 242 235 235 241 248 246 243 239 243 239 236 247 244 237 243 247 231 150 180 194 158 135 220 230 198 183 172 210 162 131 125 132 146 178 148 46 55 154 177 177 175 177 177 178 178 180 179 178 178 178 177 176 175 177 179 180 177 177 178 177 175 174 176 176 177 177 178 177 172 175 176 176 174 172 172 170 175 75 46 38 29 26 25 25 26 25 25 24 24 23 24 25 23 23 24 26 26 28 28 28 30 32 32 29 28 27 27 25 24 24 23 23 24 25 25 23 24 25 24 23 25 26 26 27 27 27 28 28 28 29 28 27 26 27 27 27 29 31 31 36 44 47 99 164 157 130 108 114 112 112 111 110 110 109 108 107 111 114 109 105 107 113 114 113 114 113 112 110 110 113 116 120 118 117 119 121 118 123 123 121 118 119 120 123 124 122 124 126 127 126 128 129 133 139 141 155 171 184 200 218 224 233 239 240 245 248 244 244 243 239 238 236 246 245 240 246 243 238 242 245 138 49 32 20 19 18 19 20 30 36 30 39 20 17 19 16 16 18 19 22 26 28 31 32 32 32 33 36 37 40 47 54 55 54 55 52 48 42 42 39 38 37 38 38 39 41 43 43 45 43 42 43 45 44 44 45 44 42 39 38 38 35 37 36 37 35 36 39 43 44 44 44 43 40 39 34 35 32 32 32 30 29 29 28 28 29 28 27 28 28 28 25 24 26 25 26 24 26 26 27 27 26 28 27 27 27 28 27 27 27 27 27 28 28 32 35 36 34 32 30 32 30 27 26 26 26 26 27 26 26 27 27 27 28 27 25 26 27 28 28 26 25 27 28 27 27 27 29 31 30 32 36 45 49 48 47 45 46 47 47 46 46 48 50 49 49 42 29 30 31 27 28 37 42 87 156 174 136 157 164 143 137 138 144 143 146 143 143 156 178 198 187 144 148 153 150 146 148 149 146 146 142 143 143 141 147 141 139 145 147 150 147 142 142 141 148 149 147 140 141 136 138 135 134 136 138 142 142 141 141 139 146 139 139 148 146 139 136 136 134 133 140 141 143 143 140 145 148 144 141 141 143 148 145 144 138 137 135 132 133 139 142 139 140 137 139 140 140 144 146 147 143 137 139 137 138 135 137 139 145 145 141 140 160 183 210 228 236 238 240 235 240 239 247 246 239 245 242 236 243 242 243 241 244 240 233 235 247 230 154 181 200 143 146 229 208 196 182 174 207 159 135 130 132 150 179 144 45 47 121 177 178 178 174 178 179 179 178 179 178 179 179 177 176 175 176 177 179 179 175 175 175 175 176 176 177 177 176 176 177 172 174 175 175 176 173 172 169 171 108 40 40 29 28 25 24 25 24 24 24 23 22 24 24 24 24 23 25 25 27 27 27 29 31 30 28 27 27 27 25 24 25 25 27 27 26 25 25 25 26 25 25 24 24 25 26 26 28 28 30 29 27 28 26 27 26 25 26 27 30 32 33 40 46 58 150 160 146 116 114 114 108 109 114 113 109 109 108 111 114 112 109 114 117 113 112 115 114 116 113 115 116 118 116 118 120 119 116 117 120 122 118 118 118 118 119 120 120 118 119 121 122 121 120 121 125 122 127 128 124 124 128 131 139 149 164 184 203 215 224 234 233 235 236 246 243 240 245 237 238 240 240 141 50 32 20 18 20 19 19 27 34 30 41 23 18 17 17 16 18 20 23 26 29 30 31 31 34 32 35 37 39 46 54 55 53 52 49 45 41 40 39 38 37 38 38 39 42 43 43 44 43 43 43 43 43 42 41 42 40 39 37 38 37 36 34 35 36 35 36 41 42 41 41 42 38 38 35 32 32 31 32 30 28 28 28 29 29 26 26 27 27 26 25 25 26 26 26 26 25 26 27 26 25 28 27 26 26 26 26 26 27 28 28 28 28 31 34 35 34 32 30 31 31 28 26 26 27 25 27 25 25 25 26 27 28 28 27 25 26 26 27 27 26 27 27 25 27 28 29 31 30 32 36 46 48 46 47 47 46 45 47 47 47 47 50 50 49 45 34 25 31 27 26 31 41 58 136 175 134 141 175 141 140 137 141 139 137 138 140 155 176 196 198 147 156 152 146 146 155 156 152 145 142 142 143 147 146 144 145 147 147 152 147 145 141 142 145 145 145 140 139 137 134 132 131 130 136 141 143 141 141 144 148 144 137 137 142 139 142 141 145 147 146 149 149 150 145 143 147 145 142 144 145 147 145 143 139 143 140 140 144 149 142 140 146 142 142 145 134 137 144 147 141 138 138 138 143 142 144 142 144 158 186 216 231 237 241 243 237 238 236 238 239 237 246 247 240 235 236 236 247 245 245 246 241 245 247 243 244 214 156 186 194 129 162 216 159 189 186 173 208 152 138 136 132 153 179 130 45 45 86 134 159 173 180 179 177 178 177 179 178 178 177 177 176 175 177 175 177 178 174 175 173 174 175 176 175 176 176 176 176 173 172 175 175 173 174 173 170 169 135 49 41 30 29 25 25 25 25 25 26 24 22 24 24 25 26 25 27 26 28 29 28 29 32 31 27 26 26 24 24 23 24 26 27 27 27 24 25 26 26 26 25 25 25 26 27 27 28 30 31 31 29 28 25 25 26 25 27 26 27 31 32 35 44 48 117 161 154 132 115 116 108 103 104 103 102 103 107 109 108 109 110 109 107 109 110 111 113 116 118 121 119 121 120 124 122 115 117 119 118 119 120 119 120 120 119 117 122 121 121 122 121 119 119 119 120 123 125 125 123 124 125 128 127 130 130 134 139 144 168 199 234 242 240 237 246 238 247 243 245 245 244 144 52 31 20 18 18 18 19 28 34 29 37 21 16 16 18 17 18 21 23 25 29 29 29 31 33 32 34 35 39 45 54 56 55 53 49 45 42 41 39 39 35 35 38 40 42 43 43 41 43 45 44 44 42 41 41 42 39 37 36 35 37 35 33 34 35 35 35 40 41 41 40 41 38 37 35 32 32 31 31 30 26 27 28 28 28 27 27 27 28 28 26 26 26 26 26 28 25 27 26 27 27 28 26 26 25 26 26 27 27 28 27 27 28 29 32 34 34 33 30 32 31 27 26 25 26 27 27 26 25 25 26 26 27 27 26 24 26 27 26 28 26 27 26 26 29 29 30 30 30 32 37 46 46 45 46 46 46 46 46 47 48 45 49 49 49 47 40 29 29 30 26 28 39 43 117 173 137 140 178 141 145 141 146 144 141 141 139 149 182 196 201 150 157 147 146 142 143 147 150 146 148 141 141 143 146 149 149 150 145 145 144 142 138 138 143 139 144 146 143 135 138 140 136 135 137 139 142 143 145 147 150 149 148 143 144 140 143 142 143 143 146 146 150 154 143 144 149 147 145 145 146 145 140 137 142 142 141 145 145 148 149 148 149 147 144 144 136 140 146 149 143 138 140 141 150 163 185 203 217 223 235 233 234 246 246 248 244 242 239 239 242 238 239 248 245 243 240 238 246 247 239 236 244 243 238 231 237 190 162 190 188 120 173 168 145 185 186 174 211 150 135 133 139 155 180 125 40 43 49 52 56 72 95 120 138 147 161 170 173 174 176 176 176 175 175 174 176 178 176 175 171 173 174 175 175 176 178 176 175 176 172 173 174 173 172 172 169 168 156 67 44 33 27 24 25 25 25 24 23 23 23 24 25 26 25 24 25 25 26 27 28 31 32 31 29 28 27 25 26 25 26 27 26 27 26 24 23 25 25 25 25 24 26 27 27 26 28 29 30 31 27 28 26 26 25 25 24 24 26 30 30 31 42 44 74 151 160 151 109 106 108 106 97 98 99 101 102 105 109 108 103 102 102 103 105 109 112 115 118 119 117 118 116 117 116 116 115 117 118 117 118 119 118 115 120 121 118 117 120 119 116 118 121 121 120 121 121 122 125 125 123 122 123 128 127 129 133 132 134 136 167 210 246 238 244 242 239 236 233 236 239 139 50 33 21 17 16 16 21 29 33 31 36 21 15 15 16 16 19 21 24 25 30 31 31 31 32 31 33 35 38 42 54 56 56 52 49 45 40 40 40 37 36 36 36 38 43 42 44 42 44 44 44 43 43 43 39 38 37 37 35 34 35 34 35 35 36 36 36 38 39 40 40 41 39 38 35 32 31 28 30 29 28 28 27 27 27 27 26 28 27 26 25 27 25 27 27 28 26 27 28 27 26 27 26 25 27 25 25 28 29 29 28 28 28 27 31 33 34 32 31 32 31 29 27 27 27 27 26 25 25 24 26 27 28 28 25 25 27 27 26 26 26 26 26 26 26 28 29 29 31 34 38 44 44 44 45 45 46 47 46 44 45 46 47 48 49 49 43 36 29 31 27 27 35 39 80 163 142 146 163 144 157 150 150 145 142 145 141 137 181 188 206 158 152 144 144 151 148 149 149 143 147 145 145 148 148 149 145 146 149 149 154 153 148 146 147 144 144 152 147 140 141 147 138 137 140 142 141 143 150 148 150 143 144 144 148 145 144 142 145 145 147 146 147 147 150 149 143 139 146 146 144 142 143 140 141 143 143 145 142 149 148 149 147 144 145 147 143 138 143 144 149 159 172 194 220 229 242 245 244 247 249 244 245 251 242 243 245 243 239 239 239 244 241 242 244 246 246 243 248 242 239 238 242 244 239 237 236 178 165 191 181 115 179 140 151 192 181 170 209 150 133 131 141 157 175 118 38 41 43 51 58 61 64 71 70 76 89 106 123 134 147 157 164 169 173 172 174 177 175 175 174 173 175 174 175 175 176 177 173 175 171 171 174 172 170 170 168 168 163 80 42 34 26 27 25 25 24 24 24 23 23 24 24 24 24 23 23 24 24 26 28 30 32 34 31 30 27 26 25 23 24 24 24 26 26 24 23 24 25 25 27 26 26 26 27 27 27 29 28 30 29 27 27 26 24 24 24 25 26 27 30 31 38 43 58 124 164 160 127 106 105 105 102 99 99 97 100 102 103 103 102 101 105 106 108 109 112 113 112 115 115 116 113 113 114 114 114 111 116 117 118 119 120 119 118 118 115 115 117 115 117 118 118 120 123 125 124 122 125 124 124 125 121 125 123 126 129 131 132 135 133 146 220 244 250 244 242 236 235 238 230 127 53 32 20 18 15 15 20 28 34 32 37 22 16 18 17 17 20 19 23 25 29 31 31 31 35 34 34 36 38 40 52 55 56 54 51 46 42 40 38 37 38 36 37 40 42 42 42 39 42 43 44 45 43 43 40 38 38 35 35 36 35 35 34 35 35 34 34 37 40 40 40 41 39 37 34 32 31 28 29 27 26 28 28 27 26 27 28 28 27 26 25 26 26 27 27 26 27 27 26 26 26 26 26 27 26 25 27 27 28 30 30 29 28 28 32 33 33 32 29 32 32 28 28 27 26 27 26 25 26 26 26 26 27 27 24 24 26 26 26 26 26 27 26 25 25 28 29 29 31 34 37 43 44 45 46 45 46 45 42 41 43 44 44 46 48 50 46 39 30 29 27 23 32 38 60 146 148 156 143 141 159 148 149 146 142 145 144 134 174 180 207 169 154 151 138 147 151 148 146 145 142 142 146 148 146 142 138 140 149 148 151 151 155 151 151 147 143 147 149 149 145 147 143 145 146 143 143 145 148 149 149 144 144 141 146 147 146 148 149 147 147 146 148 148 150 149 143 141 146 146 144 146 150 148 144 149 148 147 147 149 148 150 146 149 153 151 147 145 155 171 198 214 230 242 247 241 242 244 245 250 251 251 247 247 242 239 242 244 240 240 247 250 246 242 244 246 240 239 247 245 241 243 245 247 241 242 237 173 167 195 168 114 182 136 148 190 183 173 202 150 138 132 141 156 173 116 38 38 41 46 55 57 58 59 60 60 64 67 74 78 76 80 90 96 110 122 132 140 152 160 165 169 171 169 171 172 173 176 173 175 172 171 171 171 168 168 170 167 168 111 32 28 24 26 26 26 24 25 25 24 24 24 23 23 24 24 24 25 24 26 27 28 31 32 30 30 27 27 26 25 23 23 24 25 25 23 25 24 24 24 25 26 24 25 26 26 28 28 28 29 28 26 26 25 24 24 24 25 27 27 28 30 34 41 48 79 165 168 147 112 99 99 102 101 97 97 99 100 102 104 102 103 105 114 114 111 109 109 110 111 116 117 115 114 116 117 118 120 118 118 118 120 122 122 118 119 116 117 118 118 120 117 115 120 123 124 123 121 125 123 122 125 121 126 125 125 127 129 128 129 131 125 192 246 246 239 242 238 244 243 239 141 52 32 19 18 17 17 18 25 35 32 34 21 15 15 15 16 19 20 24 25 27 31 32 30 33 34 36 36 38 41 49 53 55 54 50 47 43 42 40 39 39 39 39 40 41 41 42 41 42 42 43 42 43 42 41 38 37 36 37 36 36 36 35 35 34 36 35 36 39 37 39 40 38 36 34 32 30 26 28 26 26 27 29 26 26 25 27 27 27 25 25 25 27 27 27 26 26 27 26 25 26 26 25 25 26 26 28 28 29 30 30 29 30 29 32 33 33 32 30 30 31 28 27 28 26 25 26 26 25 25 25 27 27 27 26 26 26 25 24 25 25 25 26 27 26 27 27 29 30 32 36 42 45 45 45 45 46 44 44 44 43 45 44 44 45 48 49 45 32 27 29 24 28 37 48 110 151 157 146 125 150 145 143 144 143 139 145 133 173 176 205 185 148 153 148 147 148 148 149 147 144 144 148 150 149 145 143 151 155 155 151 147 148 151 154 146 143 139 140 149 142 142 142 147 148 145 144 147 149 152 153 140 140 144 146 144 143 145 143 143 147 146 145 145 147 146 142 140 142 145 144 144 145 141 141 145 152 155 149 147 149 150 152 151 156 165 181 196 221 237 248 246 246 249 251 249 246 250 248 248 248 247 243 241 243 237 236 234 240 245 243 240 238 244 251 243 247 248 243 245 244 240 240 240 243 241 232 168 168 199 153 123 183 139 141 189 182 169 195 147 140 134 144 160 170 117 39 38 41 46 53 57 57 56 56 58 59 61 61 60 61 61 64 61 67 73 77 73 79 97 108 113 115 120 127 136 148 155 161 166 171 169 170 172 171 169 168 168 169 141 28 27 25 27 25 24 24 24 23 25 24 24 24 24 24 24 25 25 25 26 26 28 32 32 31 30 29 27 26 26 25 23 25 26 26 25 24 23 23 24 25 26 24 25 26 25 27 27 29 28 30 28 26 25 24 25 24 25 25 25 27 27 32 37 43 54 144 169 160 127 102 107 101 100 100 99 100 102 105 109 106 107 111 114 113 113 110 109 112 113 116 113 112 116 119 117 122 123 119 119 123 125 121 119 120 119 115 120 123 120 118 120 120 120 124 124 121 122 123 120 121 121 121 123 121 123 130 129 127 124 128 127 197 246 248 240 239 247 243 240 243 152 49 33 18 16 16 18 19 25 34 33 35 21 16 16 16 16 19 20 24 25 27 31 34 32 34 34 36 35 36 40 48 53 55 54 50 48 44 41 41 39 39 39 40 39 42 42 44 42 43 42 42 42 43 43 42 39 36 36 36 36 35 36 35 34 34 36 34 35 38 35 39 39 38 37 34 33 31 30 28 26 26 27 28 25 27 26 27 26 27 25 24 25 25 25 26 27 26 27 26 25 27 27 26 26 26 27 28 28 26 27 27 28 29 29 31 32 34 32 31 30 32 31 28 26 28 26 27 25 26 26 25 26 28 28 26 27 26 24 25 24 24 25 27 27 27 28 27 29 32 33 37 41 43 44 44 44 44 43 45 47 45 46 46 45 43 46 48 48 38 30 29 26 26 35 45 84 152 153 167 109 143 150 145 146 141 140 143 129 170 169 204 200 140 149 153 153 145 144 151 148 142 141 147 149 146 141 146 149 153 157 153 148 146 146 150 150 145 140 147 150 141 142 147 148 149 152 150 150 150 152 152 146 145 148 145 137 137 141 140 142 144 145 148 147 144 150 151 144 146 147 147 146 146 144 142 146 154 152 149 147 154 154 163 180 211 231 238 244 244 240 246 247 246 245 246 247 250 251 246 248 251 249 248 245 234 235 230 221 202 199 202 197 198 207 216 215 222 232 231 243 247 248 251 243 249 250 231 166 169 198 142 128 177 144 141 187 187 167 203 147 139 136 142 163 163 123 39 40 41 47 50 52 55 55 55 57 58 58 57 57 57 56 56 53 51 50 45 44 45 47 55 68 69 61 59 61 69 77 77 75 79 81 85 88 91 95 102 107 110 104 31 25 25 26 24 24 24 25 24 25 25 24 24 24 23 23 22 23 25 26 27 29 33 32 32 33 28 27 26 26 24 24 24 27 26 26 22 22 23 25 24 24 25 24 26 26 26 27 28 28 28 29 27 26 25 24 25 25 26 26 27 27 30 34 41 44 93 159 164 154 106 98 99 96 94 96 101 105 106 105 103 107 111 110 110 110 112 113 109 109 109 108 107 112 116 117 120 123 123 126 121 122 120 119 123 120 119 117 117 117 117 118 120 119 121 117 120 122 120 122 120 118 117 118 119 123 122 123 120 124 129 143 220 233 241 240 247 237 235 241 245 156 47 33 19 17 14 16 19 23 32 31 34 22 16 16 16 17 20 21 24 26 28 32 33 32 33 34 35 35 36 39 46 51 53 53 52 52 47 44 42 41 41 41 40 38 41 43 45 43 44 44 43 41 42 42 41 41 38 36 36 34 34 36 35 33 35 35 35 36 37 38 38 38 39 34 34 32 30 30 30 29 27 27 27 27 27 27 28 26 26 26 26 26 26 26 25 26 25 27 27 27 27 26 25 26 27 28 28 27 26 27 28 28 30 28 30 31 33 32 30 32 32 30 26 26 26 25 26 26 24 24 26 26 26 30 26 26 26 26 25 24 24 26 25 25 27 27 28 29 31 32 37 42 44 44 44 42 41 42 46 46 46 46 46 45 43 45 47 47 40 34 33 28 25 30 41 56 142 131 190 121 133 153 148 144 141 138 139 138 161 154 205 209 150 152 143 150 145 145 148 146 144 142 140 144 145 143 143 146 147 150 150 147 146 148 152 155 151 146 146 151 146 143 143 145 149 152 149 146 145 150 152 151 147 148 148 139 136 142 141 142 142 145 146 142 146 151 147 146 146 146 151 151 151 152 150 149 151 155 155 164 181 206 232 241 247 250 249 249 245 240 241 247 248 246 247 248 247 247 245 251 247 245 236 220 184 169 165 170 177 184 187 186 186 188 190 193 192 194 194 199 206 213 215 221 230 238 217 165 170 200 128 145 167 146 145 185 182 169 209 144 140 136 145 164 153 127 39 38 39 42 46 50 53 54 54 55 58 57 54 55 54 56 55 52 49 46 44 43 41 40 41 42 42 44 44 45 51 56 58 58 58 52 45 42 40 37 33 34 33 33 29 22 24 26 26 26 25 25 24 25 25 25 25 25 24 24 23 23 23 26 27 30 31 33 32 32 30 29 26 26 25 25 25 28 26 26 22 24 23 23 23 24 26 25 25 27 27 28 27 29 29 29 27 27 27 24 25 26 25 26 25 24 29 33 38 44 65 140 167 167 126 97 100 98 96 97 98 101 100 99 99 102 104 104 103 107 111 112 111 113 113 106 104 106 117 118 116 120 124 126 119 119 125 123 126 124 120 120 118 121 120 118 118 118 120 119 120 123 121 118 116 115 119 119 115 118 119 119 120 126 144 195 234 233 237 239 244 245 237 239 244 156 47 32 20 19 16 15 17 22 33 30 33 21 17 17 17 17 19 20 24 26 31 34 34 33 33 34 34 35 35 38 45 52 54 54 53 52 48 46 42 42 41 41 37 37 40 43 42 42 43 42 43 41 39 41 40 39 37 35 34 35 35 35 35 34 36 36 35 37 38 39 39 38 38 32 33 33 29 30 31 30 27 27 25 26 27 28 29 25 26 26 27 26 26 26 26 26 26 27 26 26 27 26 25 26 26 27 26 25 25 27 28 27 28 29 29 31 32 32 29 32 31 29 25 26 25 24 25 27 25 24 26 26 26 28 25 25 25 24 24 24 26 27 26 26 28 28 29 29 31 31 38 42 42 43 44 42 44 44 46 46 46 46 48 45 45 43 47 46 38 34 33 29 26 29 39 46 124 121 189 157 129 151 142 142 142 144 144 147 156 146 199 206 156 151 147 142 141 140 143 143 148 149 145 143 143 147 148 148 145 150 147 151 153 155 152 150 151 144 145 146 144 144 144 145 143 146 152 150 152 153 151 150 146 143 147 145 137 145 147 144 143 143 147 148 153 153 145 148 147 147 151 151 154 162 154 150 159 175 196 218 238 245 244 243 247 248 248 250 244 243 247 247 246 242 243 247 243 248 248 242 241 234 174 152 152 161 161 159 158 157 158 159 160 159 163 166 172 177 182 186 192 195 198 199 203 206 197 179 171 182 134 153 156 149 153 190 179 169 207 144 137 135 145 167 148 140 36 36 37 37 39 41 44 44 45 47 47 50 52 52 54 53 52 51 49 47 42 41 40 40 39 40 39 40 40 40 46 50 54 56 52 48 38 33 33 30 28 27 25 24 21 21 22 26 27 27 27 26 25 25 24 25 25 25 25 24 25 25 25 26 29 29 30 32 30 30 29 30 28 27 25 26 25 27 26 25 24 24 23 24 22 24 26 26 26 26 27 29 27 30 28 27 29 26 26 27 26 26 27 27 25 25 28 30 37 41 47 94 173 165 152 111 102 101 102 103 104 105 103 104 103 104 103 98 96 100 104 106 111 111 109 109 103 103 109 110 108 108 114 116 119 118 119 120 119 118 122 121 123 121 120 120 119 120 120 119 122 123 121 118 114 116 117 118 116 116 118 118 124 145 207 233 233 240 242 239 236 240 240 245 246 158 50 33 19 17 17 16 17 22 32 33 32 21 17 16 16 17 20 20 23 26 31 33 34 34 32 35 35 36 36 37 43 49 51 54 54 53 48 44 42 42 43 41 38 38 40 43 42 41 41 40 41 41 39 40 38 37 37 36 35 35 35 35 36 36 36 35 35 36 39 40 40 38 37 34 33 32 30 30 29 29 29 28 26 26 27 28 27 26 26 25 27 26 26 27 25 25 25 26 25 26 25 26 26 25 25 27 26 26 27 26 28 26 28 28 28 29 29 30 31 32 31 30 28 27 26 24 26 25 25 24 25 24 25 26 26 26 25 25 26 26 25 25 27 26 27 29 28 28 29 30 35 42 44 44 42 41 43 44 46 47 46 44 46 45 45 45 45 45 40 36 33 32 26 26 36 40 96 115 160 189 163 145 135 129 131 134 132 132 161 156 172 199 170 149 144 143 142 142 141 141 149 152 145 144 144 146 144 147 144 145 147 146 147 148 151 147 145 139 138 141 142 143 145 146 145 145 149 149 149 154 147 141 141 139 141 142 142 141 145 141 137 143 150 155 147 141 145 148 147 149 153 156 155 157 181 195 223 239 250 247 247 247 243 251 250 247 244 247 250 246 241 242 247 248 246 246 240 249 246 241 198 143 132 138 145 143 130 124 124 124 126 126 125 128 130 136 139 140 146 153 158 161 168 172 177 181 188 193 197 199 195 193 185 178 172 185 172 170 196 151 144 139 149 165 134 150 38 35 35 36 38 40 42 42 41 40 41 42 43 44 47 47 49 47 47 45 43 42 39 40 41 40 40 37 39 39 42 46 53 54 51 47 39 33 31 30 26 25 23 23 22 21 24 25 25 26 27 26 25 25 26 25 25 24 24 24 25 26 25 26 29 29 31 32 32 30 30 30 30 28 24 25 27 26 26 25 26 25 24 24 24 26 26 25 25 26 27 27 27 29 30 28 28 27 25 25 26 25 26 26 26 27 26 29 34 41 45 63 158 162 159 126 106 109 109 111 114 112 111 112 113 111 109 110 105 106 111 111 115 114 110 109 107 111 113 110 110 111 113 115 115 118 118 125 119 117 116 118 118 116 116 116 118 120 118 121 124 121 120 120 117 113 113 119 120 120 124 124 153 211 238 236 233 234 236 243 244 241 237 236 242 155 49 33 21 17 15 15 16 22 30 32 33 21 17 16 15 16 19 22 24 28 32 32 32 31 34 36 35 36 36 37 43 49 51 54 53 52 50 46 43 43 45 43 39 39 40 43 44 43 40 41 43 43 41 38 38 38 37 36 35 35 35 35 35 35 37 36 37 36 39 41 41 38 37 36 34 34 33 31 29 30 30 30 28 28 27 27 27 28 26 25 27 27 25 26 25 25 27 27 26 26 25 26 26 25 26 27 27 27 26 26 29 26 27 28 28 27 27 28 32 33 31 29 26 27 27 26 28 25 26 24 27 26 25 27 28 28 26 26 25 26 27 26 27 26 26 28 27 27 28 31 35 41 42 44 43 43 43 45 46 46 47 45 46 45 47 45 45 44 43 37 34 34 27 25 32 38 76 118 144 187 183 172 156 143 145 143 139 136 158 164 155 202 175 141 128 130 134 136 140 148 148 147 145 147 148 145 146 144 145 146 145 142 147 150 148 145 144 143 142 139 138 140 144 145 142 143 145 145 145 147 145 140 139 138 142 145 143 142 142 141 143 147 147 152 146 145 152 154 154 159 162 171 184 209 236 246 245 249 251 246 247 247 245 251 243 244 244 248 249 245 241 243 248 250 246 244 243 246 238 195 130 127 122 118 114 108 100 101 101 101 102 101 103 107 110 111 116 118 122 126 130 136 144 147 151 158 161 164 170 175 179 185 190 192 194 194 195 193 195 185 178 172 163 167 138 159 38 39 36 36 38 39 41 42 40 39 39 41 42 42 41 41 42 42 42 42 44 44 41 40 41 41 40 39 40 41 43 46 50 51 49 46 37 33 29 29 26 24 22 21 24 23 24 27 26 24 26 25 26 25 26 25 24 25 24 25 25 27 26 26 27 28 30 29 31 33 30 31 29 29 27 25 28 26 26 25 25 24 25 24 24 24 25 25 25 26 26 26 28 29 28 30 26 29 26 25 25 26 24 24 25 24 25 25 30 34 42 47 116 168 150 156 109 110 113 114 115 116 115 115 116 112 114 117 114 109 106 109 111 110 109 114 118 116 115 111 114 114 111 115 118 118 119 116 116 115 113 112 115 120 120 120 116 116 117 120 123 124 122 121 119 117 118 119 123 123 128 163 221 237 238 238 248 246 234 232 234 237 242 241 244 164 45 33 19 17 17 16 15 18 30 31 31 20 16 16 16 16 17 21 24 28 31 33 33 32 33 33 35 35 35 37 41 47 51 51 52 54 50 47 46 46 45 41 37 37 40 44 45 43 43 45 44 43 41 37 36 36 36 37 35 36 34 37 35 35 36 37 37 36 38 38 39 39 37 35 33 34 32 31 30 28 28 29 32 34 28 26 28 27 26 26 26 26 25 27 26 26 27 26 26 27 25 24 26 26 28 27 26 25 25 26 26 25 27 27 27 29 28 30 30 30 31 29 27 26 27 27 25 25 25 25 26 24 25 27 25 27 28 27 26 25 26 25 27 28 27 28 29 29 30 33 36 42 43 44 42 43 43 44 45 44 44 46 46 46 45 46 45 44 43 41 34 34 31 25 30 39 59 117 123 175 192 180 112 137 147 149 149 148 157 166 135 202 189 157 149 131 129 126 131 134 132 138 134 143 150 147 144 140 147 148 146 145 149 150 148 144 148 149 147 145 143 144 145 150 144 141 146 146 142 143 143 142 135 135 144 147 145 143 140 139 144 150 148 149 148 149 157 161 169 191 220 235 248 248 249 248 246 246 243 244 245 247 252 250 245 243 243 245 246 248 242 248 248 247 242 240 245 241 171 113 105 95 80 74 73 68 66 66 65 66 69 72 74 74 75 78 85 85 88 93 97 102 107 112 116 120 127 129 136 140 146 153 161 165 165 165 166 169 172 176 185 187 193 194 196 195 38 37 36 36 39 39 39 40 40 42 39 40 42 42 41 41 42 41 41 41 42 42 40 40 41 41 40 40 42 43 41 42 46 46 45 44 38 35 31 30 29 26 25 24 23 23 25 26 27 26 26 24 25 24 26 25 25 25 24 25 25 26 26 26 26 27 30 29 30 32 30 31 29 30 29 26 27 25 24 24 25 24 24 24 25 24 24 27 26 24 26 28 28 29 29 30 28 29 27 25 26 27 25 24 24 23 25 25 28 32 40 46 81 166 153 163 126 110 111 113 114 115 113 112 110 110 111 115 117 117 113 112 113 114 117 118 120 119 119 120 118 118 115 117 118 116 115 117 116 118 115 112 111 114 122 122 117 122 122 121 120 120 121 121 114 121 119 120 124 127 182 230 241 239 239 244 248 244 238 242 242 242 242 244 248 169 45 34 20 18 17 16 17 20 31 31 31 20 16 16 17 18 17 19 24 28 30 33 34 33 33 33 35 36 36 37 41 47 51 54 52 52 52 51 47 45 43 41 39 37 40 43 45 44 44 44 42 42 41 38 35 35 36 36 36 36 35 34 34 33 35 36 36 36 38 39 37 38 39 37 34 32 32 32 30 29 27 27 30 32 30 29 29 28 26 25 26 27 26 27 26 26 27 25 25 26 26 26 27 27 28 27 25 26 26 27 28 27 26 27 29 29 30 28 28 30 30 28 27 27 28 27 25 25 24 24 25 25 26 27 27 27 27 27 27 28 27 24 27 26 27 28 29 29 32 32 37 41 41 41 41 43 43 44 45 46 45 45 47 46 44 44 46 44 44 42 36 34 31 25 28 36 49 103 116 155 191 190 134 143 150 157 152 151 158 168 106 187 194 162 141 141 138 136 137 140 143 145 138 142 144 143 145 139 138 145 148 141 142 141 139 144 153 148 145 144 146 148 146 145 141 139 144 142 148 146 145 143 140 140 139 144 150 148 145 143 142 146 153 156 155 156 178 200 228 239 248 250 252 249 249 246 239 241 249 251 249 250 251 246 250 247 247 245 247 244 243 245 247 246 244 244 246 196 104 88 77 65 60 59 57 56 53 51 48 49 47 47 51 48 49 52 57 59 61 64 68 72 75 78 83 89 93 96 105 109 114 121 128 131 138 142 144 144 150 152 154 158 165 168 173 178 39 36 35 35 38 39 40 39 38 40 39 39 40 40 40 42 42 41 40 40 41 41 40 40 40 39 40 40 40 42 42 41 42 40 39 39 38 37 36 36 33 31 29 27 27 28 26 26 27 26 26 25 25 26 26 26 25 24 25 24 24 26 25 27 28 28 29 30 30 32 31 30 27 28 29 28 26 24 23 23 26 24 24 25 26 25 24 26 26 25 27 27 28 29 30 30 29 29 27 25 27 27 25 25 25 25 26 25 23 29 36 41 59 127 162 160 148 119 115 116 116 115 116 116 112 108 106 109 114 115 114 118 112 112 118 116 110 105 110 117 113 112 113 113 113 112 112 113 113 116 116 109 104 102 105 111 113 113 113 119 120 118 120 122 126 119 112 116 142 196 233 241 231 233 238 239 241 241 237 242 243 242 240 240 244 169 42 33 21 18 16 16 15 19 28 30 32 21 16 16 16 16 17 19 22 27 30 33 34 34 33 34 35 37 35 37 40 47 51 53 50 53 52 48 44 44 43 41 39 38 41 43 43 44 44 43 42 42 40 37 36 36 36 34 36 34 34 35 35 35 35 36 36 38 38 37 38 39 36 36 33 32 32 32 32 32 30 30 28 29 30 31 32 29 29 29 27 26 25 25 26 27 27 25 25 26 28 26 26 26 26 26 26 27 26 27 28 28 29 28 29 29 27 29 29 29 30 29 28 28 30 28 26 26 23 24 25 27 26 26 26 27 27 27 27 27 26 25 26 26 27 27 29 30 32 32 34 39 40 40 40 41 44 44 44 46 46 46 45 43 42 43 45 46 43 44 39 34 32 28 26 34 44 70 120 107 160 201 232 225 210 201 199 189 173 153 84 158 199 167 135 141 140 138 146 151 152 155 148 149 147 147 148 148 147 147 145 144 145 143 143 143 149 144 144 143 144 147 145 141 141 145 143 145 145 142 144 143 136 139 139 144 153 154 154 150 151 156 164 177 207 225 237 247 248 248 248 251 248 244 247 251 247 247 251 250 246 242 240 246 250 241 242 244 247 244 246 247 249 248 243 247 213 113 75 65 59 53 48 44 42 43 47 43 40 38 39 38 37 39 37 38 42 44 44 46 47 49 49 51 57 60 61 65 68 67 69 75 79 84 92 97 104 108 111 115 119 123 130 133 138 144 39 37 36 36 38 40 37 38 38 39 38 39 41 40 39 41 41 40 40 40 40 41 42 40 40 40 41 41 39 40 42 42 43 41 40 38 37 36 36 35 33 33 31 29 27 27 25 26 27 26 26 28 26 27 25 25 24 23 23 23 25 26 25 27 29 29 28 30 31 32 29 29 27 27 27 27 26 24 24 25 24 22 24 24 25 25 25 25 25 25 27 28 28 27 28 29 29 29 27 26 26 26 25 25 26 27 27 26 25 28 34 42 48 84 161 162 158 133 121 120 118 117 118 118 111 110 110 110 110 112 115 118 114 111 113 108 103 104 110 113 112 114 114 113 111 109 121 123 120 118 119 116 113 112 112 115 119 117 119 121 124 122 121 119 117 116 114 130 200 242 243 242 238 236 237 233 235 245 237 243 237 234 247 245 246 166 41 31 19 17 17 15 16 19 29 30 31 20 16 16 15 15 17 20 22 26 28 30 33 34 34 34 35 37 35 38 39 47 52 52 52 54 49 46 45 45 44 40 39 38 39 42 42 42 44 42 41 42 40 39 37 36 36 34 35 36 35 36 33 36 35 34 34 36 38 36 38 39 37 39 33 30 29 29 30 30 28 28 27 28 26 27 28 28 30 28 27 26 26 27 27 26 25 25 26 26 27 26 26 25 26 27 26 26 24 26 27 27 28 28 28 28 28 30 29 28 30 29 28 28 28 28 27 27 25 25 26 27 25 25 26 27 26 27 28 28 26 28 27 27 28 27 29 31 30 32 34 39 42 41 40 39 42 43 44 46 45 46 45 43 40 42 43 45 44 46 43 35 31 30 24 32 41 55 132 164 213 236 249 247 239 236 243 237 172 111 77 107 164 189 193 189 178 173 173 168 167 163 160 155 148 150 151 149 150 153 151 152 151 146 149 148 150 148 146 147 148 145 139 137 140 142 144 141 129 135 145 144 142 143 144 148 150 156 160 162 180 198 220 236 243 247 242 243 245 249 247 249 245 245 245 246 247 248 248 245 247 245 242 246 244 245 241 240 247 245 250 246 246 245 243 243 144 79 65 56 44 40 41 40 38 38 41 35 35 34 34 34 34 32 33 33 36 35 36 40 40 41 43 44 45 46 45 47 48 50 51 54 55 56 59 63 68 74 80 81 82 90 102 113 106 109 38 34 36 35 37 38 38 37 39 40 39 39 39 40 42 43 42 40 40 40 40 41 40 41 42 41 41 41 39 39 42 42 39 40 39 38 38 36 36 35 33 32 30 29 29 29 28 27 26 26 26 28 25 25 27 27 24 24 25 23 25 25 25 26 29 28 30 30 32 30 28 29 27 29 28 28 27 26 24 25 23 23 23 24 26 27 27 25 23 25 27 27 28 27 28 28 28 26 26 27 26 25 25 25 26 27 27 27 27 26 32 38 43 50 132 165 164 153 120 117 116 118 119 119 114 113 117 117 113 110 110 113 111 109 105 98 95 104 113 116 114 119 118 116 114 112 116 118 119 115 112 113 116 116 117 120 121 118 120 122 125 124 121 124 121 124 156 216 240 241 238 242 239 243 241 243 242 236 236 230 230 233 220 192 153 93 40 27 18 17 17 16 15 19 28 30 31 19 15 14 14 16 18 21 22 25 28 31 32 33 34 34 35 36 35 37 41 49 53 53 52 52 49 46 42 42 45 41 38 37 39 41 43 43 42 43 43 42 39 37 35 35 34 34 34 34 34 35 34 35 36 36 35 38 39 39 38 38 39 40 32 32 30 28 28 28 28 28 27 28 27 27 27 27 26 26 26 25 24 25 27 27 25 25 26 26 25 26 29 30 29 27 27 27 26 27 27 28 29 27 28 29 29 29 29 27 29 29 28 26 27 29 28 26 24 24 25 23 25 26 26 25 24 24 26 27 27 27 26 27 28 29 30 31 29 31 35 40 42 41 40 39 41 44 44 44 44 46 44 42 43 44 44 45 44 46 44 40 31 32 26 28 39 44 116 224 232 235 235 237 233 223 191 149 117 116 124 159 217 242 241 242 240 236 233 236 236 234 227 218 213 212 205 200 196 193 184 182 178 173 172 170 168 167 163 165 162 162 165 166 166 168 169 169 167 169 170 169 176 179 183 186 182 180 189 222 239 247 248 249 247 248 248 247 247 246 250 246 247 246 246 244 245 248 249 245 247 247 243 248 245 248 241 242 246 246 245 242 243 243 242 207 87 66 51 44 38 36 39 41 38 38 39 36 32 32 32 32 31 31 32 31 33 34 32 33 35 35 36 37 37 37 38 39 39 40 42 43 44 46 46 45 45 44 43 43 44 47 47 49 58 61 37 35 35 34 38 40 39 38 39 40 41 41 39 40 40 42 42 40 40 40 40 42 40 39 40 40 40 41 39 41 42 41 39 38 38 38 38 36 36 36 35 33 32 33 31 29 28 27 25 26 27 28 26 26 26 27 25 25 25 24 25 25 26 27 27 28 29 31 32 31 30 29 29 29 27 28 26 27 27 26 23 25 24 24 26 26 26 26 25 25 26 26 29 29 29 28 28 27 27 26 25 24 25 25 25 26 26 26 25 25 29 34 42 48 97 163 163 164 133 118 114 116 116 115 115 113 114 114 114 113 112 115 114 112 110 109 110 114 123 124 111 113 116 116 114 113 117 119 117 115 117 115 117 118 119 120 119 118 121 123 121 122 129 135 134 167 228 246 248 245 242 237 237 242 239 241 239 234 235 237 223 201 159 139 127 95 46 29 19 17 16 17 16 18 28 31 34 21 15 14 15 16 19 21 22 25 26 31 32 33 35 34 34 35 36 39 41 48 52 54 54 53 49 45 40 42 43 41 39 38 41 41 43 43 41 40 42 40 37 37 35 35 34 35 36 35 34 33 33 33 34 35 36 40 40 40 39 39 38 37 32 30 29 28 28 28 28 25 26 27 27 27 25 25 25 26 25 26 26 24 26 25 27 27 26 25 25 26 27 29 28 27 26 26 27 27 28 27 28 27 29 30 28 28 29 27 27 29 29 27 26 27 28 26 26 25 25 25 25 26 25 25 25 25 25 27 27 26 26 26 26 27 28 30 29 30 33 38 41 41 40 39 42 44 43 44 44 44 43 41 45 46 46 43 44 42 43 41 32 32 28 26 38 42 87 203 248 248 239 216 168 145 142 142 148 171 210 239 249 247 242 239 243 244 238 242 251 249 241 238 240 243 244 242 239 242 237 241 237 231 234 234 232 230 230 224 220 224 228 231 230 232 230 230 229 233 230 231 235 235 235 238 238 235 232 241 238 237 237 239 243 244 243 235 236 242 249 244 247 242 246 248 247 248 247 245 244 248 244 248 246 246 247 248 245 242 243 243 243 243 244 164 75 58 45 41 36 35 40 39 37 38 37 34 31 29 32 32 31 32 32 31 32 31 33 34 35 34 34 34 32 32 34 35 37 39 38 39 42 42 43 46 48 48 48 45 47 45 44 42 43 42 37 35 35 35 37 38 39 40 39 40 39 38 39 40 40 41 41 41 41 41 40 40 40 40 40 40 39 40 40 42 42 40 41 40 38 37 36 36 37 35 37 34 31 30 26 28 29 26 28 27 28 27 26 25 26 27 26 25 24 26 25 26 27 28 27 27 28 29 30 30 30 31 29 29 28 27 26 26 26 26 26 26 25 24 24 25 25 25 26 26 27 28 28 29 29 29 27 27 26 26 24 24 25 26 26 27 27 26 26 26 26 31 39 44 63 136 166 167 154 124 116 117 118 115 110 113 116 118 117 111 108 111 118 119 118 115 112 112 120 119 112 111 116 116 113 114 115 117 115 119 120 120 120 123 119 112 112 117 121 119 126 130 132 145 197 233 232 240 242 245 243 240 237 238 236 238 240 229 213 180 136 125 136 154 191 153 35 29 19 17 13 15 16 16 27 30 32 21 16 15 15 15 18 20 24 25 27 30 32 33 33 34 35 35 37 37 41 47 53 55 54 52 47 43 41 42 44 43 39 37 40 42 42 42 41 41 40 39 37 36 35 36 35 33 34 34 35 34 33 33 34 35 37 41 42 40 39 37 36 34 33 32 30 29 28 28 28 26 27 26 26 26 26 26 24 24 23 24 25 25 25 26 25 25 25 25 26 25 26 27 27 27 25 27 27 28 29 27 27 27 27 29 29 27 29 27 27 28 27 27 27 27 27 25 27 27 25 25 26 27 25 25 26 27 27 26 27 26 26 26 26 27 28 28 28 30 32 37 41 39 39 38 42 43 43 43 44 44 42 40 43 43 42 44 42 42 44 42 35 31 30 26 35 43 61 164 239 210 164 135 128 133 150 188 233 247 242 244 242 233 228 235 245 249 251 247 245 241 242 244 247 239 236 245 246 241 245 249 245 238 245 244 242 237 238 238 242 243 243 244 245 240 239 237 235 240 241 238 240 239 238 239 238 238 244 242 240 238 242 243 243 239 239 237 237 234 238 241 245 239 241 244 238 236 244 248 247 248 246 245 246 248 244 247 242 244 242 239 241 243 228 118 64 50 41 38 35 36 42 40 38 38 34 32 31 30 30 28 32 31 31 31 31 31 31 31 32 32 34 33 32 30 31 33 33 33 36 37 40 39 43 43 45 46 46 47 48 47 45 46 45 46 37 34 35 35 36 39 39 39 39 39 38 39 40 39 39 40 42 42 41 41 42 41 41 39 39 38 38 40 41 41 42 42 41 41 39 38 38 37 37 37 37 35 32 31 29 28 29 29 29 28 28 27 26 26 27 27 25 25 25 27 25 26 27 28 26 27 30 30 31 31 29 31 30 29 28 28 27 27 26 25 28 27 24 24 25 25 26 26 26 25 27 26 26 27 27 27 27 26 25 25 24 24 25 27 27 26 26 29 31 29 26 29 34 42 54 112 174 166 166 130 114 114 113 106 100 103 114 117 116 114 109 109 114 117 119 118 116 113 117 116 115 115 116 116 116 116 115 118 118 123 121 121 123 120 118 115 116 121 116 118 121 121 146 204 240 241 242 239 234 239 245 243 239 240 237 235 206 166 133 125 126 152 196 219 241 173 36 29 18 16 15 15 15 16 26 30 33 20 16 15 14 14 18 19 24 25 30 33 32 31 33 35 36 36 36 36 40 46 53 54 54 51 48 44 40 43 42 41 39 38 40 42 42 43 42 40 40 41 37 36 37 37 35 35 34 33 35 35 35 33 35 35 37 40 41 40 38 37 36 35 33 32 30 28 28 28 28 26 27 26 26 25 25 24 24 23 23 24 25 26 24 25 25 26 24 23 23 24 26 27 27 26 26 27 26 27 28 25 26 27 26 29 29 28 29 28 28 28 28 26 25 25 26 26 27 25 26 25 24 25 26 25 26 27 28 29 29 27 27 26 26 27 27 27 28 29 33 37 41 41 38 40 41 42 43 43 44 44 42 42 45 45 44 44 42 42 43 44 38 31 33 28 32 41 51 122 167 142 132 134 146 182 220 235 234 241 246 241 241 235 233 236 241 244 247 247 246 236 236 239 243 244 244 247 246 240 249 250 245 239 241 242 244 245 243 244 248 251 249 248 245 242 243 241 239 238 231 234 239 239 238 236 231 232 238 245 246 242 247 248 241 239 243 244 244 242 243 245 244 245 241 243 240 236 238 239 239 239 235 242 241 240 246 245 249 246 245 245 243 244 205 94 56 44 40 36 34 36 42 40 38 38 34 30 30 31 32 32 31 32 31 32 30 31 30 30 31 32 33 32 32 32 33 31 32 31 34 34 37 38 42 43 44 47 47 46 48 49 49 48 45 44 36 35 36 36 38 39 39 40 39 37 39 41 39 38 39 38 40 40 41 41 42 40 40 39 39 38 39 39 39 40 41 41 41 41 40 40 39 37 38 36 36 35 33 32 30 29 28 28 29 27 27 27 26 27 25 24 26 26 25 25 25 26 26 27 27 26 29 29 30 30 30 31 29 29 29 28 27 27 26 26 25 24 25 24 26 27 25 24 25 26 26 28 28 28 27 26 27 25 25 27 25 25 24 25 27 26 28 30 31 32 28 26 30 42 61 83 156 167 170 151 119 119 116 115 114 115 116 114 115 115 116 115 117 120 122 120 119 117 115 112 113 111 111 115 119 114 118 121 122 122 115 116 114 113 118 121 124 126 127 125 121 121 192 238 245 244 246 242 243 239 245 250 245 234 203 157 122 123 135 162 204 236 242 234 228 142 37 30 18 16 15 15 15 17 26 29 34 20 16 16 15 14 17 19 21 24 29 30 33 32 34 35 34 35 37 36 40 46 54 54 52 51 49 45 42 42 42 41 38 37 40 42 43 42 41 41 39 40 35 36 35 36 35 35 35 34 35 35 35 34 35 35 36 37 38 38 37 35 37 34 32 33 30 30 28 27 27 27 24 25 25 26 26 25 24 23 23 24 25 23 25 25 25 26 24 23 24 25 25 25 24 25 25 26 25 25 26 26 27 25 27 28 29 30 31 30 28 27 27 27 25 24 25 26 26 26 26 25 24 24 24 24 26 27 28 30 28 27 26 26 27 28 28 27 28 29 33 36 41 38 37 39 40 43 42 42 43 44 43 42 43 44 47 43 42 42 43 45 39 32 33 30 29 39 44 95 144 134 152 181 223 242 240 242 235 233 236 236 239 242 244 244 246 241 243 245 248 242 243 246 246 247 244 245 245 246 244 241 240 242 240 243 246 248 247 247 248 246 248 242 242 243 247 244 241 242 237 236 241 241 235 236 237 234 242 245 243 246 248 246 242 242 246 248 243 241 242 242 244 243 243 240 247 248 242 242 239 240 241 240 239 237 241 238 235 236 233 231 243 243 162 72 51 41 39 35 36 39 42 38 37 35 32 30 30 30 27 28 30 30 28 31 29 30 30 31 30 31 33 32 33 33 33 32 32 31 31 32 34 38 42 41 44 46 45 46 48 50 47 47 48 45 37 36 36 35 38 40 38 38 40 41 40 40 41 39 38 38 40 40 41 42 42 40 40 40 39 38 39 40 40 40 41 39 42 42 41 42 41 39 38 36 37 36 33 31 32 32 30 28 29 29 26 26 26 26 26 26 25 26 26 25 26 27 26 27 28 27 27 28 29 30 31 30 30 31 27 27 27 26 25 26 26 27 26 25 25 25 25 25 25 26 27 28 28 28 29 28 27 25 25 26 26 25 24 25 27 28 28 30 30 32 27 24 26 34 49 60 130 167 172 164 128 120 114 116 120 119 113 113 114 114 116 114 118 122 121 118 120 119 119 116 115 112 113 121 120 112 115 120 121 119 116 114 116 119 112 115 123 128 134 129 129 128 168 227 238 243 247 250 244 240 238 221 175 153 129 122 130 162 207 225 229 227 237 226 154 85 40 28 18 16 15 14 14 16 25 27 31 18 15 15 16 15 17 20 24 24 26 29 32 34 33 34 34 36 37 38 40 47 54 55 52 51 50 46 42 41 43 41 37 35 40 43 43 42 41 42 39 41 36 37 34 34 35 34 33 33 33 33 35 34 35 34 34 37 38 38 37 37 38 36 32 32 31 30 27 26 26 26 25 26 25 25 25 25 23 24 24 24 24 23 23 24 25 27 24 22 25 26 25 25 24 25 26 26 25 24 26 27 27 26 26 27 28 29 31 30 28 26 25 28 27 27 26 27 26 25 25 24 24 26 26 25 26 27 27 28 27 27 27 26 25 27 30 29 27 29 32 35 41 40 38 38 41 43 42 41 42 44 41 41 44 46 46 44 42 42 43 44 42 36 32 31 26 34 44 73 152 179 215 223 235 236 243 241 239 235 238 243 240 237 243 247 243 245 245 242 242 235 243 245 236 239 236 241 245 247 243 237 237 242 243 247 252 251 246 244 248 245 248 248 239 242 242 239 241 240 227 223 223 227 232 240 241 242 249 249 250 249 247 248 247 244 244 249 249 245 247 248 248 247 244 240 243 249 244 244 242 242 242 238 244 243 236 238 238 240 237 236 239 239 129 64 49 39 36 35 36 41 42 36 37 36 34 30 29 29 30 30 30 30 29 30 31 31 30 31 31 32 32 33 35 34 32 32 32 32 32 33 35 39 41 43 40 44 45 46 48 47 46 45 45 43 38 36 37 36 38 40 40 39 40 41 41 40 40 40 40 39 40 41 41 41 41 41 41 39 39 38 39 41 41 40 42 40 40 40 39 40 40 40 39 37 37 37 35 32 32 31 30 28 28 27 27 27 26 26 26 25 27 27 26 26 27 28 26 25 27 28 26 27 28 29 30 31 30 31 30 29 27 28 28 25 25 26 26 26 26 24 25 24 25 26 26 27 28 28 29 28 27 26 26 25 25 26 25 25 26 26 28 29 30 33 28 23 21 26 41 51 86 163 173 170 147 130 122 118 119 119 118 119 121 120 117 118 119 119 120 119 121 121 118 116 114 114 117 120 120 123 123 123 122 121 115 114 112 112 111 115 122 124 131 134 122 117 119 140 174 194 207 205 191 168 142 122 128 134 153 187 226 232 228 230 229 217 181 124 99 80 40 27 18 16 14 15 15 17 25 29 32 20 16 15 14 14 18 20 21 25 28 29 32 35 33 33 33 35 37 38 40 49 54 55 52 51 48 45 43 42 44 40 39 38 40 41 42 41 41 42 41 41 37 35 33 33 34 34 34 32 32 32 34 34 33 33 35 36 36 37 39 37 38 36 33 32 29 28 28 27 27 27 25 25 25 26 26 25 24 23 24 25 23 25 25 25 25 25 25 25 24 25 25 24 24 24 26 26 27 27 27 25 27 28 26 28 29 28 29 28 28 28 25 28 27 27 25 26 24 25 26 26 25 25 27 25 27 28 25 25 25 25 25 27 27 28 28 28 30 28 29 34 41 40 39 38 39 41 41 42 43 44 41 39 42 42 43 43 43 42 42 43 45 40 32 33 27 31 43 52 142 214 232 234 232 233 244 242 243 243 238 240 243 243 241 240 237 237 238 239 239 237 239 241 246 244 243 235 236 240 242 247 245 244 247 248 245 242 241 243 249 251 244 238 242 241 244 243 244 244 244 234 223 228 237 237 240 238 247 246 248 247 248 243 243 248 244 242 246 244 241 242 238 238 240 239 238 236 241 244 246 243 241 247 249 246 245 244 243 243 241 239 246 230 91 64 46 39 35 33 33 42 41 35 38 36 32 29 29 28 30 30 31 28 29 30 33 31 30 30 31 30 33 33 33 34 32 30 30 32 31 32 34 37 39 42 41 43 44 45 46 47 45 45 44 42 37 37 37 38 38 38 38 38 38 40 41 42 41 40 39 39 41 41 41 41 41 41 42 41 40 39 39 40 40 41 42 40 40 41 40 41 37 39 38 36 35 36 34 34 32 30 30 28 28 26 28 28 27 27 27 26 27 26 26 26 28 29 26 26 25 27 26 27 29 30 30 31 32 30 30 28 27 27 26 26 26 26 26 25 26 24 25 25 25 26 26 27 28 28 28 27 26 26 28 26 26 26 26 25 26 26 28 30 32 33 31 24 20 23 33 44 65 144 175 175 158 132 117 114 116 123 124 121 118 119 122 124 117 116 118 119 120 120 121 118 121 124 126 123 121 121 125 126 123 123 123 122 121 120 115 118 123 141 195 201 172 147 127 124 129 135 137 139 131 124 130 143 172 197 220 230 238 231 224 221 184 140 107 99 96 76 42 27 17 15 13 15 16 17 23 27 31 19 15 15 14 14 18 20 22 25 28 30 32 34 34 33 34 35 36 37 40 48 53 53 51 51 48 43 41 41 42 39 37 37 41 42 41 40 42 42 41 40 37 35 36 35 34 35 33 34 34 35 34 34 33 35 34 35 37 37 38 37 37 35 33 32 29 28 28 27 27 27 25 24 25 24 23 25 24 22 24 25 24 24 24 23 23 26 27 26 25 23 23 24 24 24 27 26 29 30 28 27 26 27 28 29 31 29 29 29 28 29 27 27 28 27 24 25 25 24 26 26 24 25 26 26 27 27 27 26 25 25 25 26 27 27 29 30 29 31 31 35 40 39 37 39 41 41 42 42 42 42 40 40 42 44 43 44 44 44 40 41 43 42 34 34 29 28 40 44 112 208 240 237 242 239 236 243 244 246 238 233 235 236 236 236 241 240 239 240 243 244 243 244 249 248 244 239 240 240 240 245 246 244 244 244 245 243 242 240 242 247 248 246 245 245 247 246 244 243 240 242 240 237 245 248 249 247 247 247 248 250 249 241 242 244 246 243 242 244 239 240 248 243 241 241 241 239 238 242 244 240 233 236 239 244 245 244 238 239 239 237 248 218 80 58 45 37 31 30 34 45 39 36 36 33 29 29 29 28 30 30 29 28 30 31 32 31 31 31 30 31 33 31 32 34 32 30 29 30 32 32 33 36 40 41 42 42 43 46 47 48 45 44 41 41 39 38 34 35 38 37 39 40 38 40 42 41 42 42 41 41 41 41 40 39 41 42 40 40 39 40 39 39 41 39 40 41 40 41 41 41 38 38 38 37 36 34 36 35 33 32 31 28 29 28 27 27 27 27 27 27 25 26 26 29 28 28 28 26 25 25 28 26 28 29 31 31 30 29 30 29 29 27 26 27 27 27 26 25 26 23 23 23 25 25 24 27 28 28 28 28 26 26 27 25 26 26 25 25 26 26 29 29 34 35 32 26 20 21 27 40 50 103 175 177 168 146 121 116 115 123 123 122 120 121 122 119 121 119 119 119 119 118 119 122 129 130 128 125 121 122 123 126 126 122 125 124 124 125 121 121 156 211 235 234 223 215 202 166 127 127 130 128 132 133 170 186 187 172 170 169 160 149 139 130 100 100 100 98 97 80 41 27 17 15 14 14 15 17 24 27 28 18 15 15 16 15 17 21 22 25 28 30 32 33 33 31 34 36 35 37 40 48 54 53 50 49 48 46 43 43 40 37 36 36 41 40 40 41 41 41 41 41 37 35 35 34 33 35 35 34 32 33 33 32 33 33 34 35 36 36 35 37 35 34 32 30 29 28 28 27 27 27 27 26 27 25 25 23 26 24 23 24 26 26 23 22 22 24 26 25 23 24 24 25 24 24 26 26 26 27 24 26 27 27 28 28 29 29 29 27 29 29 30 28 27 28 25 25 25 23 24 24 24 26 25 25 24 25 24 24 24 25 26 26 26 27 27 26 28 29 29 33 39 40 38 38 39 41 42 42 43 43 41 41 41 42 44 44 44 43 42 41 40 43 35 33 31 28 36 46 81 187 238 236 242 245 244 243 246 248 246 237 237 238 240 246 246 244 241 242 238 239 239 247 249 248 238 235 237 246 246 244 246 250 241 243 243 245 247 245 248 251 244 246 237 239 240 248 245 241 244 242 246 244 248 247 246 247 248 248 238 240 241 237 239 243 246 244 246 245 244 245 245 244 244 245 247 248 247 246 243 242 241 241 248 248 239 239 242 241 246 242 238 181 71 54 44 36 32 29 36 45 39 35 34 30 27 27 28 26 28 31 32 30 29 30 29 30 31 31 29 29 30 31 30 31 31 29 27 27 29 31 33 35 39 41 44 43 44 44 48 48 44 43 42 42 40 38 36 35 37 38 39 41 40 40 43 43 42 42 41 40 40 39 40 40 41 42 40 40 40 40 39 39 41 40 42 42 42 41 40 40 40 39 39 36 36 35 35 34 34 34 30 28 29 27 26 26 25 27 27 25 27 27 26 27 28 26 27 28 27 26 27 28 30 30 31 31 30 31 29 29 29 29 26 26 24 26 26 26 26 25 25 25 25 25 26 28 28 27 28 29 26 25 26 25 26 25 24 24 25 26 29 29 32 33 33 28 21 19 22 34 47 68 159 176 170 154 128 117 116 118 120 126 121 118 120 121 124 121 118 118 118 120 121 124 130 132 130 127 125 125 129 133 126 127 129 127 126 127 126 138 186 185 169 168 158 153 146 136 130 130 132 135 137 140 142 146 147 144 141 133 120 115 110 110 105 104 104 107 108 86 42 25 17 15 14 14 14 17 24 28 28 18 15 15 16 16 18 20 20 25 28 30 33 32 32 34 32 35 37 38 40 48 54 53 50 49 48 45 42 42 41 40 38 38 40 38 40 41 41 40 41 42 37 35 37 36 34 36 35 34 33 34 33 33 35 35 36 36 37 36 36 37 36 34 33 31 29 29 29 28 26 25 27 26 27 25 25 23 24 23 23 24 25 26 24 24 23 24 24 23 24 24 26 26 25 24 26 26 26 25 26 27 28 27 28 29 29 29 30 29 31 29 29 29 28 28 26 26 24 23 23 24 24 27 26 25 25 24 25 24 23 24 25 25 27 26 29 28 28 30 32 34 37 38 37 38 40 41 41 41 43 42 41 42 43 43 47 45 46 45 43 41 40 42 37 32 33 30 35 44 64 156 242 240 239 241 239 238 234 240 246 241 239 236 238 240 235 240 245 250 245 239 239 247 243 239 239 242 235 237 238 239 244 247 248 247 246 241 245 243 247 248 239 246 245 245 239 239 239 243 248 243 248 245 248 242 244 244 243 242 237 237 239 239 235 237 248 242 240 240 240 241 246 245 241 242 246 248 246 240 239 243 247 247 242 238 234 243 249 247 246 243 237 152 69 55 41 35 33 30 39 44 36 35 33 30 28 27 28 26 28 30 32 32 30 29 29 30 32 33 31 31 31 32 31 31 31 30 29 29 29 31 34 36 39 41 44 44 43 43 45 44 45 44 43 43 38 35 36 35 37 40 39 40 41 41 42 44 42 40 39 41 41 40 41 41 41 42 42 41 41 40 41 41 41 40 40 42 41 41 42 41 41 40 39 37 36 36 35 33 34 34 32 32 29 29 29 29 28 27 28 27 30 29 29 27 26 26 27 26 27 26 26 27 29 29 28 29 29 30 29 29 31 29 26 28 26 25 24 26 26 26 27 26 26 25 26 28 27 27 28 29 28 27 27 26 26 27 27 26 26 26 28 28 30 32 33 31 21 19 21 25 44 47 114 174 172 157 141 123 120 124 119 123 123 120 120 121 121 123 121 122 122 125 125 125 129 128 125 124 125 126 132 132 127 130 129 131 133 135 136 136 138 139 147 153 166 174 188 196 204 214 218 221 235 228 220 229 235 233 233 209 141 123 122 124 119 118 118 122 127 91 42 24 17 15 13 13 14 15 21 28 30 19 15 15 14 15 19 20 23 26 28 31 33 34 34 33 31 35 37 37 40 47 52 53 50 49 48 45 44 42 42 39 37 35 39 40 39 40 41 39 40 40 38 37 36 35 34 36 36 34 34 35 34 35 35 34 35 36 36 36 36 37 35 32 33 32 28 27 27 27 27 27 25 24 25 26 24 23 24 22 24 24 24 25 23 23 24 24 24 25 26 24 24 25 24 25 26 27 28 26 26 26 28 27 28 27 28 30 31 33 32 30 27 28 29 29 27 28 27 26 26 27 27 27 26 25 25 24 25 26 25 26 26 25 27 28 29 29 27 30 30 34 37 37 36 38 38 39 42 42 43 44 44 42 42 43 45 45 45 44 42 39 40 41 40 34 34 30 31 41 56 120 233 241 244 243 241 238 232 237 238 237 239 242 236 232 228 230 233 244 244 239 247 249 247 245 244 242 237 235 232 231 232 238 238 242 243 243 242 243 246 245 242 247 243 248 242 239 240 239 240 245 245 241 234 235 240 246 246 242 243 237 241 243 242 238 244 239 240 237 240 248 237 242 237 241 240 242 242 236 237 246 246 247 242 236 234 240 243 240 237 239 236 129 67 53 38 33 33 30 39 42 34 36 35 30 28 27 28 27 29 29 31 32 31 29 29 29 31 31 31 32 32 33 31 32 32 30 28 30 32 32 33 35 37 39 45 45 44 48 46 46 43 42 43 42 38 36 37 35 36 39 39 38 40 41 42 42 40 42 39 40 42 41 40 40 42 40 42 42 41 40 42 43 41 41 39 42 42 41 42 43 44 42 41 40 37 36 35 32 35 36 34 31 28 30 29 29 29 27 27 29 28 28 26 25 27 27 26 26 28 27 27 28 27 30 28 29 29 30 30 30 28 27 26 27 26 26 25 26 25 25 25 25 27 26 26 25 26 27 29 29 26 25 26 25 25 26 26 26 27 27 27 28 31 34 35 33 24 20 19 20 38 44 75 165 171 161 148 130 123 123 118 123 120 118 120 122 118 119 118 120 125 124 130 132 125 118 120 121 124 126 135 132 129 131 133 134 138 155 169 172 182 198 210 220 229 231 230 232 240 242 239 238 241 239 239 241 243 242 230 166 128 128 126 124 121 121 119 120 126 92 40 23 16 14 12 12 14 15 21 27 29 17 14 14 13 14 18 19 24 27 28 30 33 33 35 33 33 34 37 37 41 47 52 52 51 50 48 45 41 41 41 40 37 38 40 40 40 41 41 41 39 37 39 36 36 37 36 36 34 35 35 35 34 34 35 33 35 36 37 37 38 38 35 34 34 31 29 29 29 27 27 27 25 28 27 26 24 24 26 24 25 24 23 24 23 23 25 25 24 24 27 26 25 24 24 25 26 27 27 28 27 27 27 26 27 27 28 30 29 33 31 30 27 28 28 28 27 28 29 27 26 27 25 26 28 27 25 26 26 26 27 27 26 27 27 28 27 29 29 30 30 34 39 39 37 38 39 40 43 42 44 47 45 41 40 42 44 46 46 45 42 40 38 40 42 36 33 29 29 39 50 97 204 230 236 242 243 240 237 236 235 235 238 240 243 235 232 236 237 241 248 245 250 243 242 242 245 248 249 250 247 242 242 239 237 243 250 247 242 242 242 242 245 245 249 245 243 244 245 246 243 241 245 248 240 237 239 243 246 244 239 241 244 247 234 235 237 239 243 238 242 247 239 239 236 237 235 237 238 237 240 245 245 247 244 245 243 242 237 246 246 248 232 117 62 52 37 34 33 32 40 41 34 34 35 30 28 28 27 27 30 30 31 32 31 28 29 29 31 31 31 33 30 32 31 32 32 29 28 29 30 31 32 33 35 38 43 43 46 48 48 47 43 44 43 42 37 36 37 38 37 39 40 40 41 42 43 43 42 41 40 39 40 42 41 41 41 39 42 43 40 41 41 40 41 41 41 41 43 42 43 44 43 42 41 41 38 36 35 33 33 34 32 30 29 30 28 26 28 28 26 27 27 27 27 27 25 25 25 25 25 26 26 28 27 29 29 30 29 30 32 29 30 29 27 29 28 27 26 26 26 25 26 26 26 25 27 26 27 28 29 30 25 27 26 26 26 24 26 26 27 27 28 29 33 35 35 34 28 20 19 20 29 42 52 120 173 166 149 141 126 121 121 123 120 117 120 121 122 118 118 120 127 133 136 133 124 117 118 120 123 128 127 130 131 134 139 152 202 235 240 236 239 241 241 240 240 242 240 237 243 240 239 244 247 248 247 247 243 241 202 141 131 127 125 124 125 122 120 121 124 89 38 24 15 13 14 14 14 14 21 26 29 19 15 14 14 16 19 20 25 26 28 29 33 34 35 35 35 35 35 36 39 46 51 53 51 48 49 45 41 41 41 39 37 38 39 39 40 40 40 39 38 37 36 38 37 37 37 36 35 35 34 34 35 35 35 35 35 36 36 37 36 36 36 35 32 31 30 29 29 28 26 27 28 37 42 25 23 23 25 24 24 24 23 23 24 24 24 24 25 26 24 23 25 25 25 27 25 26 26 26 27 26 27 28 27 27 28 30 30 32 30 31 28 27 28 28 27 27 28 27 25 28 24 25 28 25 25 25 25 25 27 27 27 26 27 27 28 28 29 30 30 34 37 38 37 36 37 40 41 42 43 45 44 41 43 44 44 43 44 44 41 40 39 40 43 40 32 33 26 34 43 67 147 136 138 155 178 188 197 208 227 225 223 225 238 238 238 240 241 238 239 240 241 241 246 240 234 231 232 241 244 246 243 249 242 238 249 243 246 248 239 251 250 239 246 247 244 247 237 239 243 245 246 249 250 248 239 241 244 243 241 240 241 237 231 240 241 245 238 234 240 241 238 236 242 241 232 227 230 234 239 244 243 246 240 245 245 234 228 234 239 238 206 90 60 50 36 34 32 32 45 40 33 35 34 30 27 27 28 29 28 31 32 31 31 31 30 29 31 32 30 30 31 31 29 30 31 29 28 30 30 31 32 31 34 39 41 42 45 45 47 46 46 44 43 44 38 36 36 37 39 39 40 41 42 41 41 42 43 42 39 40 41 41 41 42 40 40 40 41 41 40 41 41 40 41 43 42 43 42 42 43 43 43 43 42 38 36 34 34 31 31 30 30 30 31 29 27 29 29 27 26 28 27 27 26 26 26 27 26 25 26 28 29 27 30 31 30 30 30 33 31 29 29 28 27 27 26 27 27 26 27 27 26 26 24 26 26 29 29 29 29 27 27 26 27 27 27 26 26 27 27 28 28 31 33 36 36 30 23 18 18 23 37 48 79 169 169 154 148 128 118 123 127 125 120 125 124 122 117 118 125 124 126 122 119 114 118 113 117 122 126 126 128 131 135 156 203 243 248 247 236 240 243 246 247 245 248 244 245 248 248 245 245 245 247 246 245 239 201 147 131 128 125 124 126 122 120 124 126 121 88 38 24 15 13 14 13 14 15 21 28 30 20 17 16 16 17 17 20 26 26 28 30 33 34 34 35 36 34 35 35 40 46 51 52 50 49 46 43 40 39 40 38 36 37 39 39 40 40 39 39 40 38 37 36 36 36 35 35 35 34 34 34 35 34 34 36 36 36 36 37 37 36 38 37 33 31 30 28 28 27 27 27 26 28 28 24 24 23 23 23 23 23 24 24 25 25 25 24 24 25 25 25 24 24 24 26 26 26 26 25 27 27 26 26 28 28 29 28 29 30 30 29 28 28 29 28 28 28 26 25 27 27 25 25 26 25 25 26 27 27 27 26 26 26 26 27 27 27 28 30 30 33 37 38 38 37 39 40 41 43 43 45 44 43 43 44 42 45 44 43 42 40 41 39 40 42 34 33 27 30 41 51 137 125 115 115 116 120 128 139 146 143 142 148 173 183 194 212 230 239 241 241 239 244 246 244 238 239 240 235 246 243 247 250 245 237 241 243 250 249 235 244 245 238 244 244 243 242 244 245 240 243 248 248 248 246 237 241 245 247 248 243 238 235 240 244 243 238 235 239 239 240 239 235 238 237 232 228 235 235 236 235 239 239 239 240 238 238 237 239 243 245 190 78 56 46 37 33 30 33 42 38 34 35 32 28 26 26 28 28 29 31 32 33 31 30 30 30 30 31 30 29 31 31 30 31 31 31 31 29 29 32 32 33 34 38 42 42 45 45 45 45 45 44 41 40 38 36 36 36 39 39 40 41 41 40 41 43 42 41 41 42 41 41 41 42 40 40 42 44 43 41 42 41 42 42 41 43 43 43 42 42 42 43 43 41 39 37 35 33 31 31 31 29 28 29 28 27 28 27 27 27 26 25 28 28 26 26 28 28 25 26 28 29 28 29 30 30 31 30 32 31 27 27 27 26 27 27 27 26 25 25 26 25 26 27 28 27 29 29 30 29 26 27 27 25 25 26 26 26 27 27 28 28 32 32 35 35 31 24 18 19 21 29 44 51 135 165 155 149 142 117 122 128 130 129 131 131 126 122 124 126 124 124 123 124 119 118 119 116 120 125 131 131 138 164 226 241 237 238 240 235 245 251 248 244 239 235 242 245 248 246 244 241 242 243 242 231 174 142 134 129 128 128 125 123 121 120 123 122 122 87 39 24 14 12 14 14 14 13 21 27 29 18 16 16 16 17 18 21 26 27 26 29 33 35 35 35 34 34 34 36 41 47 50 50 50 51 47 42 40 39 41 39 37 38 40 41 42 41 40 40 39 38 36 37 35 35 35 36 36 36 34 33 36 33 34 36 37 39 38 37 38 39 39 37 32 31 31 28 30 29 28 27 26 27 25 25 25 25 23 24 25 25 25 25 25 26 25 24 24 25 26 25 24 25 25 25 24 25 28 28 25 26 27 27 29 31 29 28 29 29 29 27 30 28 26 25 26 26 24 23 26 25 25 26 27 27 27 26 26 25 25 25 25 25 25 27 28 27 29 30 30 32 35 38 39 38 39 40 42 44 45 45 44 43 42 43 42 44 46 44 43 41 42 40 37 39 37 32 29 28 39 41 111 135 108 109 114 114 117 120 121 124 124 124 129 129 126 124 126 134 146 154 171 187 183 190 204 207 222 229 242 248 248 249 242 243 244 244 245 244 247 242 240 243 238 237 244 244 245 241 239 240 243 244 248 247 246 246 243 246 247 242 235 235 235 240 239 235 235 237 236 238 239 231 233 232 231 231 227 230 234 233 226 232 240 228 228 236 243 240 233 233 155 69 52 43 33 33 31 37 42 37 33 32 30 27 26 26 27 27 31 31 32 32 32 31 30 30 31 32 31 31 32 31 30 30 30 30 31 30 30 33 35 36 37 40 44 43 45 46 44 46 44 44 42 41 39 35 37 35 40 41 40 41 41 41 42 42 41 43 42 43 41 40 41 41 40 42 41 41 42 43 42 42 41 41 42 42 43 42 42 41 41 42 43 41 40 39 36 34 32 31 30 29 29 29 29 28 29 28 27 27 28 27 28 27 26 25 27 28 26 27 27 28 28 28 29 30 32 31 32 30 28 27 27 28 28 27 28 27 27 25 27 26 27 28 28 27 28 29 29 29 28 28 28 29 26 26 27 27 28 28 28 29 32 34 35 34 34 28 19 19 20 22 40 48 101 155 155 150 149 114 108 118 132 134 133 133 133 127 124 126 121 122 134 128 122 124 124 125 128 128 134 137 175 228 248 240 236 236 237 237 243 249 246 245 243 242 242 242 244 244 243 245 247 239 219 169 139 134 132 129 129 130 128 123 123 125 123 122 122 83 41 25 14 12 13 14 13 13 20 27 30 18 16 17 15 15 18 20 25 26 26 29 33 34 34 33 34 35 36 37 41 47 50 51 50 49 47 44 42 40 40 38 37 38 38 39 41 40 39 41 40 37 36 36 34 33 35 35 34 35 33 33 35 33 34 36 37 40 39 38 37 40 38 36 34 31 30 28 30 30 28 27 27 26 24 25 26 26 24 24 25 25 26 25 24 25 24 24 25 26 25 24 24 25 25 26 25 25 26 27 26 26 26 27 28 28 29 29 28 29 29 27 28 27 26 26 26 26 26 25 26 26 25 25 27 25 27 27 25 24 23 24 26 26 27 28 27 27 29 30 31 32 36 39 39 38 37 40 42 44 46 44 45 44 41 42 43 43 45 44 44 41 40 36 34 37 39 32 30 26 35 41 85 144 115 116 115 113 116 117 120 121 121 121 126 128 124 120 120 123 129 131 129 128 131 136 141 137 141 145 170 193 224 222 215 236 244 245 242 245 247 244 241 237 240 241 240 237 239 242 248 245 239 240 244 239 240 243 246 246 235 230 235 243 238 237 245 242 239 238 240 238 238 232 233 229 231 233 230 227 225 225 226 229 231 228 227 232 237 241 232 234 126 62 52 42 34 32 32 38 41 37 31 31 29 27 26 26 28 29 30 30 31 32 31 32 30 29 31 32 33 34 34 32 31 30 28 30 31 30 30 31 35 35 37 40 44 44 45 47 46 47 44 44 43 41 38 36 36 35 38 40 39 40 41 42 42 43 42 43 43 41 42 41 43 41 40 43 41 41 42 43 42 42 43 43 42 42 42 42 44 44 41 41 43 42 40 38 37 34 32 32 30 30 30 30 30 28 27 27 29 28 28 27 27 28 26 27 27 27 27 28 28 28 28 28 30 30 30 31 30 31 31 29 27 26 27 27 27 27 27 27 27 27 27 26 27 28 29 29 31 29 28 29 29 29 28 28 28 26 28 28 28 30 31 33 34 36 37 30 21 19 17 19 32 47 64 130 157 153 152 124 84 83 98 102 101 99 103 102 117 127 125 130 131 122 123 128 128 132 133 132 149 188 235 241 240 240 239 241 241 241 245 244 244 248 246 239 244 241 242 245 243 239 236 203 141 127 134 130 133 131 127 125 130 133 129 127 127 127 128 89 41 25 14 12 13 13 13 14 19 27 30 17 15 17 15 15 18 19 26 26 26 30 33 34 36 35 33 35 37 37 41 48 52 51 49 48 47 44 43 41 39 39 38 37 38 38 39 39 37 37 38 38 37 36 33 35 36 34 34 34 32 34 35 35 34 33 36 38 40 39 37 38 39 35 32 30 28 29 28 27 27 26 26 27 25 25 26 26 26 25 25 28 33 33 27 25 24 24 25 26 25 26 24 24 26 26 25 26 25 25 25 27 28 26 26 27 29 29 29 30 30 30 28 26 25 25 28 27 27 28 27 27 26 26 27 27 26 25 25 25 24 24 27 28 26 26 27 29 29 29 30 30 34 36 36 37 37 38 41 41 43 43 44 40 41 43 43 46 46 45 45 42 38 31 30 34 38 33 31 27 30 39 61 140 120 116 117 119 117 117 123 125 122 122 125 122 118 114 119 126 126 126 127 128 132 128 125 121 127 129 129 125 124 127 132 144 153 160 161 178 200 220 226 235 229 225 234 241 244 247 246 238 236 238 239 243 241 243 240 233 224 227 228 233 239 238 241 243 240 241 240 236 242 244 237 235 237 242 236 232 232 235 226 225 232 232 227 224 228 224 231 237 99 58 51 37 31 31 34 41 39 35 33 31 29 27 27 26 27 29 29 31 31 31 33 33 33 33 33 34 33 34 32 30 29 30 31 31 31 31 30 31 33 35 37 38 41 45 48 46 47 48 46 46 44 43 40 38 37 36 37 40 40 41 42 42 42 43 41 43 42 41 43 43 42 42 43 43 41 42 43 43 43 43 41 42 42 42 42 43 44 43 41 41 43 41 39 38 37 36 32 33 29 28 30 30 29 28 27 29 36 32 29 28 29 27 28 28 27 28 27 27 28 28 28 29 30 30 30 31 31 31 30 30 28 27 27 29 27 27 27 28 27 27 28 27 29 29 29 29 31 30 28 28 27 28 27 27 27 26 28 28 28 29 31 34 35 37 37 32 22 19 18 18 26 40 51 92 159 153 151 147 118 118 117 108 108 106 102 90 96 94 93 98 106 105 106 113 121 131 133 142 182 229 232 234 234 236 235 236 240 240 240 240 243 241 239 239 240 244 242 248 244 232 187 149 132 129 135 133 134 134 129 126 125 127 129 131 127 126 128 86 39 23 13 13 13 14 13 14 18 26 29 17 15 16 15 15 18 18 24 25 26 30 33 33 34 36 36 37 36 38 40 48 51 49 48 49 47 44 42 41 38 38 38 37 37 39 39 39 38 39 38 37 36 35 35 35 36 34 34 35 33 35 35 36 35 35 36 36 39 39 37 38 39 34 32 31 30 31 31 28 28 27 26 26 27 25 24 25 24 23 25 26 31 31 26 24 23 25 24 25 24 26 26 24 25 25 26 26 25 26 26 27 27 26 27 28 28 29 28 30 32 30 29 27 27 27 28 27 27 29 26 26 26 26 26 26 26 26 26 25 25 26 26 27 26 27 28 28 28 30 30 30 34 36 35 36 37 39 40 41 41 41 45 44 43 44 45 44 45 45 46 43 38 30 29 30 36 36 31 29 28 38 49 123 133 113 115 117 113 116 120 121 118 120 118 114 116 114 117 122 120 121 118 123 126 123 117 122 124 123 125 124 122 124 129 132 131 130 129 134 141 142 151 162 160 155 166 184 208 215 213 219 233 238 243 245 241 236 230 239 240 235 234 230 241 241 240 241 246 243 241 236 243 241 238 237 242 248 237 235 239 234 227 232 243 241 237 233 225 225 235 224 81 58 49 36 30 29 35 41 38 33 33 31 28 26 26 26 27 27 29 30 31 32 34 34 33 33 33 34 34 33 31 30 29 29 31 33 34 31 31 30 35 36 38 38 39 43 45 44 46 46 46 46 42 42 38 36 35 36 39 41 41 42 44 41 42 43 43 44 44 42 42 43 40 42 44 42 43 43 42 42 41 43 42 41 42 42 41 44 44 43 41 41 43 42 40 37 37 35 33 33 31 31 31 31 30 30 30 30 30 28 30 27 28 28 27 27 27 27 27 29 27 25 27 29 29 29 30 29 29 31 30 29 30 28 27 28 25 25 27 27 27 27 29 28 27 26 27 28 29 29 28 30 28 29 29 28 28 28 28 27 30 30 30 33 35 36 36 34 27 19 19 19 20 33 44 52 139 157 153 150 143 134 132 133 128 123 128 128 145 148 147 136 131 132 115 111 109 125 144 175 197 180 192 208 222 231 243 233 223 237 231 232 230 237 239 235 237 237 241 238 212 167 134 134 137 134 132 132 133 129 128 128 128 128 129 131 129 127 126 86 38 22 14 11 12 13 13 14 18 25 29 18 17 16 15 15 17 20 24 24 27 30 32 34 34 34 35 36 36 36 40 49 51 51 48 50 48 47 45 42 40 38 36 36 39 39 40 38 38 38 37 36 37 36 34 35 33 34 32 33 32 34 35 36 37 37 36 36 40 40 38 38 37 34 33 30 31 30 30 29 29 27 26 27 26 25 27 26 24 22 22 24 23 23 24 25 25 25 24 25 24 24 23 25 25 26 26 25 24 24 25 25 26 28 29 29 29 30 31 30 31 30 28 27 27 26 27 26 27 28 26 26 25 25 25 26 27 26 26 26 26 25 25 25 27 29 28 29 29 29 28 31 33 36 37 38 37 39 41 41 42 42 45 44 44 45 45 43 44 44 43 42 39 31 24 25 36 40 31 31 27 34 40 91 147 117 116 116 112 112 118 118 114 116 120 121 120 115 111 115 118 119 119 124 123 118 118 121 126 125 125 124 120 123 127 128 126 128 128 131 131 130 130 128 131 131 135 131 129 134 141 137 142 150 162 169 180 196 202 219 235 238 238 237 244 247 243 243 243 247 242 236 237 239 241 241 243 241 231 238 238 234 234 239 249 240 235 240 233 234 240 203 67 56 47 35 28 29 34 41 37 34 33 29 27 26 25 25 27 30 31 31 34 34 33 33 33 32 33 32 31 31 32 32 31 30 31 31 32 34 32 30 35 36 37 38 41 44 45 43 43 42 43 44 41 40 37 36 38 38 38 40 41 41 42 40 42 42 43 42 42 41 41 42 41 43 42 41 43 43 43 43 41 42 43 42 42 42 41 42 44 45 42 41 43 43 40 37 37 36 33 33 32 31 31 31 31 30 30 29 28 27 28 26 25 27 27 27 27 27 26 28 27 26 26 26 30 30 29 30 31 31 32 31 29 27 27 28 26 25 26 28 27 27 28 27 27 25 28 29 28 29 28 29 28 29 29 29 27 28 27 26 30 30 30 32 33 35 36 35 29 20 18 18 19 26 43 46 106 157 153 149 147 139 137 143 149 140 147 143 144 143 148 151 146 143 134 133 160 204 225 225 222 191 183 191 201 203 215 215 195 185 194 219 226 224 223 222 230 237 236 222 169 140 141 135 135 134 129 126 127 126 124 119 124 127 127 126 124 118 110 80 37 22 13 12 13 13 13 12 16 23 30 18 17 16 15 16 17 21 23 24 27 31 32 34 33 34 35 36 37 37 42 48 50 52 49 49 48 44 43 41 41 38 37 36 38 39 41 37 39 39 37 36 35 36 34 36 35 35 35 33 32 35 36 34 36 37 36 37 39 40 38 39 38 35 32 30 29 30 30 30 27 28 27 27 26 26 27 26 25 24 25 25 23 24 24 25 25 24 24 24 23 24 24 26 26 26 23 24 24 23 24 26 27 28 30 29 29 30 30 30 30 29 29 27 28 29 27 26 28 27 26 27 26 25 26 26 26 25 25 25 25 25 27 26 28 29 28 27 29 29 28 30 34 37 38 39 38 40 43 43 43 43 45 44 44 45 45 46 45 46 44 43 40 32 25 26 32 40 33 31 28 33 38 68 148 123 115 114 115 113 116 114 110 110 111 115 115 116 114 116 115 115 118 123 121 117 117 121 123 122 120 120 119 124 126 126 127 126 129 129 124 126 128 125 124 125 124 126 131 136 140 132 131 131 132 134 133 137 139 143 158 168 188 198 211 230 229 230 234 237 244 241 246 242 242 244 243 241 235 238 249 238 238 247 250 245 246 246 241 245 245 181 62 55 42 33 29 29 35 40 37 35 32 28 25 23 24 25 27 30 33 32 32 34 34 33 35 35 34 32 32 32 31 30 31 31 32 30 31 32 29 31 33 33 37 39 42 46 46 45 44 44 43 42 40 41 39 36 36 37 38 40 40 40 42 40 42 41 42 41 42 41 44 42 43 43 42 40 42 42 42 43 41 42 43 42 41 40 43 44 44 43 42 42 42 41 41 39 39 36 34 33 33 32 31 31 31 31 30 28 27 28 27 27 27 28 27 26 27 28 28 29 28 28 28 28 28 30 31 30 31 30 29 29 28 29 29 28 27 27 26 26 27 27 26 27 27 26 29 30 28 28 31 31 29 28 28 27 27 25 27 28 30 31 32 32 33 35 37 36 30 23 18 17 18 20 34 47 73 143 155 150 147 145 138 141 150 141 139 136 137 139 138 134 154 162 179 207 231 235 235 231 234 235 232 233 233 232 235 230 219 217 213 214 202 181 196 186 190 215 223 180 153 158 147 131 122 121 118 116 121 123 126 128 127 126 125 123 120 114 97 71 39 22 13 13 13 13 14 12 16 23 29 17 15 15 15 15 19 22 24 25 26 30 31 32 33 36 36 36 37 37 42 48 50 50 51 50 46 44 43 42 41 39 37 37 37 39 40 39 39 39 36 37 35 36 36 35 37 35 34 35 34 33 35 35 37 37 36 38 38 40 39 39 38 35 32 31 31 31 30 28 28 30 29 28 27 25 27 28 26 25 24 24 24 25 24 24 23 23 24 22 23 23 25 24 25 24 23 24 24 25 25 26 27 28 28 29 29 30 30 30 30 28 29 28 27 26 28 27 27 27 26 27 26 26 26 27 26 26 26 25 27 26 27 27 28 26 26 25 27 29 30 29 32 37 38 38 38 40 41 42 43 42 44 45 43 45 46 46 44 45 43 42 39 33 24 23 28 36 35 30 29 31 40 47 134 136 118 119 124 119 114 114 113 112 112 113 111 114 117 118 115 112 115 118 117 116 117 118 120 118 116 114 115 120 120 118 122 123 123 121 118 120 130 128 118 115 115 118 119 124 125 122 124 126 126 125 120 120 117 123 128 135 130 129 133 138 137 143 152 166 190 201 205 224 234 236 236 235 233 233 242 240 243 249 247 240 242 241 233 239 243 154 62 53 35 31 29 31 37 39 36 33 30 26 26 23 23 26 29 31 32 33 34 34 32 33 33 35 33 32 32 32 30 29 31 32 32 31 32 32 30 30 31 31 34 38 43 46 44 43 43 43 41 42 40 40 39 37 35 37 39 39 42 42 42 40 41 41 42 41 43 42 44 41 40 40 40 40 42 42 41 42 42 42 42 43 42 41 44 42 43 43 43 42 42 41 41 39 37 36 35 32 30 32 30 31 30 29 29 29 29 27 28 29 27 28 26 26 29 29 28 28 28 27 28 30 28 29 32 31 29 31 30 29 29 29 28 27 28 27 26 27 26 28 27 28 28 28 29 29 29 29 32 31 30 29 28 27 27 26 27 28 28 29 30 33 33 35 36 34 31 26 19 19 19 18 29 44 58 119 161 155 148 144 153 152 153 137 137 149 146 139 140 159 201 226 239 242 249 245 241 242 239 241 235 229 230 232 236 233 236 237 238 242 239 224 228 219 220 206 161 130 114 119 98 88 94 85 90 100 117 126 124 125 127 127 126 126 123 115 104 76 36 21 14 12 13 14 14 12 16 23 27 17 15 16 15 14 19 21 24 25 25 29 31 34 35 35 35 35 37 38 45 50 51 51 50 51 47 44 42 41 40 39 36 36 38 38 39 39 39 40 37 37 35 36 35 36 37 35 36 34 33 34 35 35 36 36 35 38 38 38 39 39 38 35 33 33 31 30 29 27 28 28 28 27 25 23 25 27 25 24 24 24 23 24 25 25 24 24 23 22 24 22 24 23 23 23 24 24 24 25 24 25 26 28 27 28 30 31 29 28 29 29 29 28 27 27 25 27 27 27 26 26 25 24 26 26 26 26 25 24 27 26 26 27 26 25 26 27 28 28 28 28 30 35 36 38 38 40 41 42 43 42 44 44 42 44 44 45 46 45 43 44 41 32 23 22 24 33 37 31 31 29 38 42 117 145 121 122 122 122 119 113 113 114 113 110 111 116 112 112 112 111 116 118 117 116 117 119 119 116 116 113 114 115 114 115 117 121 118 120 117 116 122 119 113 116 115 117 123 123 114 116 114 115 116 112 107 110 117 118 125 128 122 129 133 130 127 124 127 130 138 141 140 145 159 165 170 196 224 231 246 239 242 249 244 238 235 239 246 244 231 125 59 53 34 32 29 32 37 39 35 33 29 25 25 23 23 25 29 33 32 33 34 34 34 33 33 34 31 33 32 32 30 30 32 32 31 31 33 32 31 29 30 33 34 38 41 41 42 43 43 41 39 40 40 42 37 36 36 36 39 40 40 40 42 41 42 41 41 42 42 40 42 41 42 42 41 41 41 40 41 42 43 43 42 43 42 42 42 42 41 43 45 42 41 41 43 40 39 36 34 33 32 30 31 30 31 31 30 29 28 28 28 27 28 28 30 27 27 28 27 27 28 27 26 28 28 30 30 31 30 31 30 31 29 29 27 27 28 26 25 26 26 27 26 27 28 29 29 29 29 28 30 30 30 30 29 28 29 28 27 27 27 28 29 33 34 33 33 35 34 30 20 20 17 19 22 36 51 77 157 160 156 145 150 150 156 150 142 154 169 178 212 234 245 246 248 249 248 238 245 247 247 249 247 241 243 240 237 245 243 243 242 235 235 238 240 227 174 139 135 141 123 117 120 117 105 99 93 86 94 103 110 119 133 129 138 140 129 126 124 91 36 21 12 12 10 12 12 12 16 23 26 17 15 15 15 14 18 20 24 25 26 31 32 34 36 36 37 36 38 38 44 51 51 51 50 50 47 44 43 44 42 39 36 38 38 39 41 38 41 40 39 37 35 35 36 35 36 35 36 36 34 33 33 35 36 35 35 37 38 38 40 39 35 34 33 33 32 30 29 29 28 27 27 27 25 25 24 25 24 24 24 24 22 25 24 23 24 23 24 23 23 24 24 24 23 23 23 25 24 25 25 24 26 27 27 28 28 30 30 29 30 28 29 29 28 27 26 26 25 28 26 26 26 25 26 28 28 27 25 26 26 27 27 26 24 26 26 28 28 28 29 29 32 36 37 37 37 38 41 42 43 43 44 43 43 45 47 45 46 45 47 46 41 34 24 20 20 27 36 32 30 28 34 38 88 150 117 115 118 119 116 118 119 111 113 113 111 110 112 112 113 113 118 118 112 113 111 113 113 111 110 111 111 114 111 111 112 113 113 116 111 110 112 111 107 113 117 118 116 113 115 112 109 108 108 106 104 109 118 126 121 119 120 121 126 124 124 126 130 133 133 134 132 126 127 129 132 136 131 137 193 205 212 232 236 244 240 238 244 237 220 103 60 49 30 31 28 31 36 36 35 33 28 26 23 23 25 26 33 36 35 36 36 34 35 34 33 33 33 33 32 32 31 30 30 30 31 32 31 32 34 34 31 31 32 35 40 41 41 40 40 39 38 40 40 41 38 37 36 36 38 40 42 40 42 43 42 41 39 40 41 40 42 42 42 42 42 41 42 40 42 41 42 43 41 42 43 42 43 42 43 43 43 42 43 41 42 41 37 36 36 35 32 31 29 31 31 31 30 30 29 29 29 28 27 28 28 27 28 28 27 28 28 27 26 27 29 30 31 32 31 31 31 30 30 29 27 27 27 26 27 26 27 27 27 27 28 28 28 28 29 28 31 31 30 29 28 27 26 26 28 29 28 29 30 33 35 36 36 36 37 32 22 20 18 18 19 29 46 61 135 160 159 150 147 156 159 162 184 207 233 238 247 244 249 251 247 245 245 240 243 240 238 248 245 243 245 242 237 242 243 239 239 243 243 247 222 175 143 138 134 135 129 140 146 132 127 125 121 120 117 117 119 119 119 119 128 129 125 117 121 93 37 22 14 12 12 12 12 12 17 23 29 18 15 15 15 16 19 19 23 25 26 31 33 34 36 36 38 36 38 40 45 51 49 50 49 50 47 44 43 43 40 39 37 38 40 41 41 39 40 40 39 39 36 35 36 36 35 34 35 34 32 32 33 35 36 36 37 36 37 38 39 39 38 34 32 31 29 30 28 30 28 27 26 26 27 27 25 25 25 26 24 23 22 23 23 22 24 24 23 25 24 24 24 22 23 23 24 24 25 25 26 26 26 25 26 27 28 29 32 29 30 29 30 29 27 27 28 27 27 29 26 26 24 24 25 27 26 26 25 25 26 28 28 25 25 27 27 27 26 28 29 29 31 35 39 39 38 38 41 42 43 44 43 43 43 44 45 45 44 45 46 45 42 35 25 21 19 23 34 34 31 29 31 38 65 144 125 110 115 120 117 120 118 112 108 113 114 112 112 117 119 117 119 122 122 114 112 110 111 112 115 115 113 113 111 112 110 106 112 116 111 108 108 107 108 112 116 114 109 111 114 112 110 111 109 108 111 109 112 127 129 119 116 122 121 121 120 128 133 130 130 131 134 128 123 130 132 132 127 117 125 131 152 193 222 235 237 240 247 236 205 92 54 43 31 29 29 31 36 36 36 33 28 25 24 23 25 28 35 38 37 37 38 36 35 34 32 32 33 33 31 31 33 33 31 30 32 33 31 32 33 34 30 30 34 35 41 43 41 40 38 37 39 41 40 40 39 38 35 35 37 40 41 42 41 42 41 41 41 40 41 42 41 41 41 41 41 41 40 41 41 41 40 41 39 41 41 42 42 41 43 42 42 42 42 41 41 41 39 37 35 35 32 32 32 30 29 29 29 28 28 29 28 27 27 27 27 27 28 28 26 25 26 26 26 26 28 28 29 30 32 31 30 30 30 28 29 28 28 27 26 26 27 25 28 25 27 27 28 27 29 27 30 30 29 28 29 28 26 26 26 27 30 29 31 32 34 36 35 35 36 35 25 20 19 18 19 22 40 50 93 154 159 151 142 169 216 234 247 247 251 249 242 235 235 244 247 249 246 240 230 228 235 244 240 245 250 243 242 244 242 234 239 242 238 204 152 145 151 146 144 142 147 149 156 149 132 134 133 128 129 133 129 127 126 120 118 117 119 117 123 90 37 21 14 12 13 12 13 12 17 23 29 18 15 16 15 17 17 19 23 26 28 31 30 33 33 36 35 38 37 40 46 50 50 50 50 52 49 45 42 41 40 39 38 37 43 43 42 42 40 38 39 39 39 36 35 34 35 34 33 33 32 32 35 35 35 36 36 36 39 39 38 39 40 36 32 30 29 29 27 28 26 26 25 25 26 26 25 25 26 25 24 24 23 23 23 24 24 23 25 25 24 25 24 23 25 23 24 22 24 24 24 25 24 25 26 28 28 30 27 29 30 29 30 29 27 26 28 27 26 27 25 25 25 25 25 27 27 27 26 26 27 27 27 27 27 28 27 26 25 28 31 31 31 34 38 38 38 38 39 39 43 44 45 44 43 44 45 46 43 45 46 44 43 36 23 22 19 21 29 34 32 31 27 36 49 119 138 108 105 109 113 115 118 119 111 108 110 113 118 119 123 120 119 120 120 116 113 112 112 114 113 111 113 111 109 114 115 114 118 115 108 106 101 103 107 109 102 107 108 112 111 112 115 111 112 114 117 118 115 112 112 115 115 119 120 125 121 126 129 127 129 135 135 125 122 129 132 131 123 121 121 121 125 134 150 175 230 243 248 245 179 75 50 40 31 29 29 33 36 35 35 31 26 24 24 23 25 26 33 38 39 38 38 37 35 35 35 33 32 33 33 33 34 34 33 30 29 31 30 32 32 31 30 29 31 35 41 44 43 40 39 40 40 41 41 42 39 38 36 35 37 40 41 42 42 43 41 41 41 41 41 42 42 42 41 40 40 41 40 42 41 41 40 41 41 43 42 42 42 42 44 43 44 43 42 42 41 39 39 37 35 34 34 32 30 29 28 29 31 29 27 27 27 27 28 26 27 26 27 28 27 26 26 26 28 27 27 26 28 28 30 29 30 30 30 29 30 29 27 27 27 24 26 26 27 26 26 27 28 27 28 28 30 30 29 28 29 28 26 26 27 27 28 28 31 32 33 35 36 35 37 35 27 23 19 18 19 20 31 43 75 134 159 154 142 161 247 243 240 244 244 244 246 244 239 241 246 251 248 241 230 230 245 250 244 247 246 243 245 246 247 249 249 236 204 162 145 149 151 150 147 147 142 146 152 148 141 142 142 131 135 138 135 132 133 133 127 127 130 120 123 92 34 21 13 11 13 13 11 12 16 22 28 17 16 15 15 15 19 20 24 26 28 32 33 33 35 36 37 38 36 40 47 50 51 50 52 52 48 46 43 42 39 38 37 37 41 41 42 43 40 39 39 38 37 35 34 33 36 35 33 34 33 33 33 33 34 34 36 36 37 37 38 39 38 35 31 30 31 30 28 29 27 25 26 27 26 26 26 25 25 24 24 24 24 24 24 25 24 24 22 23 23 25 25 24 25 24 25 25 23 25 25 24 24 26 28 28 28 29 29 29 30 29 28 28 28 26 28 29 27 27 25 26 27 25 27 27 26 26 25 26 26 26 26 27 28 27 25 26 27 27 28 29 30 34 39 40 39 39 40 40 42 43 43 43 43 44 44 45 44 45 45 43 42 38 23 22 20 21 25 31 32 32 28 34 39 94 150 113 111 112 115 120 122 118 112 106 106 108 118 122 121 113 113 115 114 117 115 117 117 118 117 115 115 109 113 114 112 110 117 121 108 106 101 102 113 116 111 113 114 120 124 113 112 114 119 118 121 121 117 119 114 117 122 118 120 123 117 117 121 125 126 123 124 116 112 117 114 121 116 117 123 121 123 136 137 139 170 216 240 243 155 66 50 38 31 28 27 32 37 34 33 31 27 23 23 22 24 25 33 39 40 39 39 38 37 36 34 34 33 32 33 33 33 34 35 32 29 31 32 33 31 31 31 30 32 35 40 42 43 42 41 42 43 43 41 41 39 37 36 36 38 40 40 40 42 41 42 41 42 42 41 41 41 42 42 39 39 41 40 42 43 42 41 42 42 43 43 44 44 42 44 43 43 43 43 42 42 43 40 39 37 35 34 32 31 30 29 28 30 29 28 28 29 28 27 27 27 26 26 27 25 26 26 27 28 28 27 27 28 28 29 29 30 30 29 28 28 28 26 26 27 26 25 27 26 26 26 27 28 28 27 26 27 28 27 26 27 26 27 28 29 30 29 29 30 33 34 34 34 36 37 35 30 25 18 19 18 17 24 42 54 104 161 159 149 138 220 237 239 249 246 248 251 247 246 249 248 251 245 242 245 244 249 248 248 245 243 246 241 244 245 243 216 183 149 147 155 159 153 143 138 142 145 147 148 139 137 144 140 135 134 136 132 132 137 136 145 147 141 128 114 87 36 22 14 11 12 12 12 12 16 23 32 19 16 15 14 15 19 23 24 26 27 32 34 34 35 37 36 38 37 39 47 49 51 50 50 50 47 45 44 42 41 38 37 39 39 39 41 42 40 41 40 38 36 36 35 35 34 32 34 33 32 32 30 31 33 33 35 37 37 35 35 37 37 35 31 29 31 30 28 28 27 26 26 26 24 25 27 26 25 25 25 26 25 24 24 25 23 23 25 25 23 24 23 22 23 24 25 25 25 25 26 28 27 26 27 29 29 28 31 32 29 30 30 28 28 27 28 28 27 26 25 26 27 27 28 26 26 26 25 25 25 26 27 27 26 24 27 26 26 28 29 29 30 34 39 39 38 38 41 42 43 43 43 42 42 43 45 45 44 45 47 46 44 40 27 20 18 19 21 27 31 30 29 30 38 61 149 122 118 117 110 112 120 120 115 109 106 109 115 117 115 112 111 113 117 118 121 118 113 117 118 117 115 117 116 114 113 114 117 123 103 102 100 102 117 119 114 111 106 113 112 112 113 113 121 115 113 112 113 118 117 120 119 115 115 113 111 115 115 117 124 124 115 111 110 113 122 124 111 109 114 119 123 136 129 126 130 149 220 242 121 56 46 34 29 28 28 34 37 35 33 29 26 23 21 23 24 26 33 37 39 39 39 40 38 37 35 35 34 32 33 34 36 35 32 32 31 32 32 33 33 32 33 33 34 34 38 41 43 43 42 41 41 44 42 41 40 38 38 36 38 39 39 40 43 42 43 42 42 42 41 40 40 41 42 39 39 41 40 41 41 40 39 39 41 44 44 44 43 41 42 44 43 45 44 44 43 43 42 40 37 36 33 32 31 30 30 29 28 28 28 29 29 28 28 27 27 27 26 25 26 26 26 26 26 28 27 29 27 28 28 29 29 29 29 28 28 27 26 26 27 26 24 26 27 26 25 27 27 27 28 26 27 28 26 26 27 25 26 27 27 28 28 30 31 33 34 35 36 36 36 37 33 26 20 18 18 18 20 33 50 84 146 159 155 138 165 186 193 203 209 220 232 229 238 245 246 243 245 246 252 252 251 247 244 243 247 247 243 245 240 198 161 155 145 140 150 151 155 157 150 151 150 151 147 141 148 149 149 140 137 144 138 139 137 138 144 147 147 144 146 97 36 22 15 13 14 14 13 12 17 23 30 18 15 15 15 16 19 22 23 24 27 31 34 35 36 36 36 37 37 39 48 51 52 50 50 51 48 46 44 41 39 37 37 37 40 39 40 40 41 41 39 37 36 36 35 34 34 33 32 32 33 33 31 31 33 33 36 36 35 35 38 38 36 34 32 30 30 30 29 28 28 27 27 26 26 25 26 26 24 25 25 24 24 23 24 24 23 23 25 23 24 23 26 23 24 23 25 25 25 25 25 27 28 27 27 27 28 29 29 29 30 30 28 28 26 28 28 27 27 27 26 27 27 27 27 26 27 27 25 24 25 27 26 27 26 25 27 27 27 27 29 28 31 35 40 39 38 39 42 43 45 45 44 43 42 43 44 46 43 44 45 44 44 41 30 21 17 19 20 25 31 31 31 30 38 48 137 137 118 118 114 115 119 121 116 113 116 116 115 115 115 115 113 117 116 118 114 111 111 111 114 118 122 124 119 113 115 119 114 116 109 103 103 106 111 109 109 112 115 119 119 120 122 119 111 108 110 107 111 116 118 122 116 110 109 109 109 112 113 110 109 106 105 101 102 109 113 117 113 113 112 115 120 125 124 123 118 122 173 232 93 53 43 31 28 27 30 35 38 35 34 28 26 24 22 25 24 28 35 39 41 40 39 38 39 37 36 36 33 32 33 33 32 32 32 32 33 32 31 32 32 31 31 31 33 36 38 41 43 43 42 39 40 44 45 42 42 40 39 38 39 39 40 39 41 43 43 44 42 43 41 41 40 41 40 40 40 40 41 41 40 40 40 42 43 44 42 43 42 43 41 42 43 44 44 44 42 43 42 41 36 36 36 34 32 31 29 29 29 30 27 28 30 29 28 28 28 27 26 26 26 26 26 27 28 28 28 29 28 28 28 30 31 32 30 29 28 28 28 28 26 26 25 25 26 26 25 25 27 27 26 26 28 28 26 27 26 26 26 26 26 26 25 28 31 31 34 33 35 35 35 35 34 30 22 18 16 17 18 23 40 61 121 153 157 147 149 168 174 174 171 173 172 171 172 176 184 197 203 206 210 213 216 229 241 237 237 251 250 228 170 149 148 149 149 148 146 148 148 148 145 151 161 158 149 140 141 146 151 142 142 147 141 136 129 134 140 144 137 136 147 98 36 22 15 12 12 12 12 13 17 23 25 15 14 14 13 15 16 21 24 26 29 31 33 34 36 37 38 36 37 39 50 52 50 50 52 52 49 47 45 42 41 37 37 38 41 41 41 42 41 41 38 36 35 36 34 33 34 33 33 31 33 32 32 32 33 33 34 36 35 37 39 38 36 33 31 30 29 30 30 30 28 28 26 27 26 28 25 25 25 25 27 24 23 22 22 23 23 23 24 22 24 25 23 24 24 24 23 24 25 25 25 27 26 26 28 27 26 26 27 28 29 32 31 30 28 27 27 25 26 26 27 26 28 26 28 26 26 26 26 27 27 27 26 26 26 27 28 27 26 28 30 30 31 35 39 38 37 39 39 43 44 45 45 44 43 42 44 45 45 45 46 46 44 39 33 22 19 18 17 22 27 30 32 29 38 39 106 148 117 120 114 114 117 114 111 116 115 115 114 113 114 115 116 118 116 116 115 114 117 117 118 115 118 119 117 116 115 112 116 120 113 109 109 111 111 111 108 113 116 117 122 123 120 120 119 115 113 114 121 121 114 117 121 117 118 118 115 117 113 109 109 104 99 100 107 114 114 107 107 104 103 106 111 112 115 114 113 115 145 208 62 49 40 30 27 27 30 35 37 34 30 26 24 23 22 25 24 26 34 39 40 40 39 38 40 38 37 36 33 33 34 32 34 32 32 33 33 31 31 31 32 32 30 31 32 36 39 42 45 44 45 44 43 43 43 40 40 39 39 38 37 39 41 42 42 43 42 43 43 44 43 42 39 41 41 42 41 40 41 41 40 40 39 40 42 41 42 44 43 42 42 44 43 42 44 44 43 43 42 42 39 37 37 35 32 31 30 29 29 29 27 28 27 28 26 27 28 27 27 28 26 26 27 26 27 27 28 29 27 28 28 29 30 30 30 29 27 28 28 27 26 26 26 26 27 26 27 26 29 28 26 28 27 27 28 29 26 26 26 26 27 27 25 26 30 31 33 35 34 34 36 37 35 31 22 18 17 16 17 20 36 46 91 146 154 151 144 156 179 178 178 179 180 180 179 178 177 177 177 176 175 175 176 178 185 185 191 204 207 184 164 155 148 152 153 147 142 142 145 145 145 142 150 158 155 151 151 153 155 144 141 151 140 135 136 134 141 141 136 142 152 99 35 22 15 11 12 12 11 12 17 24 27 17 14 14 15 15 17 21 26 26 28 31 33 33 35 35 35 36 36 39 49 51 50 49 51 52 49 46 45 42 42 38 39 39 40 41 43 44 42 42 39 36 36 37 34 35 34 33 33 33 32 32 33 32 34 34 35 37 37 38 38 39 36 34 32 31 30 29 29 28 27 27 29 28 25 26 25 25 25 24 25 25 25 24 23 23 23 23 24 23 25 25 22 25 26 26 24 24 24 25 27 27 28 28 30 29 27 27 28 29 30 32 32 30 26 27 29 27 27 27 28 26 26 26 26 28 26 26 26 26 26 27 26 27 27 28 27 27 28 28 29 30 29 33 38 39 39 39 40 45 46 47 45 43 43 42 41 44 46 44 45 47 45 42 35 24 18 18 17 20 24 29 30 28 32 40 80 152 120 114 117 119 119 116 116 118 116 115 117 119 115 115 114 113 114 115 123 124 121 121 118 118 116 113 114 118 122 120 118 116 115 112 113 115 115 113 110 113 114 116 122 120 118 117 116 117 115 117 121 119 111 109 112 110 112 114 117 121 120 112 105 107 101 107 121 118 102 100 101 98 98 99 104 108 107 111 114 110 137 183 50 48 35 30 26 26 30 35 36 33 29 25 22 21 23 24 24 26 33 37 40 40 40 38 39 37 37 36 34 34 35 33 33 31 32 33 33 31 32 32 34 32 31 32 33 35 39 41 43 46 46 45 44 44 42 39 40 39 39 39 36 37 39 42 42 41 43 44 43 43 43 42 41 41 41 42 41 42 43 43 42 42 41 41 41 41 42 44 44 43 41 43 43 43 43 45 43 42 43 41 38 36 35 36 32 31 30 29 30 29 30 28 27 28 26 27 27 27 27 26 27 26 26 25 26 25 26 27 28 28 29 30 31 30 29 28 29 27 27 27 26 27 26 26 27 27 27 27 28 29 28 29 28 28 28 30 27 27 27 27 26 26 25 25 29 29 32 34 35 36 36 36 34 33 23 20 19 17 17 19 27 43 65 120 155 155 145 139 177 180 180 181 181 181 181 183 182 181 183 181 182 180 181 179 177 177 176 175 172 174 174 173 172 172 169 165 166 164 161 152 144 142 140 144 147 153 155 146 145 138 138 141 148 137 141 145 153 147 138 137 140 98 34 22 14 12 13 13 14 13 18 24 27 17 15 15 16 15 17 20 25 27 29 31 33 34 34 35 34 37 37 41 50 53 52 51 50 52 45 45 47 43 42 37 36 37 43 43 43 43 44 41 39 36 36 36 35 35 33 33 34 33 31 33 35 34 34 34 37 37 37 38 37 37 35 34 33 30 28 28 29 29 26 26 29 29 26 25 24 25 25 24 24 25 25 25 23 23 24 23 23 24 24 24 23 24 25 24 25 25 24 25 25 24 25 27 30 29 28 28 29 30 30 31 32 32 27 28 27 26 27 26 26 26 26 26 26 27 28 27 25 26 25 25 24 25 26 27 26 26 28 28 31 30 32 35 38 38 39 39 40 45 44 46 46 44 43 42 42 42 43 43 45 45 44 41 35 25 17 16 17 18 22 27 30 31 29 39 58 137 130 114 122 122 119 116 117 118 119 117 118 118 119 119 112 113 115 119 121 122 119 121 125 127 122 114 109 110 116 116 118 117 120 113 112 111 112 116 108 108 113 115 114 118 119 116 113 115 120 127 120 112 113 121 121 119 112 107 113 128 125 118 114 116 113 112 117 114 111 115 109 107 109 113 115 114 115 120 118 114 157 147 49 46 32 30 25 28 32 35 35 33 28 24 23 23 24 24 23 25 31 36 38 40 40 38 39 38 38 36 34 34 35 34 31 31 33 33 34 33 31 32 32 33 33 33 32 35 40 42 45 46 47 47 43 42 42 43 40 39 39 40 38 36 39 42 43 42 45 44 43 44 42 42 42 42 42 41 41 43 43 43 42 42 43 42 42 42 41 40 44 44 43 44 43 43 43 44 43 44 43 41 40 38 37 35 33 32 30 29 29 29 29 29 28 28 28 28 26 27 27 26 26 26 25 25 26 25 26 29 29 29 29 30 31 29 29 29 29 29 29 28 26 26 26 27 27 28 28 28 27 28 29 28 29 29 29 30 28 28 28 28 25 25 26 27 30 29 33 33 34 36 37 37 37 35 27 21 19 18 17 18 22 37 56 95 154 156 149 141 162 180 179 178 179 180 182 183 181 181 183 183 183 182 183 182 179 179 177 179 181 180 181 180 182 183 184 183 184 181 178 177 172 171 167 168 166 165 161 161 160 154 157 157 153 145 152 156 156 144 145 149 154 104 35 21 13 13 13 14 14 12 17 25 26 17 16 17 16 15 17 20 26 28 28 30 33 35 34 35 35 36 38 42 49 53 52 51 51 49 44 44 46 44 40 35 34 37 42 43 44 45 44 42 40 37 36 36 35 34 33 32 32 31 31 32 34 34 34 36 38 38 38 39 38 36 36 34 32 30 31 30 29 30 28 26 28 27 25 25 24 24 23 24 23 24 24 25 23 23 24 23 22 23 24 22 22 23 24 23 23 24 24 25 25 24 24 27 29 28 28 29 30 30 30 31 31 32 28 28 26 25 26 24 24 25 26 27 26 27 26 26 25 26 25 24 23 24 25 25 25 26 28 28 32 34 34 34 37 38 38 38 39 42 43 46 46 44 44 43 42 43 43 44 45 44 43 41 34 25 19 16 16 16 19 25 30 32 29 36 47 122 145 119 123 123 118 114 115 113 113 114 116 116 114 115 112 116 117 119 120 123 122 123 122 120 120 118 111 108 114 117 124 122 121 114 112 111 114 116 115 113 112 113 117 116 117 117 116 120 123 121 111 109 114 120 123 123 122 120 120 121 130 129 127 126 125 124 121 112 114 116 115 116 115 118 119 121 123 123 122 120 196 121 53 43 32 28 25 27 33 36 33 31 26 22 22 22 22 23 24 25 30 34 37 38 38 39 41 39 36 36 34 35 35 34 32 33 33 33 32 31 30 31 31 32 32 32 33 35 40 41 45 47 47 47 43 41 42 43 41 38 38 37 36 37 38 41 43 42 43 44 46 44 44 45 44 42 42 43 44 44 42 42 42 42 42 42 42 41 41 40 44 44 44 44 43 42 44 44 43 44 43 43 40 38 36 34 34 31 29 28 29 29 29 29 27 26 27 26 27 27 26 26 27 26 27 26 26 27 27 28 29 30 28 29 30 29 31 30 29 28 28 28 26 25 26 27 27 27 27 28 29 29 30 30 32 31 29 28 28 28 28 28 27 27 27 28 30 29 32 33 36 36 36 37 37 36 31 23 20 18 18 18 19 29 47 72 145 163 151 148 152 178 178 176 178 177 179 178 179 179 180 181 180 179 180 180 180 180 179 181 181 182 183 185 185 188 188 191 191 189 187 187 186 186 186 184 183 181 183 183 181 177 174 174 175 174 174 174 174 171 168 168 174 115 34 21 14 14 12 12 13 12 16 26 27 16 15 16 15 15 17 20 25 28 28 30 35 36 35 35 36 38 40 44 50 52 50 51 51 49 44 42 44 44 40 38 36 36 41 42 43 44 43 42 40 39 36 36 36 34 33 32 33 32 33 34 32 32 36 37 41 40 40 41 38 35 34 32 33 31 30 29 29 30 29 28 27 27 24 25 25 26 26 27 26 23 23 24 23 22 22 23 23 23 23 23 23 24 25 24 23 24 24 24 23 24 26 27 28 28 27 28 28 29 29 30 30 30 28 27 26 25 26 25 26 25 25 25 26 27 26 26 25 25 24 24 24 24 25 25 27 29 28 28 30 32 33 34 38 39 38 39 41 43 44 45 44 43 43 42 42 43 43 43 44 43 42 42 36 26 19 16 17 16 16 21 27 28 28 33 36 91 153 127 118 115 113 115 114 114 113 114 113 116 120 117 120 119 116 113 115 116 119 119 117 119 118 114 116 114 112 110 116 120 117 114 115 114 119 115 115 115 112 116 117 116 120 121 115 113 111 117 117 116 118 116 111 115 120 123 124 119 125 131 130 128 121 116 118 115 106 105 112 110 114 118 114 120 124 124 123 149 217 100 52 40 29 26 26 27 32 34 32 29 25 23 22 22 22 22 23 25 31 34 38 39 38 39 42 41 37 36 35 32 32 33 33 33 33 33 31 30 32 31 31 31 32 33 36 36 38 40 44 45 46 45 44 43 43 44 41 39 38 37 36 38 40 41 43 42 42 45 48 45 45 45 43 43 43 44 43 42 43 41 40 42 42 42 43 42 43 41 43 43 44 45 44 43 44 43 42 42 43 43 40 36 37 35 34 31 30 30 28 28 29 29 28 27 28 27 28 26 26 26 26 27 26 25 27 28 27 28 28 30 28 29 29 30 31 30 29 28 28 28 28 26 27 28 27 27 27 28 29 28 29 30 29 29 28 29 29 28 26 27 26 25 26 27 30 29 31 33 34 34 35 37 36 36 33 25 20 18 19 16 18 24 42 54 126 165 158 151 153 174 180 176 178 178 178 178 179 178 179 180 180 178 178 179 180 180 180 180 180 181 182 185 186 188 189 191 194 192 189 188 187 188 187 187 187 189 189 189 187 184 183 183 184 182 180 181 180 179 177 177 184 119 36 23 14 13 12 11 11 10 15 24 27 17 15 16 15 14 18 21 27 29 29 31 34 36 36 36 38 37 39 44 51 51 50 50 51 49 41 41 41 43 40 37 36 39 42 42 42 42 43 43 41 39 35 35 35 35 34 34 35 33 32 33 32 34 35 38 43 42 41 43 40 36 34 32 32 31 30 29 29 28 29 28 26 27 25 27 25 25 26 26 25 23 23 23 24 24 23 23 23 23 24 24 24 25 25 24 24 24 26 26 24 26 26 26 27 28 27 26 28 30 29 30 30 30 30 28 27 26 26 25 27 26 26 25 26 26 25 25 26 26 25 25 25 25 26 27 28 29 27 27 30 30 31 33 35 38 38 39 41 44 45 45 46 42 43 41 43 44 46 45 43 42 41 42 36 28 18 14 13 14 15 19 26 29 31 31 35 69 155 125 109 114 113 114 110 113 115 115 115 117 120 118 116 117 119 115 116 116 120 117 117 120 120 115 119 123 124 114 114 119 115 110 112 110 110 111 114 120 114 112 114 115 118 119 117 109 105 113 119 118 116 111 104 112 120 119 116 117 117 116 119 117 110 107 117 121 113 115 123 122 120 126 121 123 127 125 128 191 212 87 51 39 28 26 26 29 32 33 30 28 24 22 22 23 23 23 22 24 30 33 37 40 41 40 41 40 37 35 34 33 33 33 34 33 32 32 32 33 32 31 32 31 32 33 34 35 38 40 42 44 45 46 45 44 42 42 40 38 37 35 38 36 39 41 43 43 42 44 45 45 46 45 44 44 44 44 44 42 42 42 45 43 41 44 43 43 43 42 45 44 44 45 44 43 45 44 44 45 43 42 40 37 36 35 32 33 30 30 30 28 29 30 28 26 27 28 27 26 27 28 24 25 26 26 27 25 27 27 27 27 28 28 30 32 29 29 28 28 28 28 29 29 27 28 28 28 29 27 26 28 30 30 31 31 30 30 29 28 27 28 27 26 27 28 30 30 30 32 32 33 35 35 35 36 34 29 21 19 18 18 18 19 32 42 90 155 157 148 149 158 186 177 178 177 177 177 177 177 179 179 179 180 179 180 179 179 180 180 180 179 180 182 183 185 187 191 192 192 191 191 191 190 188 186 187 187 187 188 186 187 188 186 184 182 181 179 176 175 174 174 177 115 34 22 13 13 14 14 12 13 17 23 25 17 15 16 15 15 18 21 26 28 28 31 34 35 36 35 37 37 39 45 53 51 50 51 52 46 40 40 40 40 40 37 38 41 45 44 44 44 44 43 42 40 36 36 33 34 34 33 34 34 33 31 34 32 36 38 41 41 40 39 39 35 32 31 31 30 30 29 29 28 29 28 26 26 27 27 26 25 26 25 25 24 23 23 24 23 23 24 25 24 23 23 24 25 25 25 24 25 27 26 23 24 24 27 27 27 26 27 28 29 30 30 30 33 31 28 28 27 26 27 26 26 26 25 26 26 26 26 26 26 25 24 25 25 25 26 27 27 27 29 28 29 31 33 35 38 38 41 40 42 44 44 45 43 45 43 43 43 44 45 43 42 42 40 36 29 19 16 15 16 16 18 23 28 28 27 37 43 140 136 108 114 119 117 118 119 115 113 114 115 120 122 121 124 121 117 112 112 114 117 122 116 120 123 119 115 116 113 114 116 115 113 107 110 115 115 113 117 113 114 118 115 115 109 109 107 106 114 118 120 111 102 99 104 117 115 108 109 111 109 108 108 107 108 112 112 110 115 121 120 115 117 117 119 130 132 170 225 188 70 50 36 28 25 27 30 34 33 32 27 24 22 20 21 21 21 22 25 31 31 35 39 40 39 38 39 38 35 36 36 34 31 32 32 32 32 31 32 32 33 31 32 32 32 34 35 39 41 43 44 46 44 45 45 43 42 40 38 38 37 37 37 38 41 42 43 43 45 45 45 46 45 45 45 44 44 45 43 44 43 44 44 43 45 45 45 44 43 43 43 44 44 45 45 43 45 43 42 43 43 40 40 37 35 32 33 30 29 30 29 30 29 28 27 28 27 27 27 26 27 27 26 27 26 26 25 26 25 28 27 28 29 30 31 30 30 29 29 28 26 26 28 27 28 28 27 28 28 27 28 30 30 30 29 29 29 30 29 28 27 28 28 28 28 28 30 29 32 33 33 36 34 36 38 35 32 24 19 17 17 18 18 27 41 65 125 169 154 148 151 178 183 178 176 178 179 178 177 178 179 180 179 180 179 178 178 179 179 179 178 179 181 182 185 187 190 190 192 193 193 193 189 186 186 187 188 186 188 189 188 188 185 183 182 179 176 173 171 170 170 175 114 34 23 13 11 13 13 13 13 17 23 26 18 14 16 16 17 20 24 28 30 29 32 34 35 37 36 35 36 39 47 53 51 51 52 51 46 40 39 39 39 38 35 38 42 45 44 43 43 45 45 44 39 38 37 34 35 35 34 35 35 33 32 34 34 36 39 40 41 40 39 37 36 33 34 31 30 29 29 29 29 29 29 28 26 26 27 27 26 26 25 25 24 24 24 25 25 25 25 25 24 24 24 25 27 26 26 24 24 24 26 25 25 25 26 26 26 27 28 28 28 30 30 30 32 32 29 28 27 27 26 27 26 26 25 24 24 24 24 25 24 25 26 26 26 26 26 26 27 26 27 29 30 30 32 36 38 38 41 40 42 44 45 45 43 43 40 43 44 43 43 44 43 43 40 37 31 22 18 16 17 15 16 21 28 31 29 36 38 112 152 108 118 121 122 123 119 118 115 117 121 124 122 120 116 115 115 118 117 113 112 114 116 113 114 123 124 117 111 113 119 111 110 113 119 121 114 111 106 106 110 118 121 119 115 112 113 108 106 107 114 113 107 101 103 114 117 111 114 115 115 112 115 115 115 113 111 110 113 122 117 109 110 116 120 126 140 217 241 168 62 48 32 28 25 27 31 34 33 31 27 24 21 20 21 21 21 21 24 29 31 33 37 39 38 39 38 37 36 34 35 34 33 34 33 32 33 32 34 34 33 32 33 33 34 34 36 38 42 44 45 47 45 43 43 43 43 44 43 38 37 36 37 38 39 42 44 42 44 45 44 46 47 45 44 45 45 46 46 45 44 45 45 45 42 42 44 44 43 45 43 43 44 44 45 45 45 41 43 43 43 41 40 36 35 35 32 30 29 29 29 30 28 29 29 28 28 27 26 27 27 29 25 27 27 27 27 25 28 27 29 29 31 30 29 31 32 31 30 30 29 28 27 26 26 28 28 28 29 28 29 28 29 28 30 30 28 30 30 28 27 29 28 28 30 29 31 30 32 34 33 35 35 36 38 35 33 26 21 17 18 18 20 20 32 49 86 158 159 146 151 160 183 180 177 177 180 178 177 177 178 178 176 178 178 178 179 179 179 179 178 180 182 182 185 189 189 191 192 194 192 191 189 186 188 189 188 188 186 187 187 184 183 182 181 179 174 167 167 166 172 181 115 37 22 14 13 14 14 13 13 16 24 26 17 15 16 16 18 20 22 27 31 29 32 33 34 36 36 34 37 40 47 51 51 52 52 50 45 41 39 40 38 35 37 40 44 45 45 45 46 47 46 43 42 36 36 34 35 35 36 35 35 32 32 35 34 37 41 41 41 41 41 37 35 32 32 31 30 30 31 30 29 30 29 27 27 27 26 26 26 25 26 26 25 24 24 25 25 26 26 25 24 24 24 24 25 25 25 25 24 24 25 26 26 25 25 26 26 26 27 28 29 30 29 31 32 32 29 26 26 27 27 28 26 24 24 24 25 24 24 26 25 25 25 25 26 25 24 26 27 27 28 29 29 31 32 34 36 38 41 41 43 45 46 44 44 42 42 43 44 45 45 43 43 40 41 40 34 22 19 15 15 14 15 19 25 30 30 33 42 77 155 123 115 113 114 115 118 118 119 117 121 118 114 118 117 116 113 113 113 115 112 112 113 113 115 117 120 119 116 113 112 109 112 117 108 109 109 115 115 108 111 109 111 112 112 115 116 110 108 110 106 102 101 105 106 111 107 111 114 120 120 112 112 112 116 115 116 119 121 122 124 119 116 126 123 128 183 241 244 137 56 45 32 26 25 28 30 33 33 29 24 22 21 19 19 20 22 23 26 30 31 33 37 40 39 39 38 36 37 36 36 33 31 33 33 34 33 31 32 33 34 32 32 34 36 34 36 41 43 44 44 46 42 43 43 43 42 45 43 39 37 35 36 36 37 41 42 41 43 43 43 45 44 46 45 45 46 46 46 45 45 48 46 43 43 44 44 44 43 44 44 44 45 46 45 46 45 41 43 43 44 41 40 39 36 36 34 32 31 29 29 30 30 30 29 28 29 28 27 28 28 27 26 27 28 28 28 26 28 28 30 28 29 30 31 33 33 31 31 30 30 30 29 27 26 27 27 28 28 26 27 28 28 29 31 30 31 30 30 29 28 28 28 28 28 28 30 31 32 33 33 34 35 35 37 34 33 27 23 19 17 18 18 20 26 44 59 136 159 144 148 151 179 180 178 180 180 179 176 175 177 179 177 176 176 178 178 179 179 180 178 180 182 184 189 191 192 194 195 195 193 192 189 188 186 185 189 188 186 186 184 184 183 181 180 176 171 166 165 172 178 189 121 37 21 14 14 13 13 12 14 17 25 24 16 15 16 16 18 20 24 29 32 29 32 34 34 34 35 36 38 41 49 53 52 51 53 50 45 43 40 39 38 34 36 40 45 45 46 47 47 47 47 45 42 37 35 34 35 35 36 35 36 34 31 35 35 39 41 41 42 42 41 36 35 33 32 31 30 29 29 30 29 29 27 28 27 27 27 27 26 25 25 24 25 25 25 25 25 25 25 23 23 23 24 24 24 24 25 26 26 26 25 24 24 25 24 24 26 27 26 27 29 30 30 32 33 31 28 28 27 26 26 25 24 22 22 25 27 26 25 24 25 25 25 25 25 25 23 24 26 25 26 28 29 32 32 34 36 39 43 41 42 41 42 44 43 44 41 41 44 44 44 43 43 41 41 37 33 24 21 16 15 14 15 18 20 28 32 31 39 57 147 134 118 118 115 119 117 115 115 115 118 117 113 116 118 121 120 115 118 117 117 118 116 118 120 119 114 114 113 112 110 111 110 114 112 114 110 115 118 112 113 111 110 115 110 120 127 115 111 113 110 113 106 104 107 108 105 114 124 124 120 121 118 115 114 109 116 123 128 124 122 117 119 127 124 149 216 236 239 104 55 44 32 26 24 29 30 32 33 29 25 22 20 19 19 20 21 23 26 31 32 33 36 41 40 40 38 37 38 36 36 33 32 33 32 33 33 32 33 32 34 32 32 35 35 35 37 39 42 45 45 46 42 42 41 42 42 42 41 41 38 36 38 39 38 41 43 42 41 44 43 45 46 45 46 45 45 45 44 45 45 46 45 44 43 44 44 43 42 44 45 45 47 48 46 45 47 45 44 44 43 42 40 39 38 38 37 32 31 31 31 29 29 31 29 29 28 28 27 27 27 27 28 28 28 27 27 27 27 29 29 29 29 31 32 33 32 33 32 30 30 30 30 27 27 28 26 26 27 27 26 27 28 30 30 28 30 29 29 29 29 27 27 27 26 29 30 31 31 32 34 35 35 34 35 36 38 34 26 21 19 17 19 18 20 37 46 99 155 148 145 146 159 190 181 182 181 179 179 178 178 178 178 177 178 178 178 179 180 183 183 183 184 187 189 192 195 197 195 194 191 189 188 185 186 187 188 190 187 186 184 182 180 176 172 170 167 167 172 183 193 205 123 37 22 15 14 12 13 13 13 17 23 23 16 14 16 15 16 20 23 28 30 30 32 35 35 35 35 36 38 43 50 51 51 52 53 50 43 43 41 38 36 36 36 39 43 45 45 45 47 46 47 45 41 37 36 35 34 35 35 36 37 34 33 34 38 39 40 40 42 40 38 36 34 32 31 30 31 29 29 30 29 28 27 28 27 27 26 27 26 26 26 25 24 25 26 26 26 25 25 24 24 23 24 25 24 25 24 26 27 25 26 24 25 26 25 26 27 26 27 29 29 31 29 31 33 31 28 26 25 26 27 24 24 24 24 26 26 25 25 27 28 25 25 26 24 26 24 25 26 27 27 28 29 29 31 34 35 37 41 42 43 45 44 43 43 43 42 41 42 43 44 43 41 42 43 43 36 24 20 17 15 13 15 16 18 25 30 28 36 48 123 171 167 119 120 122 122 122 120 116 123 124 123 123 122 122 118 121 119 120 121 118 113 116 117 118 120 121 118 113 109 113 116 117 118 117 118 117 119 114 116 115 110 115 111 122 128 119 114 114 116 111 106 108 108 110 112 115 117 113 113 118 118 118 117 115 124 126 130 117 111 113 119 127 125 203 242 240 227 76 55 41 29 26 26 28 31 33 33 28 22 22 20 19 19 20 22 23 27 31 32 33 36 41 41 40 40 40 37 35 35 35 33 34 34 34 35 33 32 32 33 31 32 34 34 36 38 39 41 42 41 44 43 43 42 42 42 42 40 40 37 36 36 38 37 41 43 43 43 44 44 46 46 45 46 45 45 48 47 47 46 47 47 45 44 44 43 42 43 44 44 46 47 47 47 47 48 47 44 43 43 43 41 39 38 38 35 33 32 31 28 29 29 30 30 29 29 28 28 28 29 27 27 27 27 27 28 28 27 29 29 28 28 30 31 33 33 32 31 30 30 30 29 29 28 28 28 28 28 28 28 28 29 29 28 29 29 29 30 29 28 28 28 27 27 31 30 31 31 32 33 35 35 34 36 35 37 32 27 21 19 18 19 18 20 30 43 72 135 152 145 147 151 178 184 179 180 178 180 179 180 179 179 181 180 179 178 179 180 183 184 184 185 188 190 195 198 195 196 194 191 186 186 187 191 191 190 189 187 183 182 176 174 169 168 166 169 175 187 198 203 208 121 37 24 14 14 13 14 13 14 16 23 25 17 15 16 15 16 19 24 29 29 30 32 35 34 34 35 35 37 44 51 54 51 52 53 46 42 42 43 40 37 36 36 39 43 46 45 45 46 46 46 47 42 39 36 37 36 36 35 36 36 35 34 35 38 39 41 41 41 38 36 35 34 33 33 31 31 31 31 31 31 29 28 27 27 27 26 27 24 25 25 25 25 25 25 27 26 25 26 25 23 23 25 24 24 25 25 25 27 25 26 25 24 26 25 24 25 27 27 29 28 30 30 31 31 30 29 26 25 25 28 25 24 25 23 26 25 24 27 27 25 25 24 27 25 26 25 25 26 27 27 28 29 29 32 35 35 37 40 41 42 43 44 42 43 40 41 41 42 43 43 44 44 43 46 43 37 25 20 16 14 14 15 16 16 23 29 29 33 40 95 165 143 121 120 118 125 130 128 125 134 149 139 124 119 119 117 120 120 120 123 121 119 114 115 121 121 121 118 116 111 117 120 115 114 113 113 116 120 117 115 118 107 112 115 124 123 122 124 124 123 108 105 103 105 112 114 124 127 118 109 117 113 116 118 116 122 131 133 117 114 117 127 135 160 236 250 251 218 67 54 38 29 27 28 28 31 33 31 27 23 21 20 19 19 19 21 24 27 31 32 33 37 40 41 41 41 40 38 34 34 34 33 33 34 34 33 34 33 34 33 32 33 35 36 36 38 40 41 42 43 44 43 43 42 41 40 38 36 36 36 36 36 37 38 40 41 43 44 45 45 46 46 46 45 48 47 47 48 46 46 47 47 46 44 45 43 44 44 44 44 45 47 47 47 48 47 46 44 43 42 42 41 39 39 37 35 33 31 30 28 30 31 31 29 30 29 29 28 28 28 28 26 27 29 27 26 27 26 28 28 28 28 30 32 32 31 32 31 32 31 29 31 30 28 28 27 26 28 27 28 29 28 27 28 28 28 30 30 31 29 27 26 28 28 29 29 32 31 32 33 35 35 35 36 35 35 34 30 23 20 20 19 18 19 23 35 54 98 151 146 144 148 162 187 180 178 176 177 177 177 178 178 178 177 178 180 180 181 184 185 186 186 188 192 195 198 199 199 196 194 190 190 192 192 192 190 186 183 180 172 169 168 166 169 177 183 194 204 207 207 198 112 35 23 15 14 15 15 13 13 16 23 25 18 15 16 17 17 19 23 29 30 31 33 34 34 35 34 36 38 45 54 55 51 53 53 47 42 42 43 40 36 35 36 42 45 46 46 46 46 46 45 44 40 40 38 36 35 35 35 35 35 35 37 37 38 39 40 41 42 39 39 34 33 33 32 31 29 30 30 30 29 29 29 28 28 28 27 28 28 27 26 26 25 25 25 26 25 25 25 25 24 25 25 25 25 25 27 26 28 27 27 26 25 25 26 26 25 26 26 27 28 30 29 28 30 32 28 28 27 26 26 25 25 25 24 24 26 27 26 25 25 26 24 25 24 25 24 25 27 27 27 26 27 28 32 35 35 37 40 40 42 43 43 42 42 42 43 43 42 42 44 47 44 43 43 41 39 29 23 17 15 13 14 14 17 21 27 30 30 36 65 155 140 126 137 138 129 128 122 119 149 177 149 113 117 119 117 119 118 117 113 117 120 121 125 123 116 117 119 120 121 123 122 114 113 110 108 114 118 111 110 114 119 120 123 126 112 112 118 123 120 114 113 115 117 116 112 115 122 118 115 119 122 131 128 111 113 124 128 121 118 123 127 135 205 240 241 243 179 61 49 35 28 27 27 28 30 31 28 25 23 19 19 18 18 19 20 23 28 30 32 33 36 37 38 41 39 38 37 36 35 35 34 35 35 34 34 34 34 35 33 33 33 35 35 36 38 41 42 43 44 43 43 42 41 40 38 38 37 35 34 35 35 36 39 40 42 42 44 47 47 47 46 45 46 47 47 48 48 47 46 46 46 46 45 46 46 46 44 44 44 44 46 46 47 47 47 47 46 44 43 43 41 40 39 39 38 34 32 31 29 30 31 31 30 30 29 29 29 28 28 27 28 27 28 27 28 28 27 28 28 27 29 31 34 32 31 31 30 33 33 31 31 28 28 29 28 27 27 26 27 26 25 26 28 29 29 32 30 31 31 29 27 28 29 29 29 32 32 34 34 34 34 35 35 36 35 35 33 26 23 19 18 18 19 21 27 45 76 136 148 143 144 153 182 180 177 175 176 178 177 176 178 176 177 179 181 183 182 183 184 185 188 190 194 197 200 199 195 193 192 193 195 195 194 191 187 182 180 171 167 166 167 172 178 197 203 208 209 206 195 173 100 34 23 14 13 14 15 13 12 15 22 25 17 16 17 16 18 22 24 31 32 33 35 34 34 37 35 37 38 47 55 56 52 55 53 47 44 42 40 40 37 36 36 42 45 44 46 46 45 45 44 41 38 38 37 35 37 36 36 35 36 34 36 36 37 39 41 42 41 38 37 34 33 32 31 32 31 30 29 31 29 30 30 28 29 28 27 26 26 26 26 27 26 26 24 25 24 25 24 24 23 24 24 25 26 25 27 26 29 29 29 27 26 25 26 27 26 26 27 29 29 31 30 29 30 32 29 28 26 25 26 25 26 26 26 25 25 26 27 26 26 26 25 25 24 25 23 24 26 24 24 27 27 28 31 34 35 37 39 40 43 44 43 42 42 43 42 40 42 43 43 45 45 45 42 40 38 29 22 17 14 14 15 14 15 17 24 30 28 36 48 145 145 132 186 189 132 123 121 120 121 116 117 118 121 118 120 125 122 123 114 118 121 125 123 119 114 114 111 119 128 129 128 116 112 112 111 112 114 116 110 114 118 118 120 123 112 105 111 124 123 115 114 119 119 118 118 120 106 110 117 121 126 127 121 114 113 120 122 123 120 121 121 166 235 239 235 241 148 62 49 33 29 26 27 29 30 31 28 23 21 20 19 18 18 19 21 24 29 32 33 35 36 36 37 40 38 38 35 36 35 35 35 36 34 33 33 35 36 36 36 34 33 35 36 37 39 41 43 43 42 42 42 41 41 42 39 36 34 33 34 32 32 35 38 39 41 43 43 44 43 46 45 47 47 47 47 48 48 45 45 47 47 45 47 46 44 44 43 43 45 44 44 45 46 47 46 47 46 45 43 43 41 40 38 37 36 36 34 35 35 32 33 32 30 29 30 28 30 29 29 29 29 28 28 27 27 28 29 28 27 29 29 30 32 31 31 30 31 33 34 32 29 29 30 29 27 28 28 26 26 26 27 27 29 32 32 32 31 31 31 29 28 29 28 31 31 31 32 33 34 34 33 34 34 35 35 34 35 29 26 19 17 18 18 18 22 40 59 104 142 144 144 150 160 183 174 176 175 174 175 175 177 177 179 181 182 183 183 185 187 188 189 191 193 196 198 198 195 194 197 198 195 193 191 186 182 176 171 165 164 168 175 186 203 212 213 212 207 193 175 158 99 35 22 14 13 14 14 13 12 16 22 24 16 16 16 16 18 24 26 32 33 33 36 34 35 36 36 37 38 49 55 55 53 56 51 44 42 42 39 40 38 39 37 42 45 44 44 44 45 46 45 41 38 36 36 35 36 34 34 34 35 34 34 34 38 39 40 42 40 38 38 35 33 30 31 30 31 28 29 31 31 32 30 28 29 28 27 27 25 26 26 25 26 24 23 23 23 24 23 24 24 23 24 23 25 23 25 25 27 27 27 24 23 25 26 26 27 27 27 27 27 31 29 30 31 32 31 29 27 26 26 25 24 27 25 26 24 25 25 25 26 26 25 24 24 26 25 25 27 26 26 27 28 30 32 36 36 37 39 39 41 43 44 43 42 44 42 41 42 42 43 43 43 43 41 39 37 30 24 18 13 14 14 14 16 17 20 27 29 34 35 118 159 117 113 119 119 121 121 122 122 122 124 121 119 121 119 122 126 124 121 120 117 115 115 113 120 118 112 114 117 119 124 122 116 116 119 116 114 110 107 111 113 113 116 119 114 109 111 124 123 113 109 112 115 106 109 111 106 110 118 118 118 120 118 119 120 122 122 125 122 121 131 221 249 245 243 234 116 61 44 30 26 27 27 29 32 30 26 23 19 19 20 18 19 20 21 24 28 32 33 34 35 37 39 39 38 37 36 36 35 33 34 34 34 33 33 35 35 36 37 36 33 32 35 37 40 40 41 41 40 42 42 40 41 41 39 37 37 35 33 34 33 35 37 38 40 44 44 43 44 47 47 46 46 46 46 48 48 45 45 45 47 46 47 46 45 45 44 44 43 42 43 44 45 46 45 45 45 44 44 43 42 40 38 36 37 35 35 36 34 31 32 32 31 31 31 30 30 30 30 30 29 30 28 28 28 27 28 29 27 28 28 30 31 31 30 31 31 32 33 33 30 29 30 30 27 27 28 27 26 27 27 29 29 32 31 31 31 31 32 29 29 31 31 31 30 30 30 32 33 35 34 34 33 34 35 34 34 29 27 21 18 19 18 18 19 33 48 82 132 145 143 148 152 174 181 177 174 172 174 175 175 176 177 181 181 180 181 184 187 191 192 193 194 200 199 198 197 199 197 196 192 190 187 181 176 171 166 166 168 176 185 205 214 213 212 206 191 175 166 162 105 32 20 15 15 13 14 13 13 17 23 25 18 15 16 17 20 26 27 32 32 32 35 36 37 36 37 37 41 51 55 57 55 56 50 44 42 42 40 39 37 38 39 43 44 45 45 45 45 44 44 41 38 36 37 37 36 34 34 35 34 36 36 35 38 40 40 43 40 38 37 37 34 31 30 30 30 29 31 30 32 32 30 28 28 28 28 27 26 25 27 25 25 24 25 24 23 24 23 24 25 23 25 25 25 25 25 27 28 25 27 26 25 27 28 25 25 25 26 26 27 30 29 31 32 32 31 30 29 27 26 26 25 25 26 25 24 25 24 25 26 26 26 24 24 25 25 26 26 26 26 28 28 30 31 35 36 37 39 40 41 42 43 43 44 44 42 42 42 41 42 43 41 41 41 39 36 30 24 18 13 15 14 14 15 15 19 26 31 32 36 86 160 130 120 121 124 156 165 138 126 122 124 123 122 120 121 126 125 121 124 124 121 116 117 118 117 118 116 120 120 124 126 122 115 117 118 120 127 120 108 106 104 108 110 118 122 124 123 129 125 119 116 114 119 117 114 115 113 119 122 119 117 116 115 118 123 123 120 119 122 121 143 233 244 243 241 218 95 54 41 29 25 27 27 30 32 28 25 24 20 19 19 18 19 21 21 24 28 30 32 34 35 38 38 38 37 36 38 35 35 33 33 32 33 34 33 33 33 36 38 36 34 32 36 39 41 41 42 43 41 41 41 42 41 40 39 38 36 35 35 35 35 34 36 38 40 42 44 45 45 45 46 45 46 46 48 47 47 46 46 43 43 45 47 45 46 43 41 42 42 43 41 42 43 42 43 43 43 44 44 42 42 42 40 37 39 35 33 33 33 32 31 31 31 29 30 32 33 30 30 29 28 28 30 30 28 29 27 29 28 27 28 28 31 32 31 32 31 31 34 30 30 30 31 29 30 27 27 27 27 28 28 29 27 29 29 32 33 31 30 30 29 28 30 31 32 31 31 31 32 34 35 35 36 35 35 34 33 32 28 23 20 18 17 17 19 24 38 57 95 148 142 148 149 160 184 175 174 173 176 174 174 177 178 177 180 181 184 187 190 193 194 196 198 199 198 198 198 196 193 192 189 187 180 175 169 164 164 171 178 191 205 214 213 209 201 183 174 167 164 165 100 35 20 13 14 13 14 13 14 16 20 24 18 15 16 17 21 26 27 30 30 32 34 36 36 37 37 38 40 50 56 56 56 54 47 42 39 41 40 37 36 36 36 43 45 44 44 45 44 44 44 41 38 37 36 37 37 34 34 35 36 35 35 36 39 42 43 42 40 38 37 36 35 31 30 31 30 30 33 32 31 30 29 28 29 27 26 26 28 26 25 25 25 25 24 23 23 25 23 24 24 25 25 25 26 25 24 26 26 24 24 25 26 27 26 27 28 26 28 27 28 29 29 29 31 32 30 27 27 26 26 26 26 25 26 24 24 25 26 25 27 25 24 24 24 22 24 25 26 26 26 28 29 31 30 33 34 34 35 39 39 41 41 42 44 43 42 39 41 42 42 42 41 42 41 38 36 31 26 20 16 15 14 14 14 15 16 23 28 30 38 59 139 149 121 126 129 196 208 144 124 123 123 119 119 122 122 122 122 119 120 120 124 126 129 120 117 123 119 121 120 118 121 120 110 109 112 116 118 117 111 109 108 112 110 115 118 124 128 123 117 123 123 115 118 122 120 120 117 115 119 121 118 115 118 120 122 124 122 122 123 125 125 167 222 243 245 187 77 48 39 27 24 25 26 30 31 27 25 20 18 19 18 18 19 21 22 26 30 31 33 35 36 38 37 38 37 37 36 34 35 33 33 32 32 32 31 31 33 35 35 35 34 35 36 37 42 42 42 41 41 42 42 41 41 42 40 39 37 35 35 35 35 36 37 36 39 43 44 46 45 45 45 46 46 46 47 47 47 46 44 43 45 45 46 44 44 43 42 41 39 40 42 39 40 42 42 43 43 43 42 40 42 42 41 39 39 36 34 34 33 32 32 31 32 32 32 32 31 30 30 29 30 29 30 29 29 29 27 27 27 28 28 30 30 31 31 31 32 32 33 31 30 28 30 30 30 28 27 26 27 27 28 29 28 29 30 31 31 31 31 29 29 29 30 30 31 31 31 31 33 36 36 34 36 35 34 34 33 31 28 24 19 18 18 18 19 21 31 50 74 135 143 147 147 153 174 178 175 174 173 173 175 176 178 178 181 182 185 189 192 196 196 198 199 198 197 197 195 194 191 189 187 179 178 169 166 168 177 188 194 208 210 209 204 193 180 169 169 167 164 164 96 34 21 14 14 13 12 12 13 16 22 23 18 16 18 17 21 28 29 31 29 31 35 34 36 36 37 38 42 51 56 57 56 54 45 41 40 39 38 37 35 35 37 44 45 45 46 45 44 44 43 40 38 36 36 35 35 34 35 34 34 35 34 37 39 42 42 41 41 38 38 35 33 31 31 32 30 29 32 31 31 31 30 29 29 28 27 26 27 26 25 26 26 26 26 25 24 24 24 24 25 24 25 26 26 25 25 26 26 26 24 27 27 26 25 25 26 25 26 27 28 30 30 30 31 33 31 28 26 27 27 27 26 26 26 24 25 24 27 25 25 24 24 24 24 23 25 25 24 24 27 29 29 30 31 33 34 36 36 38 40 40 41 42 44 41 41 40 41 43 42 42 40 41 40 37 36 32 27 21 17 14 15 15 14 15 16 22 27 29 37 48 117 160 129 124 123 131 133 123 124 125 124 124 120 120 120 123 124 120 120 125 125 123 121 116 116 118 117 119 120 123 125 124 120 115 115 114 117 119 117 118 120 113 106 111 121 123 126 125 117 118 118 112 116 122 127 129 124 122 123 124 122 118 120 123 125 124 120 121 126 128 124 128 153 207 240 162 65 48 35 27 25 26 26 28 29 26 24 20 18 18 18 18 20 22 23 25 29 30 32 35 35 37 37 39 38 38 38 35 36 34 34 35 35 33 32 32 31 33 35 34 35 36 37 39 41 42 41 40 41 42 43 40 39 41 39 38 38 37 36 34 33 35 37 36 39 43 44 45 43 44 45 45 46 45 44 46 46 46 44 44 45 45 43 45 44 43 41 39 39 38 39 39 40 42 42 41 42 41 41 41 41 39 40 39 37 36 34 33 31 30 30 30 32 34 32 31 31 31 31 29 30 29 30 30 31 30 28 27 27 29 30 30 28 29 30 30 31 31 31 32 33 30 31 27 27 29 29 28 28 29 28 29 31 30 29 31 31 29 29 29 31 30 30 30 30 31 30 30 31 34 35 36 36 34 33 34 34 31 29 25 22 19 17 17 18 19 22 44 61 98 137 138 141 149 158 181 173 172 173 176 177 178 179 180 184 185 187 192 196 198 198 198 197 196 197 196 193 193 188 185 181 178 173 167 175 199 210 206 209 208 203 190 174 161 159 162 165 164 162 154 90 36 21 14 14 13 15 14 14 16 22 23 18 15 17 19 24 32 29 30 29 31 34 36 36 36 38 40 44 53 56 55 55 53 46 41 41 41 41 37 36 37 38 44 46 45 46 44 43 43 43 41 39 35 36 35 35 36 35 34 34 34 35 38 39 42 43 43 41 39 38 33 30 31 30 29 29 29 31 31 32 31 29 28 28 28 27 28 26 25 24 27 28 26 25 25 24 26 25 26 25 23 23 26 26 25 25 26 26 26 26 25 26 25 23 24 26 25 25 26 27 29 29 29 31 33 31 30 27 27 26 27 26 27 25 25 23 25 26 25 25 24 25 25 24 23 24 25 24 25 27 29 28 28 29 34 36 37 37 36 39 40 43 43 42 42 43 41 41 43 42 41 41 42 40 36 35 32 26 21 18 15 15 15 15 14 15 18 24 29 34 41 88 164 134 120 118 119 119 119 121 121 125 126 123 116 119 122 125 122 122 119 120 123 122 124 123 130 129 118 118 124 125 127 129 127 121 122 122 118 116 115 113 109 111 121 127 127 120 116 111 113 117 114 116 119 129 126 122 124 120 118 121 120 118 127 128 122 120 121 137 148 135 127 129 135 149 98 54 44 33 28 25 25 27 29 29 26 22 21 19 18 18 18 21 22 25 28 30 31 30 34 37 35 38 37 36 37 35 37 36 34 34 34 34 33 33 32 33 33 34 35 35 35 37 39 42 41 40 40 41 42 41 40 40 42 40 38 39 38 37 35 34 35 37 37 37 41 45 45 44 43 46 46 46 45 45 46 46 47 46 44 43 44 44 46 45 44 42 40 38 40 40 40 41 42 43 41 42 41 41 42 41 40 40 39 37 36 34 33 32 31 31 30 31 35 33 31 31 32 31 31 30 30 30 28 30 30 28 29 29 27 27 28 28 28 29 29 31 30 31 33 33 32 30 28 29 29 27 27 28 29 29 29 31 31 31 30 30 29 29 29 29 29 29 29 30 30 30 32 32 36 37 35 35 34 34 34 34 32 30 26 23 19 18 17 17 19 19 35 53 79 122 132 132 147 152 167 177 172 174 176 177 181 182 183 187 188 191 194 197 198 198 198 198 197 196 194 191 190 185 180 177 174 173 193 205 205 208 209 209 203 190 169 154 146 153 164 165 157 149 144 82 35 23 15 14 15 14 15 14 15 21 24 18 15 18 18 26 34 30 32 32 33 35 37 39 37 35 40 43 53 55 54 54 51 45 41 42 42 41 38 36 36 39 43 44 44 46 46 44 43 44 43 40 36 36 36 35 35 34 32 33 34 35 37 39 42 43 42 42 42 37 33 30 32 30 28 29 29 30 32 32 31 29 28 28 28 26 27 26 26 25 26 27 25 25 26 26 27 26 26 24 24 23 26 26 25 26 27 27 25 27 26 26 24 24 24 26 25 25 26 28 28 28 30 31 32 30 29 28 28 27 28 26 26 26 27 25 25 26 27 27 26 25 25 26 25 26 25 24 24 25 26 27 28 30 32 34 36 38 37 40 41 39 41 42 42 43 41 41 42 43 40 40 41 39 37 35 31 27 19 16 16 16 15 15 14 15 16 23 28 32 39 70 164 151 131 125 123 124 122 120 120 123 124 121 119 122 125 120 120 119 119 119 117 117 124 127 125 125 127 127 121 124 121 124 127 124 119 117 112 118 107 96 109 115 120 121 123 117 112 111 113 116 117 117 117 124 127 124 121 116 116 118 117 114 117 124 124 121 125 179 223 198 163 146 134 121 70 51 39 31 27 24 25 27 30 29 25 22 20 18 19 20 18 20 23 26 30 30 31 32 34 36 38 40 38 39 38 36 36 35 34 35 35 34 33 30 32 32 32 34 36 37 37 38 41 41 41 40 41 41 41 41 40 39 42 41 37 36 36 36 35 34 34 34 36 37 40 44 44 44 44 43 45 45 45 45 45 43 46 44 45 43 45 43 45 45 43 42 41 41 43 43 42 43 43 43 41 42 41 39 42 40 41 40 40 38 38 35 35 32 32 32 31 31 32 33 31 33 33 32 32 31 30 31 31 28 27 29 28 27 27 26 27 29 31 31 31 31 30 33 33 32 33 30 30 30 29 27 27 28 28 27 29 30 31 33 33 33 31 30 31 28 29 30 30 31 32 31 32 32 34 34 35 36 35 34 35 35 33 30 26 24 20 17 17 18 18 18 26 42 64 90 133 136 144 149 156 182 179 176 177 178 179 180 183 188 189 194 197 199 197 197 197 198 193 191 191 190 184 180 174 172 183 202 203 210 209 209 202 192 172 158 146 143 145 150 159 160 156 144 143 81 39 23 14 13 14 15 14 14 16 20 24 17 16 17 20 32 36 31 32 33 33 33 36 37 37 36 39 45 54 57 57 54 52 47 43 43 43 40 38 37 37 40 45 47 47 46 45 44 41 41 41 41 37 37 35 35 35 36 36 35 34 33 37 40 42 42 44 42 41 36 33 31 31 30 29 29 29 29 31 30 30 29 29 29 27 26 26 28 26 25 24 24 26 26 24 25 27 26 24 24 24 25 25 26 26 26 26 25 25 26 27 25 26 27 25 25 26 27 26 27 29 30 30 31 29 29 29 29 28 27 26 26 26 25 27 25 25 25 26 26 26 26 25 25 24 26 26 25 26 26 25 27 29 30 31 32 35 37 40 40 40 41 42 44 42 44 41 40 40 41 40 41 40 38 36 35 33 28 21 18 17 15 15 14 14 14 15 21 27 30 37 45 148 161 131 135 131 131 135 131 128 123 124 127 128 132 128 121 121 120 121 119 118 120 127 124 121 122 123 128 127 122 117 117 122 125 120 114 115 117 111 105 115 120 120 122 123 122 123 122 123 127 123 121 125 132 128 119 118 120 121 124 122 114 108 112 124 125 155 222 239 233 235 224 198 162 50 48 38 29 24 24 25 27 30 27 22 19 19 19 19 19 19 20 22 27 30 31 33 35 34 34 37 37 38 39 39 36 35 34 33 33 34 34 33 33 33 34 32 34 34 35 36 37 41 42 42 42 42 41 40 42 40 39 41 40 37 36 35 35 36 35 33 32 36 38 41 43 44 46 43 43 45 45 45 46 46 46 45 45 46 46 46 45 45 45 44 43 41 43 44 43 41 41 42 44 43 42 42 41 42 41 42 41 39 38 36 36 36 34 34 33 32 31 32 33 32 32 33 32 31 31 32 32 31 30 29 29 29 30 29 28 29 31 31 30 31 30 31 32 33 32 32 31 32 31 29 26 28 29 28 28 28 29 31 32 33 32 32 31 30 27 29 29 30 31 32 30 30 32 35 34 34 36 37 35 32 35 34 32 27 24 22 19 17 18 18 17 21 36 54 70 125 137 143 146 150 170 188 178 180 179 183 184 187 189 193 196 196 195 195 195 195 195 191 189 187 184 180 180 173 174 194 201 205 212 208 201 185 171 152 143 139 142 146 152 159 154 152 149 143 80 43 26 14 14 13 14 12 13 17 21 23 15 15 16 20 35 36 32 32 33 33 33 37 37 37 37 40 45 54 56 57 55 52 44 42 43 45 44 36 37 36 42 46 46 47 46 45 44 43 42 42 43 39 38 36 36 35 35 35 36 35 34 36 40 42 41 43 41 39 35 33 32 31 32 29 29 28 29 32 30 29 30 30 29 27 27 26 25 24 23 25 25 25 24 24 25 26 25 23 23 24 24 25 26 26 25 25 24 24 24 26 25 26 24 25 24 26 27 27 27 29 30 29 30 30 30 30 30 28 27 26 27 25 26 25 24 25 26 26 25 25 26 25 25 25 26 25 26 26 27 26 27 28 29 31 33 35 37 39 39 41 42 44 44 43 44 41 39 41 41 41 41 39 38 37 34 32 28 22 17 17 15 14 13 14 15 15 17 25 30 35 38 123 166 140 135 129 125 132 137 134 133 134 134 128 126 119 115 112 112 116 118 120 121 121 119 122 120 116 121 126 122 116 121 128 127 121 121 123 122 121 117 121 123 121 123 122 122 123 120 121 125 125 124 126 127 125 115 122 127 123 125 123 116 104 110 124 119 182 223 206 189 186 176 156 129 50 45 35 28 24 24 24 29 30 26 22 20 20 18 19 20 19 19 22 26 29 31 32 33 34 36 36 36 39 39 38 38 37 36 36 34 34 34 34 33 35 33 33 32 34 36 36 37 41 41 41 42 42 42 41 43 41 41 40 40 37 37 35 34 34 35 33 33 36 38 40 43 46 47 43 43 45 44 45 45 46 47 46 47 47 46 44 46 45 45 46 44 44 44 44 42 42 41 41 41 42 42 41 40 41 41 42 41 40 39 37 37 36 35 35 34 33 32 33 34 32 32 32 32 31 32 31 31 30 30 29 30 29 29 29 29 29 28 30 31 31 30 31 33 33 32 32 32 32 29 29 27 28 28 28 29 31 31 31 32 34 33 32 32 33 30 30 30 31 31 31 30 31 32 35 36 37 37 36 36 33 34 33 32 28 26 24 19 17 17 19 18 18 28 48 61 102 136 136 142 148 157 183 181 179 180 183 185 187 189 191 194 195 193 192 192 192 190 188 187 183 177 185 196 176 190 204 210 210 207 192 174 150 137 136 139 142 143 148 152 153 151 151 148 135 79 37 21 16 14 13 13 14 14 18 22 23 17 16 17 21 36 36 34 32 32 33 36 36 36 37 38 41 46 55 56 56 54 48 41 41 42 44 43 37 37 37 41 45 46 46 45 45 44 43 41 41 41 39 38 36 36 35 35 35 35 33 34 37 41 42 42 43 41 39 35 33 32 32 29 29 29 29 30 30 30 29 29 29 29 26 25 26 27 26 24 25 26 26 25 25 24 24 24 23 23 24 25 23 24 25 25 24 25 23 24 26 26 25 23 25 25 27 26 27 28 28 29 29 30 30 31 30 28 27 28 26 25 26 26 22 25 25 24 25 26 26 25 26 27 26 27 26 26 26 26 28 30 29 31 31 33 36 40 41 40 42 42 42 44 43 42 40 40 41 41 40 39 40 38 36 34 31 28 25 20 17 16 15 13 14 14 13 15 20 28 34 39 82 160 145 128 125 125 128 131 129 127 131 130 126 116 110 104 100 102 111 119 125 125 124 125 128 127 121 126 129 124 118 118 121 121 125 127 123 126 126 124 124 123 123 123 128 126 121 121 121 123 122 121 122 126 121 115 123 127 128 131 130 127 127 124 123 119 120 118 118 117 121 132 138 103 47 44 31 27 24 23 26 32 31 25 19 20 17 17 18 18 19 21 23 25 29 30 32 32 34 36 35 37 38 38 38 38 37 35 35 36 33 34 33 34 33 32 33 34 36 37 37 39 41 43 42 41 40 39 41 42 40 41 41 39 37 36 34 34 36 38 35 35 37 40 42 45 47 47 44 42 44 45 45 47 47 47 46 48 48 48 46 44 44 45 46 45 44 44 45 45 46 43 43 43 44 44 42 41 41 40 41 42 41 41 39 37 38 36 35 34 34 33 33 34 32 32 33 34 33 33 31 31 30 30 31 32 30 29 29 28 30 29 33 32 32 29 30 31 35 35 32 32 31 30 31 27 28 29 29 30 30 32 31 32 34 33 32 33 35 32 30 30 31 30 31 30 30 31 32 33 35 36 36 36 32 32 33 33 30 28 24 19 17 16 18 17 17 22 41 55 85 127 137 141 149 151 167 190 178 180 183 186 188 189 191 193 194 191 190 188 187 186 184 181 178 175 176 179 196 207 212 209 204 197 167 147 133 132 134 143 147 146 150 149 147 150 150 139 153 83 37 22 15 12 12 15 15 15 17 22 23 18 16 18 22 35 35 34 33 33 34 36 36 37 38 37 40 48 57 56 55 54 47 41 40 40 41 40 36 36 38 42 44 46 45 45 45 45 43 42 41 41 40 38 37 38 36 36 35 35 34 35 38 40 42 42 41 40 38 35 34 32 31 31 32 31 30 30 30 31 28 28 29 30 28 26 26 27 27 26 25 26 25 25 24 23 24 23 24 25 25 24 23 24 24 24 24 25 24 24 26 26 25 24 25 26 27 26 26 27 28 29 31 30 30 32 32 30 28 26 26 26 25 25 25 26 27 26 25 26 27 25 26 27 26 27 26 26 27 26 28 28 29 30 33 33 37 41 42 40 40 42 42 43 42 41 41 41 43 44 41 40 40 39 38 35 33 29 26 22 17 17 15 13 14 14 14 15 19 26 30 39 65 148 158 135 136 132 134 138 128 123 124 127 128 124 117 109 106 106 111 116 126 127 127 127 130 131 126 121 123 124 124 121 123 122 124 126 122 125 124 121 123 120 120 119 130 130 119 120 122 122 119 119 119 121 119 117 119 121 126 130 135 137 128 125 117 117 116 120 131 138 159 173 188 105 49 43 29 25 24 24 28 30 30 25 19 18 17 17 18 19 20 21 23 27 29 30 32 33 35 36 37 40 39 37 38 38 36 35 34 34 34 35 33 34 34 35 34 34 34 34 40 41 40 41 40 43 41 40 41 42 41 41 42 41 36 35 35 36 37 36 35 36 37 40 42 43 45 46 44 43 44 44 45 47 48 49 48 47 47 48 46 44 44 45 46 46 48 46 45 44 43 43 43 42 43 44 43 41 40 41 40 41 41 42 40 38 39 36 34 34 33 33 33 34 33 34 35 36 36 34 34 34 32 32 32 31 30 30 29 29 29 30 33 32 33 33 36 36 37 36 32 34 33 32 33 30 28 29 29 28 29 31 33 34 34 35 35 35 34 32 32 32 32 32 34 34 32 32 34 34 35 35 35 36 32 31 30 32 31 29 25 20 18 16 17 17 15 19 32 47 73 109 134 136 145 144 151 176 197 183 183 185 185 187 190 188 188 188 186 185 183 181 177 177 180 184 191 205 213 212 206 196 182 170 146 136 133 134 137 146 150 152 152 145 148 152 151 160 159 80 37 22 15 14 13 15 15 15 17 23 24 19 16 19 22 33 35 35 35 35 35 36 37 38 37 37 41 49 58 57 56 53 45 41 39 39 40 39 34 36 39 42 44 45 44 44 45 45 43 42 42 43 41 38 37 37 37 36 35 35 35 36 39 40 41 40 37 40 36 33 31 30 31 33 35 35 31 31 32 31 28 29 28 28 28 26 27 27 27 25 24 26 26 26 24 23 24 23 23 24 24 26 26 25 24 25 25 26 26 25 25 26 24 24 25 27 27 27 28 28 27 29 31 31 31 31 29 30 29 27 27 26 24 25 26 26 28 26 26 27 27 26 26 26 27 26 27 28 28 28 29 31 32 31 31 31 35 40 42 41 41 41 41 41 43 43 42 42 42 43 41 40 40 39 37 34 32 32 28 22 17 14 15 13 14 13 15 15 16 24 30 37 50 125 167 139 130 130 135 133 130 127 123 129 129 131 130 124 122 124 119 121 122 121 123 121 125 124 123 119 122 122 123 121 122 122 133 136 126 127 127 126 127 123 121 118 124 126 124 122 124 129 126 126 128 128 127 124 122 119 119 125 120 117 122 127 136 163 193 198 212 224 241 238 227 107 51 39 28 26 23 24 28 30 28 23 19 18 17 17 18 20 20 23 23 26 29 30 32 34 35 35 38 40 40 37 37 38 36 35 34 33 33 34 34 34 35 34 34 34 35 36 38 40 42 41 40 40 41 41 41 41 41 39 41 40 36 35 37 35 37 36 35 36 38 40 42 44 46 47 45 42 46 45 45 46 48 48 49 49 47 48 46 45 46 45 46 47 46 45 46 46 45 44 45 45 46 45 42 41 41 40 40 40 41 42 42 40 39 37 35 35 34 34 35 37 35 36 35 34 36 34 33 32 32 33 32 31 30 30 31 31 32 33 31 32 34 33 35 35 37 37 34 34 33 34 33 30 29 29 30 29 30 30 34 35 35 34 34 33 32 32 34 33 33 34 34 34 35 33 34 33 34 34 34 35 33 33 31 31 32 30 27 23 19 17 17 17 16 17 26 42 61 88 137 133 138 143 149 157 190 199 184 185 186 185 187 185 186 185 181 180 180 178 181 187 192 198 209 214 212 209 196 171 154 152 145 141 139 138 142 148 150 151 152 147 149 153 163 169 159 82 36 22 17 14 15 15 16 15 17 23 24 18 16 18 23 33 37 36 36 35 35 37 37 37 37 36 41 50 57 58 56 52 42 42 39 38 38 38 35 36 39 42 45 45 45 45 45 44 42 43 42 42 42 40 38 37 36 36 36 35 35 36 39 39 40 41 39 39 34 33 32 31 32 31 33 34 33 34 31 29 30 29 27 27 28 28 27 27 28 25 25 26 26 27 24 23 23 23 25 27 24 26 25 25 24 25 25 26 26 26 26 25 25 23 25 27 27 27 28 28 28 29 31 32 31 31 29 29 28 28 25 25 25 26 26 27 27 25 27 28 27 26 27 27 27 25 27 28 27 28 28 31 30 32 33 33 35 38 40 40 41 41 41 41 43 43 42 40 40 41 40 41 40 40 38 35 34 31 28 22 19 16 16 15 14 13 14 13 14 21 28 35 44 99 166 147 127 129 130 129 131 127 126 127 131 129 129 127 126 125 124 126 123 125 123 120 123 124 123 123 125 125 128 129 127 126 132 138 130 129 129 129 131 125 121 122 125 128 128 123 122 125 124 121 122 121 125 128 124 120 120 121 118 120 130 134 171 224 239 236 242 239 238 237 219 93 49 36 26 25 23 24 28 31 28 22 19 19 17 18 18 19 21 22 24 28 31 31 32 34 35 36 37 38 40 40 38 36 36 35 33 33 33 33 33 33 36 36 35 35 37 37 39 41 41 42 42 42 42 41 41 41 40 39 41 41 36 34 36 34 35 36 37 38 39 38 42 43 45 47 47 46 44 45 46 45 47 48 49 49 47 47 47 48 46 47 47 46 46 45 48 46 44 46 47 46 46 46 44 43 43 42 40 40 42 42 40 39 38 37 35 36 36 34 35 37 37 37 37 37 37 36 34 33 33 34 32 32 32 32 34 32 31 33 33 35 33 34 35 35 37 37 37 37 36 36 33 32 32 32 32 33 32 32 35 34 36 35 38 36 34 34 36 35 35 36 34 35 36 35 34 33 33 34 32 33 32 33 31 31 30 30 29 24 19 16 16 16 16 17 19 32 50 71 124 134 138 142 143 147 165 187 200 190 187 185 185 181 183 182 179 180 185 192 195 200 208 210 208 201 190 183 165 143 142 145 142 142 143 144 149 152 154 150 151 151 154 165 155 159 166 82 36 23 18 17 18 18 18 16 17 24 26 19 17 19 25 32 37 36 38 39 37 37 39 38 40 38 42 51 58 57 53 50 43 40 39 39 39 38 35 37 42 44 45 46 45 45 45 43 43 43 42 41 41 40 41 39 36 36 35 36 37 38 40 40 41 41 40 38 37 36 33 32 30 32 33 32 31 32 31 28 30 28 29 29 25 26 26 25 27 25 26 27 25 25 24 25 24 24 25 26 24 25 25 25 25 25 26 26 25 25 25 24 26 25 25 28 26 27 28 28 29 31 31 32 30 31 31 30 30 28 26 28 29 28 27 27 26 25 25 27 27 26 27 26 26 26 28 28 28 28 29 29 31 30 33 34 35 38 40 39 40 43 43 43 42 44 43 40 41 42 42 41 40 39 38 37 36 34 29 24 19 15 15 14 14 14 13 12 16 20 28 31 41 69 156 160 132 142 136 130 129 123 119 118 124 123 129 128 126 127 130 128 126 125 126 125 123 123 125 127 126 126 133 133 129 128 123 130 137 132 131 132 130 127 126 125 121 121 125 124 120 119 122 121 123 123 125 127 125 121 118 115 116 117 119 125 206 234 246 246 242 238 238 236 187 75 47 35 27 25 24 25 29 29 24 21 20 18 17 17 18 20 21 21 24 27 29 31 34 33 35 37 38 39 40 39 38 37 35 34 34 33 33 35 34 33 35 37 35 35 36 37 39 41 42 43 43 41 42 42 41 40 39 41 41 41 37 36 35 35 36 37 37 38 39 39 42 42 45 46 47 48 45 45 46 46 45 47 47 47 46 48 48 46 46 47 46 47 50 47 46 44 44 44 45 44 46 44 44 43 43 43 40 41 41 43 41 39 38 37 36 38 37 37 37 36 38 38 38 37 39 36 36 34 34 35 33 32 32 32 32 33 31 32 33 36 36 36 36 36 36 37 37 37 38 37 34 35 34 35 35 37 34 35 36 37 36 38 39 37 37 37 37 36 35 35 35 36 32 33 33 34 33 33 33 33 33 33 33 31 30 29 28 25 19 17 18 17 16 16 18 28 46 66 102 132 136 139 138 141 156 165 197 208 190 184 183 183 181 180 187 195 199 200 206 211 210 205 193 183 166 161 150 135 139 142 142 142 141 145 152 155 157 151 154 155 169 163 162 162 161 80 36 24 20 19 18 19 20 18 20 27 29 21 17 19 24 36 40 34 38 38 38 39 39 39 38 39 42 53 59 57 54 49 42 38 38 39 39 37 36 37 41 45 45 45 44 44 45 44 44 43 42 42 43 42 39 38 37 36 36 34 36 38 41 43 40 39 39 39 37 36 33 32 29 30 32 32 32 32 30 29 29 29 30 27 25 27 28 27 26 27 25 27 26 26 24 24 24 24 25 24 24 24 25 25 25 25 26 25 25 26 25 24 24 24 23 25 26 27 27 28 28 30 30 30 31 32 32 30 29 28 29 31 31 29 26 25 25 26 25 25 26 26 26 25 25 27 28 29 28 29 29 30 31 32 34 35 37 40 41 40 40 41 43 42 43 44 43 40 40 42 40 41 41 41 38 36 36 34 31 27 19 18 15 15 14 14 14 13 14 18 24 28 39 52 144 168 163 160 155 151 157 155 152 146 140 134 136 136 135 135 129 129 130 130 130 127 128 127 129 130 125 130 133 133 133 137 131 134 130 122 121 124 131 128 123 127 127 124 126 127 121 124 125 126 122 126 125 121 120 119 123 121 121 116 120 154 234 238 241 248 245 242 238 242 161 65 44 33 27 26 23 26 30 30 24 20 18 18 17 17 18 20 22 22 25 27 30 32 34 34 35 35 38 41 42 41 38 36 35 34 34 34 33 35 34 34 34 34 35 35 36 37 39 42 42 44 45 43 43 42 40 41 40 40 41 40 36 36 35 36 36 36 37 38 40 40 42 43 46 48 46 47 46 46 47 47 46 46 47 47 45 46 46 47 46 45 46 46 48 46 45 46 45 43 46 44 44 44 44 45 43 42 43 41 41 43 40 41 38 39 40 39 38 38 38 38 40 40 39 40 40 36 35 36 35 34 32 32 32 32 32 33 32 31 31 34 37 35 36 35 35 35 36 35 36 36 34 36 38 38 40 41 40 40 37 37 35 37 37 37 37 37 37 37 35 36 36 37 35 34 35 36 34 33 34 33 32 33 31 29 29 29 28 26 20 16 17 16 16 18 18 22 38 54 79 126 136 136 133 138 145 152 165 185 210 207 203 204 213 212 205 204 205 208 205 203 195 184 167 156 151 151 139 130 140 142 140 142 141 147 155 157 159 155 156 163 160 158 159 159 164 82 33 23 21 21 21 22 23 22 25 31 37 26 20 20 25 36 41 36 39 39 40 39 38 37 38 41 42 51 58 58 55 48 43 39 38 37 37 37 36 38 43 46 46 47 45 46 46 44 43 44 43 42 43 43 41 38 38 37 36 35 37 38 40 42 41 40 41 40 37 35 33 32 30 29 31 31 31 29 30 29 27 28 28 28 27 26 25 27 27 27 27 28 27 27 24 24 25 25 24 23 24 24 25 26 27 25 25 25 25 25 25 24 24 25 24 24 26 28 27 27 27 28 29 30 32 32 32 32 29 27 30 32 31 28 26 25 24 26 27 26 27 26 27 27 25 27 28 28 27 28 28 29 30 31 33 34 36 39 39 39 41 41 41 42 43 42 43 41 41 40 41 41 40 40 38 36 36 34 31 28 20 17 15 14 14 13 13 13 13 15 23 27 37 45 115 163 186 180 180 178 179 176 176 174 170 166 166 164 159 157 158 154 152 150 149 152 146 143 145 141 142 146 147 151 148 149 154 148 134 130 127 125 128 133 127 128 134 129 126 124 121 120 123 130 130 125 121 125 124 122 122 120 121 117 137 206 246 243 241 243 243 241 244 243 127 58 42 32 27 25 24 27 30 28 24 21 17 16 16 18 19 20 21 23 27 29 31 32 32 35 37 36 41 44 46 45 37 38 34 35 36 36 34 35 34 35 34 34 36 37 37 38 39 42 42 43 44 43 42 42 40 41 40 38 40 40 35 34 35 35 35 35 38 40 39 39 43 43 47 50 48 48 47 46 47 46 46 47 46 47 47 46 47 47 45 45 47 45 46 46 44 45 46 45 47 45 44 45 43 43 44 43 43 40 41 43 40 40 39 40 40 39 37 37 38 39 40 42 41 40 40 38 37 37 37 35 35 35 34 35 32 32 33 33 31 33 35 37 35 35 37 36 37 36 37 38 36 35 38 39 40 41 42 43 40 38 37 37 37 37 39 39 38 36 36 38 35 36 38 36 36 36 36 36 35 33 32 32 31 29 30 30 29 30 24 19 17 16 16 18 18 19 31 47 68 107 137 134 132 136 141 146 151 163 181 199 210 216 219 219 210 200 201 199 195 187 176 167 147 151 154 150 137 132 139 142 139 141 142 151 156 159 167 164 156 160 158 161 163 163 168 83 38 25 24 24 24 26 26 27 33 40 52 38 27 27 29 37 42 38 38 44 43 39 36 38 39 41 41 52 60 58 55 48 42 39 38 38 37 38 37 40 44 47 48 47 45 45 45 45 45 45 43 43 43 44 41 39 38 38 38 38 37 38 40 41 42 42 40 39 36 34 33 32 30 30 31 32 30 28 30 29 28 28 28 28 29 27 26 26 27 27 26 26 26 29 24 24 25 24 24 23 25 24 26 26 26 26 26 27 25 25 25 24 24 24 24 25 26 27 27 26 27 28 29 30 31 32 32 30 30 29 28 29 30 29 26 25 25 26 26 26 26 26 27 26 26 25 26 27 27 28 29 29 29 29 32 34 36 39 40 40 41 41 41 41 41 41 43 42 42 42 41 41 41 42 40 40 37 34 32 29 21 17 15 15 15 14 14 13 12 14 20 24 34 42 88 158 188 185 185 184 182 181 180 179 178 176 174 173 171 169 167 166 163 159 156 151 148 143 140 139 142 139 135 139 144 144 150 152 160 156 146 136 136 138 132 129 124 126 129 128 124 121 121 127 130 125 124 128 128 126 121 120 121 116 174 229 247 246 236 240 237 239 243 235 94 56 40 30 26 24 25 28 30 26 22 20 18 18 16 17 19 20 20 22 26 29 29 30 32 35 36 37 45 47 45 43 38 37 35 35 37 36 34 33 33 35 33 35 35 36 38 38 40 41 41 41 42 41 41 43 42 41 41 39 40 39 34 34 35 35 34 35 36 36 37 38 40 43 46 48 49 48 47 46 46 46 47 47 44 46 45 45 46 47 46 44 44 45 45 45 45 45 44 46 43 43 45 46 45 44 43 42 42 42 42 43 41 40 38 38 39 39 36 37 40 41 40 40 39 42 41 40 40 40 38 37 36 35 35 36 34 36 35 33 33 33 34 36 34 35 36 37 37 36 36 37 38 37 39 39 38 38 41 39 41 40 37 36 37 36 37 38 38 38 37 36 36 37 38 37 38 38 36 33 32 31 31 30 30 31 32 32 30 30 24 20 18 16 16 16 18 19 24 38 59 81 134 133 133 135 135 140 142 149 165 171 181 190 195 199 197 193 191 192 172 160 156 170 138 146 144 146 137 135 141 141 141 141 146 157 158 158 177 168 155 158 159 158 165 168 166 83 38 28 27 29 29 33 34 38 45 51 77 64 44 36 33 41 41 40 36 48 46 42 40 37 39 40 42 52 56 58 54 44 40 38 37 37 38 39 37 42 45 46 48 47 45 45 46 43 43 42 43 42 41 43 39 39 40 39 38 37 39 41 40 41 40 40 40 38 36 33 34 32 31 32 31 31 29 29 30 29 28 29 28 27 29 28 27 27 28 26 25 25 25 27 26 25 26 24 23 24 26 26 26 25 24 25 25 26 24 25 26 24 25 24 27 28 27 27 26 28 27 25 28 30 31 30 32 32 30 30 28 27 27 28 25 25 26 26 26 27 28 26 27 27 26 25 26 27 26 29 29 30 32 31 31 32 36 40 41 42 41 42 42 42 42 42 41 41 41 41 41 41 41 41 40 40 37 36 33 30 24 19 15 15 16 14 14 14 14 15 20 25 32 42 65 144 177 188 185 183 184 184 183 180 179 178 177 176 172 172 169 168 164 162 157 155 148 140 137 134 128 123 125 130 141 147 147 155 167 171 167 150 132 135 135 131 124 130 137 138 125 122 130 131 126 125 120 124 127 122 121 125 131 166 230 235 245 243 241 241 247 245 241 220 71 53 36 30 25 23 25 28 30 24 22 20 18 18 18 18 20 21 22 24 27 29 32 32 33 34 35 37 44 46 45 43 38 36 36 35 35 36 35 34 33 34 34 35 36 37 40 39 39 41 41 40 41 42 41 41 42 42 42 39 39 39 34 35 36 35 34 34 36 38 38 39 40 44 46 47 48 49 47 47 45 47 47 45 43 46 46 44 45 46 45 45 44 44 45 45 46 46 45 47 43 44 45 45 45 44 45 45 43 42 43 43 41 40 36 38 40 40 40 40 39 41 42 40 40 40 40 40 40 40 39 38 36 35 36 37 36 37 35 33 34 36 35 37 36 36 35 36 37 38 38 37 39 35 37 37 35 35 37 37 39 40 37 37 38 36 36 37 40 39 37 38 37 38 36 35 37 37 35 31 30 31 31 30 32 32 33 31 31 30 25 22 20 17 17 16 17 19 21 34 50 66 124 135 132 134 133 134 140 143 153 158 164 172 175 181 184 181 180 185 171 151 154 164 146 144 143 146 139 138 142 141 142 145 153 161 162 164 170 162 154 159 159 160 162 168 159 81 40 28 31 31 33 37 43 49 63 78 80 88 59 49 36 42 42 39 38 49 46 41 41 39 39 39 42 53 56 57 52 44 39 38 37 34 35 37 38 42 45 46 47 48 46 45 44 43 43 43 45 42 42 41 41 38 38 39 39 40 40 42 42 41 41 43 41 39 37 34 33 31 32 32 30 30 29 29 30 30 28 29 29 27 28 28 26 26 28 27 26 27 25 26 27 27 26 25 25 26 26 25 26 25 25 26 26 26 25 24 25 25 24 24 26 27 27 27 25 27 28 26 27 29 29 31 33 32 30 30 28 29 28 27 26 25 27 26 27 28 27 27 26 25 27 26 28 28 28 30 29 29 31 31 32 32 36 38 40 42 41 40 41 43 42 42 43 42 41 41 42 43 40 40 41 41 39 36 34 32 26 21 16 15 15 14 13 12 13 13 17 24 30 38 53 127 168 191 183 183 183 183 183 181 178 179 177 175 173 172 169 167 163 160 157 159 155 140 139 138 130 124 123 129 144 151 157 161 170 173 165 161 141 136 134 132 126 127 130 129 129 127 130 132 127 123 120 119 133 129 123 124 159 216 231 232 244 243 240 240 240 242 241 199 64 51 35 28 23 24 27 29 28 24 20 19 17 16 18 18 19 20 21 24 28 30 32 33 33 33 35 39 45 46 44 43 38 36 36 35 33 35 35 34 32 33 35 36 36 38 41 41 41 41 40 41 41 42 43 41 41 42 41 38 40 39 36 36 35 35 34 34 35 37 37 38 41 45 47 50 47 49 49 48 46 47 47 46 45 45 44 43 44 44 43 47 46 46 44 43 44 46 46 46 45 45 45 45 42 42 41 42 41 39 41 42 41 41 40 39 39 40 41 41 41 43 43 42 41 39 41 39 39 39 39 40 38 37 38 36 36 35 34 34 34 35 35 37 38 37 36 36 37 40 38 39 39 37 36 35 35 34 34 33 35 35 34 34 32 34 36 36 37 38 37 37 38 35 35 35 34 35 33 32 34 30 32 31 33 34 33 33 32 29 25 23 19 19 20 18 19 21 23 29 45 59 99 135 131 130 132 129 134 139 143 149 154 157 165 162 171 170 167 166 164 155 157 170 151 144 144 147 142 139 141 141 147 150 161 164 153 132 152 167 160 157 159 166 161 160 157 81 40 31 36 36 40 48 58 68 87 111 85 88 70 57 45 47 44 40 41 45 46 44 40 41 39 40 44 53 56 56 52 41 38 38 36 35 35 36 37 42 44 46 47 46 45 46 47 44 43 43 42 43 43 43 41 39 40 39 38 38 40 41 41 41 42 41 40 40 39 35 34 32 31 31 31 31 29 29 30 31 29 28 28 28 26 26 26 25 28 28 24 26 25 26 26 25 26 25 26 26 26 25 26 27 26 26 23 24 25 23 27 26 25 24 24 26 27 27 27 29 28 28 29 30 31 31 32 31 30 29 29 27 26 27 27 26 26 26 26 26 26 26 27 26 26 27 25 26 29 30 31 30 29 31 32 34 36 38 39 40 42 43 39 41 43 43 43 41 40 40 42 40 40 40 40 37 39 38 36 32 25 21 16 15 13 13 12 11 13 14 14 17 26 34 43 103 157 188 183 184 185 184 181 180 178 176 176 174 173 170 168 162 157 154 152 149 142 134 131 127 124 123 125 132 143 152 159 166 176 182 162 164 151 127 129 131 130 131 135 136 130 127 130 130 126 124 121 123 132 133 131 166 225 241 245 244 242 239 237 239 238 238 242 161 63 48 33 28 26 26 28 28 28 24 21 19 17 18 18 18 19 20 22 24 28 31 31 32 34 35 38 38 42 44 45 43 39 37 34 34 35 35 34 33 33 35 34 33 37 38 42 43 42 41 41 41 42 42 43 42 40 40 40 39 38 38 38 38 35 36 35 34 36 37 38 39 43 46 49 51 49 50 47 48 47 48 48 45 46 43 42 44 43 43 43 43 44 45 44 44 43 42 44 43 45 44 46 43 43 42 40 41 41 41 41 41 37 38 41 38 37 38 39 38 38 39 41 40 40 39 41 38 39 39 41 41 39 38 38 36 36 36 36 37 35 37 35 36 37 36 38 38 37 38 39 39 39 37 36 35 36 34 33 33 33 33 33 32 31 33 35 34 36 36 36 36 37 35 36 36 36 33 33 33 33 33 33 33 33 33 32 31 28 29 25 24 20 20 19 19 20 23 24 27 39 51 77 128 133 130 131 130 133 136 139 147 146 154 156 157 154 162 162 157 160 152 159 167 147 147 146 148 140 138 143 144 151 155 166 160 128 116 170 166 165 163 168 165 160 161 161 83 38 33 42 41 51 63 75 89 106 122 116 86 78 68 51 50 49 43 42 43 45 44 41 42 40 39 46 54 57 54 48 38 36 36 37 35 32 34 36 41 46 46 47 45 44 45 46 44 45 44 42 42 44 44 42 40 42 41 38 39 39 40 41 43 43 42 41 41 40 37 34 33 31 31 32 31 30 30 28 28 27 26 27 27 27 27 26 26 26 27 24 26 26 27 27 26 26 25 27 26 26 26 26 27 26 26 25 24 25 24 26 26 25 25 26 28 28 27 26 27 27 28 28 29 32 32 32 31 30 29 29 28 27 26 26 27 26 25 28 26 26 27 27 26 26 27 27 27 28 29 29 29 28 31 33 33 35 36 39 41 41 42 41 42 44 44 44 43 43 42 43 41 41 40 40 39 38 36 35 33 27 22 17 16 15 14 12 13 13 13 13 16 25 34 39 79 154 178 187 185 185 183 180 178 178 177 174 172 172 168 164 159 155 152 144 140 135 131 122 123 123 124 128 133 147 157 167 176 179 172 163 162 164 135 129 137 137 138 140 130 129 131 136 132 122 124 125 127 138 141 184 229 244 245 247 246 235 233 245 243 239 240 238 130 62 44 30 28 26 26 29 30 28 23 20 18 17 17 18 17 19 21 23 25 29 32 32 33 34 35 36 39 40 43 45 42 36 36 36 36 35 35 34 34 35 37 34 35 37 38 41 42 42 42 41 41 42 43 43 42 40 40 40 39 39 39 40 38 36 37 36 36 37 38 39 39 44 47 50 51 53 51 49 48 49 46 46 46 44 44 43 41 41 41 41 42 43 41 42 42 41 41 41 41 42 43 43 42 43 42 42 42 41 40 40 37 39 37 41 38 40 40 37 36 37 38 39 39 40 39 40 40 41 40 42 42 40 39 39 39 39 38 38 39 37 36 37 37 38 38 38 39 38 39 39 40 40 37 36 36 36 35 34 34 33 34 35 35 33 34 36 36 35 35 35 36 36 36 36 36 34 34 34 33 34 34 33 33 33 33 33 31 29 29 27 26 25 24 23 22 21 22 26 27 37 43 64 104 138 134 132 129 129 135 139 147 140 161 144 140 141 143 152 154 155 151 158 160 150 146 151 148 140 139 144 148 155 163 180 155 110 201 240 186 168 168 170 170 171 169 165 84 41 36 48 48 67 81 99 113 125 130 137 140 125 106 71 50 50 44 42 44 46 44 42 40 39 42 47 53 56 54 45 38 36 36 36 35 34 34 37 41 44 46 46 46 46 47 46 45 43 45 44 44 43 42 41 40 40 38 38 39 40 41 43 44 44 44 40 39 39 37 35 33 32 31 31 31 31 31 30 30 28 28 28 27 27 27 27 27 26 24 25 26 27 27 26 25 26 25 25 24 25 24 24 27 25 24 26 26 26 25 24 24 25 25 26 26 27 27 26 26 27 28 27 30 32 32 31 33 31 29 29 28 28 28 26 25 26 25 26 27 26 27 27 26 27 27 27 28 28 29 29 29 29 30 33 33 35 37 38 40 42 42 42 41 45 44 44 43 42 42 42 41 40 39 39 40 40 40 36 33 28 21 18 16 15 14 13 13 13 13 13 13 20 28 40 53 147 166 188 184 183 179 177 179 177 175 172 170 166 164 159 157 152 146 140 135 131 126 123 127 128 131 133 142 156 167 183 186 175 167 160 161 166 153 144 144 146 143 136 137 145 148 144 138 130 128 126 137 164 209 239 241 245 247 245 237 230 230 239 244 240 238 221 104 57 40 29 27 26 26 31 31 28 22 18 17 16 15 17 17 19 20 22 24 28 31 31 33 33 34 38 41 42 43 42 41 38 35 35 36 35 34 34 35 36 35 33 35 38 39 40 42 44 43 43 42 43 43 43 42 41 39 39 40 39 39 44 41 39 36 37 37 37 37 39 41 44 46 50 51 51 49 47 46 48 46 46 46 44 44 43 41 40 40 40 41 41 40 40 39 38 38 37 38 37 38 37 39 40 41 42 41 41 41 40 39 39 39 41 38 39 41 39 38 37 37 37 38 39 39 41 40 42 41 43 41 39 38 39 40 39 40 40 40 40 39 41 40 41 40 41 39 39 39 38 39 40 40 37 37 34 34 35 34 34 34 34 34 34 34 36 38 36 35 36 37 38 39 38 38 34 34 36 35 34 33 34 32 34 34 32 32 30 30 32 33 34 30 27 27 28 27 29 32 41 45 60 81 135 136 133 132 132 133 138 143 141 158 138 139 140 142 147 152 155 149 150 152 158 148 152 151 140 140 147 154 162 169 192 107 169 246 252 216 173 174 167 168 170 174 175 94 44 38 56 59 82 99 113 124 129 138 141 142 141 132 83 53 51 46 43 45 46 45 44 41 40 42 47 53 55 55 45 39 37 37 37 34 34 34 37 40 43 45 46 47 48 48 46 45 43 43 43 43 44 43 41 41 38 39 39 40 41 41 43 45 44 43 41 39 39 37 35 33 33 32 31 31 30 30 30 30 30 29 28 28 27 28 28 28 27 25 28 27 26 27 25 24 25 23 23 23 25 25 25 25 25 25 25 26 25 26 26 25 25 25 26 25 25 25 28 27 27 27 27 29 31 31 31 33 31 29 30 29 27 28 25 26 26 25 24 26 25 26 28 26 27 27 27 28 27 28 29 29 31 29 33 33 34 37 39 39 42 42 40 41 43 44 45 44 43 43 43 42 39 39 40 40 40 40 37 35 29 23 18 16 15 15 14 13 13 13 13 15 19 24 36 40 128 159 184 184 180 179 177 179 176 174 170 166 164 161 156 152 148 145 142 135 127 123 124 130 138 139 141 151 166 178 187 182 165 158 157 159 162 156 144 139 139 137 137 141 148 151 144 136 137 133 137 173 220 238 237 239 243 243 242 238 237 238 245 247 244 242 205 91 52 39 32 29 27 28 31 30 25 20 17 17 16 16 18 19 18 19 23 26 28 30 31 32 34 34 38 41 43 43 44 39 37 36 36 36 35 34 33 34 36 35 34 35 36 38 40 43 43 43 43 43 43 41 40 41 41 40 42 41 42 41 48 44 40 39 38 38 38 39 39 41 45 47 50 53 52 47 47 49 48 47 46 45 43 44 42 40 39 41 39 40 38 38 39 36 34 32 34 34 32 33 36 35 33 35 37 38 39 38 40 40 39 41 41 39 38 39 41 39 38 37 35 35 35 37 38 40 42 40 41 41 41 42 42 43 42 42 41 41 42 42 41 41 43 43 43 43 42 42 40 40 39 42 40 38 36 35 34 33 34 34 34 35 35 35 34 35 36 35 36 38 38 39 38 37 37 36 39 39 34 34 35 36 35 36 33 34 33 36 40 44 43 43 44 44 43 43 41 44 58 56 54 69 113 142 134 132 131 133 135 140 141 153 143 140 145 144 144 149 153 151 149 156 161 150 152 151 143 145 155 163 168 146 76 102 226 253 254 246 194 184 176 175 177 171 164 94 44 43 68 76 101 116 128 130 139 140 143 141 140 136 99 53 53 45 45 49 50 48 46 43 39 39 48 53 55 53 42 37 35 34 36 37 35 34 37 40 43 44 46 49 47 47 45 46 44 43 42 43 44 42 39 39 38 38 39 40 41 42 44 45 43 43 42 41 37 36 35 34 33 34 33 33 32 30 29 28 29 31 29 28 28 28 29 28 26 26 29 29 27 26 25 24 24 25 26 25 25 24 25 25 25 27 26 25 24 25 26 27 26 24 24 26 25 25 27 27 26 27 29 31 31 33 33 32 31 29 28 27 27 26 24 25 26 24 25 24 23 25 26 26 27 27 27 27 29 31 30 28 28 28 34 34 34 37 39 37 39 41 40 40 43 44 45 44 44 44 44 44 42 41 39 39 40 41 39 36 31 26 19 16 15 15 13 13 12 14 13 14 17 20 33 40 92 152 174 183 179 178 176 175 173 171 165 164 161 158 152 147 141 142 139 130 122 122 127 133 138 146 155 164 180 188 187 174 155 152 157 160 160 156 141 141 136 137 133 141 150 147 148 145 150 169 207 230 244 244 239 239 242 240 244 240 240 231 239 245 243 245 184 76 49 38 31 27 25 28 32 29 23 19 18 17 16 16 19 19 21 21 24 26 28 29 31 32 33 33 35 40 41 44 41 39 38 38 34 35 34 34 36 36 36 35 35 37 37 38 41 41 41 40 42 42 42 41 40 41 41 40 40 41 40 39 58 51 43 41 40 38 41 41 42 43 43 48 52 55 53 50 53 51 50 47 47 46 44 42 42 39 37 37 38 39 38 36 35 34 32 32 33 33 32 32 33 33 32 32 33 34 35 37 39 39 41 40 41 40 40 39 40 39 37 37 35 36 34 36 36 37 39 40 39 42 42 42 43 44 42 41 40 41 42 42 43 43 43 45 45 45 44 44 41 43 43 42 42 40 37 35 35 35 34 34 33 31 32 33 31 32 33 34 35 36 36 37 37 35 37 39 40 36 34 36 39 38 36 35 33 37 38 41 44 48 49 51 56 57 57 52 51 59 67 57 48 62 88 139 136 132 129 133 135 138 146 152 147 141 141 144 143 144 152 157 155 157 158 150 153 153 148 152 164 171 159 86 77 150 231 251 254 253 228 218 213 200 198 199 193 110 46 47 83 95 118 127 132 134 141 143 142 142 138 134 109 56 52 46 47 53 56 54 47 44 42 41 48 55 55 52 43 40 36 34 35 36 36 34 39 38 42 44 46 48 47 45 44 45 45 44 43 44 44 43 40 39 39 39 39 40 42 42 43 43 42 42 42 42 37 37 36 34 33 33 32 32 32 30 29 29 27 27 28 28 28 28 29 27 26 26 27 28 25 27 26 25 26 27 24 25 26 26 26 26 24 24 25 24 25 24 26 26 25 26 25 26 26 26 26 27 27 28 30 29 30 32 31 32 32 29 28 29 28 28 27 26 29 27 26 25 24 27 26 26 26 27 28 27 28 30 29 29 28 30 33 34 33 36 37 38 39 40 41 43 44 44 44 44 43 43 42 44 43 42 41 40 41 40 40 37 32 28 19 17 16 16 14 13 11 14 12 13 15 19 29 38 74 145 167 182 179 178 176 174 170 171 167 166 159 153 148 145 138 133 129 124 121 124 130 133 140 158 166 176 187 188 178 168 151 154 158 159 156 157 142 142 146 147 151 148 145 140 152 173 203 229 237 242 250 244 243 242 244 239 241 248 242 237 237 244 243 246 157 68 48 35 28 27 27 30 31 29 22 20 18 17 15 18 19 20 20 22 23 28 29 31 31 32 34 34 38 42 43 44 41 38 37 36 35 34 35 34 36 36 36 35 36 38 38 40 41 41 42 40 40 41 42 40 41 41 42 42 42 41 40 40 78 63 51 47 45 42 44 45 45 45 48 51 56 58 57 54 54 52 52 50 46 44 43 39 40 38 36 34 34 34 36 34 32 31 31 32 31 32 31 32 32 30 31 32 31 31 31 35 35 35 37 37 39 39 40 39 39 39 39 37 34 33 34 34 35 34 37 39 38 38 41 40 41 43 44 43 41 42 43 43 43 45 46 47 47 47 45 46 44 45 45 42 42 42 40 37 36 32 31 31 32 31 30 31 29 30 30 31 31 33 32 33 33 33 34 36 36 33 33 35 36 34 33 33 33 36 39 39 43 45 51 57 62 63 56 55 64 69 61 53 49 52 72 117 143 135 131 132 137 140 142 152 147 142 141 144 140 142 146 155 170 171 156 150 153 152 154 161 170 216 201 93 101 184 224 249 254 254 252 252 248 246 247 247 248 150 48 54 104 116 125 132 134 135 139 143 139 138 135 134 120 59 51 51 52 68 66 58 49 44 41 40 49 55 54 51 42 37 37 37 35 35 36 36 36 39 41 42 44 46 45 45 43 43 44 47 45 44 42 42 41 39 38 38 39 41 43 43 43 43 41 42 41 41 39 38 34 34 33 32 32 30 29 31 30 29 30 29 28 28 28 29 28 27 26 26 26 27 26 27 26 27 27 26 25 25 25 25 26 26 25 24 23 23 25 25 27 26 25 25 26 27 27 27 26 28 28 28 29 28 30 33 29 31 33 30 30 29 26 29 33 31 31 29 25 26 26 25 27 28 29 28 27 29 29 28 29 30 30 31 33 33 33 35 37 39 39 40 41 40 42 44 44 43 44 43 42 44 42 40 42 41 40 38 38 35 32 27 22 18 16 16 14 14 13 12 13 14 14 18 27 40 53 126 158 177 177 177 176 176 172 168 162 158 155 150 144 139 133 130 121 121 124 129 133 136 149 166 176 184 193 184 168 159 154 155 159 158 154 160 139 142 141 145 155 154 158 190 222 238 245 242 241 248 248 245 242 248 238 241 245 246 245 243 242 242 244 248 119 65 44 33 28 25 27 29 29 28 20 19 18 17 18 18 19 20 22 23 26 28 32 31 30 32 35 35 37 42 43 44 40 37 35 36 35 33 35 35 36 35 36 38 37 37 39 41 39 41 43 42 39 38 40 40 42 41 41 44 42 40 41 41 98 83 67 56 50 48 47 47 46 45 49 54 59 59 59 58 56 55 55 50 45 43 41 38 39 38 36 34 32 33 32 32 32 31 32 32 30 33 30 30 31 30 30 30 30 29 30 31 32 32 35 35 37 37 38 41 40 38 39 36 36 35 35 34 35 35 36 34 36 37 38 38 40 41 42 42 43 44 44 43 43 44 46 45 47 48 47 47 47 46 46 42 41 39 38 37 35 34 31 32 33 31 29 30 30 30 30 30 30 30 28 31 33 31 33 32 31 32 32 33 33 31 30 31 33 35 35 35 39 44 53 61 62 58 56 64 69 64 55 55 57 48 63 91 145 140 133 132 136 138 138 146 142 144 143 147 143 145 142 154 166 171 156 151 155 156 157 158 210 247 232 130 115 185 220 247 254 255 254 251 251 253 253 252 252 166 47 59 115 123 134 136 135 136 140 140 138 136 137 135 130 67 48 51 56 76 74 62 52 47 45 44 50 56 55 52 41 36 36 36 35 35 35 34 38 40 42 43 43 45 45 45 43 43 44 46 45 44 43 43 43 41 38 38 38 41 43 41 42 42 40 41 40 40 40 38 37 34 33 33 31 30 32 31 30 32 31 29 28 29 28 28 28 27 27 26 26 27 26 26 26 26 25 24 24 25 25 26 27 25 26 27 25 24 25 24 26 27 26 24 26 26 26 26 27 28 28 29 29 28 30 34 32 31 31 31 30 30 28 30 32 29 27 27 26 25 25 28 28 30 28 27 29 29 27 28 28 28 30 31 31 31 33 35 37 37 38 40 40 42 44 45 46 43 44 42 42 42 43 42 41 39 40 39 39 37 34 29 22 18 17 16 16 14 14 13 13 12 15 18 25 36 45 110 154 174 177 178 178 176 171 165 163 158 154 148 142 136 131 127 122 124 129 133 137 142 159 170 184 196 188 174 158 155 156 158 155 156 158 160 149 155 149 158 184 197 215 232 233 237 239 239 243 248 247 242 244 249 243 239 242 243 245 241 240 240 245 234 90 63 44 34 27 25 26 29 28 25 20 18 17 17 17 17 20 21 24 23 25 30 30 30 34 33 34 34 39 42 41 41 41 38 35 36 35 34 35 35 34 35 35 37 38 37 39 41 39 42 43 42 39 39 40 40 42 41 41 42 42 41 41 39 126 106 88 75 63 56 55 52 52 54 56 55 56 57 58 58 59 57 57 50 43 42 39 38 37 36 35 32 32 33 32 32 32 33 31 31 30 31 30 30 31 31 29 29 30 31 29 31 31 30 31 31 31 32 34 36 35 36 38 38 39 39 35 36 34 35 34 31 33 33 35 36 37 37 38 40 42 43 43 43 45 46 43 43 47 47 47 47 46 46 45 42 42 38 37 35 33 31 31 32 32 32 31 31 31 29 28 29 28 28 29 30 31 32 30 29 30 28 30 30 29 29 30 31 32 33 34 34 39 43 57 61 58 56 65 68 62 55 59 66 67 50 52 67 121 144 134 135 138 137 140 142 144 143 144 151 147 144 147 152 168 157 155 152 165 163 165 197 252 252 247 185 121 170 210 239 255 254 254 251 250 245 246 252 252 165 49 64 127 129 135 136 134 136 139 138 135 134 139 141 136 82 41 52 61 76 78 68 54 49 46 47 52 56 55 50 40 38 36 34 36 36 37 36 37 39 41 41 43 44 45 44 43 43 45 45 44 43 42 44 44 40 41 38 40 43 43 42 41 41 42 42 42 40 40 38 37 35 34 31 33 31 29 31 32 32 31 30 30 29 28 29 28 27 26 25 26 24 24 25 26 26 26 25 26 26 27 25 24 25 25 27 24 23 24 25 26 26 26 26 28 28 26 26 27 28 28 28 29 30 30 32 33 32 30 31 31 30 29 27 27 27 26 25 26 25 27 27 29 28 27 27 28 25 27 28 29 29 31 31 30 30 33 35 36 36 39 40 41 42 44 44 45 43 43 41 41 43 44 42 41 39 40 39 39 38 35 29 24 19 17 16 15 15 15 13 14 13 15 16 21 31 41 82 151 160 181 177 176 175 170 164 159 156 149 143 137 129 124 121 124 126 132 132 139 151 170 180 190 197 177 162 151 151 155 155 154 153 167 164 162 181 206 228 251 245 241 243 239 236 242 248 245 241 244 243 247 247 247 244 244 248 245 244 250 244 248 208 73 59 42 31 27 24 28 30 30 24 18 18 17 16 15 17 20 21 23 23 26 30 30 33 34 33 35 36 41 43 42 40 40 37 35 35 34 35 33 33 33 34 35 37 38 39 40 40 39 41 42 43 40 40 40 38 41 40 41 42 40 39 39 39 96 109 111 99 76 65 62 58 59 64 69 65 62 59 53 53 57 57 54 47 42 42 40 38 36 35 33 34 34 33 33 32 33 32 31 31 31 32 32 32 32 32 30 29 30 29 29 31 31 29 30 30 30 29 31 33 32 33 35 38 38 38 37 38 34 35 33 34 33 32 33 34 34 33 36 39 40 42 43 44 44 44 45 44 45 46 45 46 45 46 46 43 42 39 36 33 32 31 29 28 29 31 29 29 29 27 26 27 26 27 29 29 29 29 30 29 30 30 30 28 29 29 29 30 30 31 35 35 39 44 55 56 60 66 67 60 56 59 68 73 51 46 50 60 92 142 138 136 137 140 147 144 144 144 145 145 145 145 148 153 165 152 155 157 167 165 191 243 252 249 246 224 124 145 204 235 254 253 254 251 250 248 252 252 250 155 52 68 127 128 134 135 136 137 138 136 135 137 140 143 137 102 38 51 63 78 80 72 58 51 48 49 54 56 53 47 39 39 37 37 36 35 35 36 36 36 41 42 41 44 44 44 44 44 45 45 45 43 44 44 45 44 41 41 42 42 42 43 40 41 41 42 42 41 41 38 36 34 34 34 33 32 31 33 32 31 30 30 29 27 27 28 27 27 27 27 26 24 24 26 26 25 26 27 26 25 26 25 24 25 24 25 26 26 25 24 26 26 27 27 28 29 28 28 27 27 28 29 29 30 31 31 31 32 33 32 30 30 30 29 28 25 27 27 27 26 26 28 28 30 28 27 26 25 27 28 29 30 31 31 31 32 32 33 33 35 37 41 43 42 44 46 46 44 43 42 44 44 43 42 43 41 40 41 39 39 36 30 24 19 17 16 13 13 14 13 13 12 14 15 18 27 39 58 148 153 180 174 174 173 167 162 158 152 144 139 132 126 123 124 126 129 133 135 146 160 177 186 193 184 168 155 150 153 153 154 156 153 175 196 221 237 241 244 247 244 246 243 239 240 246 248 243 238 247 243 243 249 241 247 244 245 242 248 252 249 246 188 69 57 38 30 27 26 29 30 29 23 17 15 16 16 17 18 20 21 21 23 27 29 31 33 32 34 34 35 41 43 43 39 37 36 36 35 34 34 32 32 34 34 37 38 39 39 38 39 39 39 41 41 40 39 40 39 41 40 41 41 41 40 40 40 69 61 75 92 91 79 69 68 70 71 79 78 73 69 60 57 56 54 47 45 42 40 39 38 38 38 35 34 33 34 32 35 33 32 32 31 31 31 32 32 32 33 32 32 32 32 31 32 33 31 29 29 30 30 29 30 30 30 33 35 35 38 38 38 36 36 34 34 32 32 31 32 34 32 34 37 38 40 39 41 44 44 43 45 45 46 44 46 44 44 44 43 42 39 37 35 32 29 29 30 29 29 28 28 27 27 27 28 26 26 27 28 27 28 28 27 29 29 29 27 28 27 29 29 30 32 33 34 41 48 54 60 67 66 59 60 61 68 72 56 46 52 60 54 71 129 147 140 140 143 151 151 143 142 143 143 143 143 146 153 158 152 157 162 169 189 243 246 249 246 251 250 154 124 181 214 251 254 254 250 243 254 251 249 251 156 53 69 115 112 115 123 128 133 137 138 134 138 139 139 137 129 41 52 68 80 81 76 63 57 53 52 54 54 52 44 40 39 36 35 37 38 36 35 37 38 40 40 40 42 41 42 44 46 44 44 45 43 44 43 44 44 44 44 44 42 43 44 43 43 41 40 41 42 42 39 36 37 36 35 34 33 33 32 30 32 32 30 30 29 28 27 28 28 28 27 26 25 26 25 27 25 26 27 26 26 26 25 25 26 26 25 26 27 26 24 26 26 26 25 26 29 28 29 28 28 28 28 30 30 30 31 32 32 32 31 31 30 29 31 29 28 29 27 27 28 31 29 29 29 28 29 29 29 29 30 29 30 30 33 33 35 32 33 35 38 39 41 43 44 44 44 45 44 43 43 44 45 45 43 44 43 42 41 39 38 37 32 26 21 19 19 16 15 14 15 14 12 14 14 18 24 37 42 127 151 170 176 170 169 167 159 153 147 140 135 128 127 126 126 129 133 133 140 156 169 187 194 192 177 160 153 152 155 154 150 156 165 238 248 243 239 238 242 251 250 247 243 242 240 246 247 247 250 244 244 247 249 243 244 244 247 247 249 249 247 244 154 67 50 34 29 25 26 28 30 26 19 18 18 18 19 18 19 21 22 22 25 28 30 30 33 32 34 35 38 43 43 42 40 38 36 36 37 35 34 34 33 35 33 36 39 41 40 40 39 39 39 40 40 40 40 40 40 41 41 41 41 40 40 40 39 71 60 51 52 72 82 76 81 85 81 76 75 73 70 63 58 62 62 51 46 41 39 38 40 40 38 36 34 34 34 32 32 32 32 32 31 30 31 34 33 32 33 33 32 32 32 32 32 31 31 31 30 31 31 29 29 30 29 32 33 34 35 37 39 37 37 35 33 33 33 32 34 33 33 36 36 35 36 37 39 42 45 44 44 45 46 44 45 46 45 45 45 44 43 40 36 35 32 31 32 31 29 27 28 26 25 27 27 26 27 28 29 29 29 28 27 28 29 28 27 28 29 30 29 32 32 35 37 43 54 63 68 65 63 69 68 73 74 57 48 52 84 110 61 64 98 150 146 143 145 152 151 142 142 142 143 142 142 147 152 154 156 157 160 186 235 250 250 251 250 252 248 191 118 159 192 242 253 254 253 237 249 251 246 249 160 53 65 98 86 82 86 92 99 116 130 134 138 141 139 137 142 59 53 70 84 84 78 65 60 53 53 55 54 51 44 41 38 38 37 38 38 36 36 36 38 39 40 42 43 43 43 45 46 44 45 46 46 45 44 42 43 43 45 45 42 44 44 43 42 42 41 41 41 40 38 36 36 36 34 34 33 32 32 32 32 33 31 30 28 28 27 27 27 27 27 27 26 26 26 25 26 26 26 28 27 25 24 24 25 27 27 25 25 26 26 26 27 26 26 26 28 27 28 29 29 28 28 29 29 31 33 33 32 30 31 31 31 31 30 29 29 29 25 26 27 31 27 27 28 29 29 29 29 29 30 28 30 30 31 33 35 33 34 35 36 40 40 43 46 44 44 44 44 44 43 44 43 42 41 43 43 41 41 39 38 37 34 27 22 19 19 16 16 13 16 16 14 14 15 18 21 34 42 101 147 162 174 170 168 163 155 149 145 138 133 133 130 127 129 132 134 136 148 166 179 193 197 183 170 155 153 154 155 154 150 162 199 251 250 243 240 241 243 246 250 246 248 246 244 240 240 247 248 245 245 246 246 244 242 242 245 246 246 247 241 233 124 65 44 33 29 25 27 30 30 23 18 17 17 18 19 18 19 22 24 23 25 28 30 31 32 33 34 36 39 41 43 44 41 37 36 36 38 36 35 35 35 36 37 38 39 41 39 40 40 39 39 40 39 39 39 41 41 38 39 39 41 40 39 39 40 78 67 51 43 38 43 62 88 91 84 87 86 79 75 69 65 62 58 54 49 44 44 41 40 41 41 37 35 33 32 33 32 32 33 31 32 32 31 32 32 32 32 33 33 32 33 31 31 31 31 30 32 30 30 30 31 30 30 30 31 31 32 34 35 38 38 35 34 33 32 33 33 33 33 35 35 33 35 35 37 39 41 41 42 41 43 44 46 45 47 46 46 48 47 44 40 36 34 32 32 32 30 30 30 26 26 26 26 26 26 27 28 28 27 27 29 30 29 27 29 28 29 30 31 34 33 36 40 49 61 64 65 75 81 78 78 73 58 49 56 100 149 189 134 55 80 115 151 146 147 156 148 143 142 143 143 141 142 148 151 151 155 157 160 240 253 247 250 253 247 248 245 225 133 133 170 224 246 254 255 241 247 249 243 248 173 53 61 73 67 61 58 57 58 61 72 101 122 136 139 137 146 116 55 75 98 84 80 70 60 53 51 55 52 47 43 41 39 39 37 37 37 35 38 36 36 38 41 41 42 41 42 44 45 43 44 45 45 44 43 45 44 42 44 43 43 44 43 42 41 43 43 42 41 41 39 36 36 34 34 35 32 32 32 32 31 30 30 30 29 30 29 28 30 29 28 27 27 27 27 25 25 28 27 28 28 26 27 27 27 26 26 27 26 27 26 27 27 26 26 25 25 27 27 29 28 28 29 29 30 32 33 33 31 30 33 32 31 31 30 31 29 27 27 28 27 26 26 28 27 30 28 28 28 29 31 31 29 30 30 33 33 32 35 34 36 38 38 43 44 43 45 46 47 44 44 42 41 43 43 43 42 41 42 40 40 39 34 28 24 21 18 16 15 14 15 14 15 15 15 16 19 31 41 72 137 156 176 167 165 157 151 144 139 135 133 132 129 130 133 133 135 142 158 176 187 193 188 170 155 150 152 152 150 152 146 174 235 249 246 240 241 244 246 250 252 253 251 247 248 250 245 245 242 242 244 246 243 239 243 244 245 243 243 241 244 210 92 58 40 34 29 25 27 28 27 21 17 18 18 18 18 19 18 22 23 24 25 28 29 31 32 32 33 36 39 42 45 44 39 36 36 37 36 36 36 35 37 36 35 35 38 41 41 40 39 38 38 38 39 39 38 39 40 39 40 40 40 39 38 40 38 90 70 56 44 39 39 48 124 167 98 85 89 89 85 77 69 65 59 54 53 48 46 42 42 42 40 37 36 35 34 33 32 33 35 35 34 33 32 31 31 31 31 33 34 33 33 31 32 33 31 32 31 31 30 30 31 30 31 30 30 31 32 33 34 36 35 35 35 33 33 34 34 33 34 33 32 33 33 35 36 37 38 38 40 40 43 43 45 44 45 45 46 48 47 45 43 41 38 35 33 34 30 32 33 28 26 27 27 28 28 28 28 30 29 28 28 28 30 30 29 30 30 30 30 34 36 39 42 52 60 70 81 91 89 82 75 58 54 61 96 159 210 241 220 84 65 92 133 148 149 161 148 143 142 145 145 144 143 148 153 156 161 157 147 211 239 248 253 249 249 253 252 241 166 119 156 207 234 251 255 246 243 251 247 247 185 54 61 67 59 53 51 49 48 48 50 62 77 107 128 144 208 199 73 82 112 86 82 71 58 52 51 54 51 44 41 41 39 37 36 37 35 37 37 37 38 38 40 42 44 43 44 44 44 45 46 46 46 46 46 47 46 44 45 43 44 43 43 44 43 43 43 42 41 42 40 39 37 34 34 34 33 33 33 33 32 32 32 31 30 29 29 29 29 28 27 25 26 26 28 25 25 27 28 28 26 26 26 28 28 27 26 25 25 25 24 26 26 26 26 26 26 27 27 28 28 28 28 28 30 31 32 33 33 33 33 33 33 31 31 32 29 27 27 27 28 28 28 28 27 31 29 28 27 28 30 29 28 28 31 31 33 31 33 34 37 37 39 42 44 45 47 47 44 45 44 44 42 42 43 44 42 41 42 40 40 39 34 30 25 22 18 17 17 14 14 15 16 14 14 15 17 26 39 58 127 151 171 166 163 155 148 142 139 134 128 127 131 131 134 134 137 152 169 183 194 190 176 158 150 150 151 150 149 151 148 195 235 245 237 221 238 245 248 249 245 247 252 248 244 242 241 244 248 247 242 248 242 239 242 245 243 248 243 240 238 176 79 51 39 31 28 27 29 29 25 21 17 18 18 18 18 19 19 20 23 25 26 29 30 32 33 32 32 36 38 43 46 44 38 35 35 36 35 37 35 36 36 38 37 38 39 39 40 40 40 39 39 37 38 39 39 38 39 39 40 41 40 39 38 40 41 107 79 61 53 42 41 46 107 244 206 117 83 79 84 97 101 100 96 86 78 65 62 54 48 46 44 41 40 38 36 36 36 37 36 35 34 35 36 34 34 32 31 33 34 32 32 34 32 33 33 31 33 32 31 32 31 30 31 31 31 32 32 32 31 34 35 34 35 36 37 35 33 33 32 32 33 33 32 32 31 32 34 36 37 37 39 40 41 43 44 45 43 44 45 46 49 46 42 39 37 35 33 32 30 29 27 28 27 27 28 28 29 30 29 30 29 28 30 31 30 31 29 32 33 38 40 46 54 68 79 94 99 90 81 66 56 54 68 125 182 233 250 248 251 194 71 72 101 130 147 154 145 140 140 144 146 147 148 152 156 156 156 158 163 191 235 247 249 244 251 252 250 248 213 114 135 186 216 238 254 251 233 249 246 252 211 60 63 61 56 51 49 48 47 47 51 53 59 72 120 219 249 238 122 93 125 100 83 72 63 53 51 49 47 45 42 39 39 39 37 37 38 35 36 36 37 38 40 40 43 42 42 43 45 45 44 45 45 46 47 44 44 43 44 43 43 41 41 42 43 44 45 39 39 42 40 39 39 35 35 33 33 33 32 31 33 33 32 30 31 31 28 30 29 29 27 27 28 28 27 26 26 27 27 27 26 26 26 29 28 26 27 27 27 25 24 26 27 27 26 25 27 27 27 28 29 30 29 29 31 31 31 33 33 34 31 32 33 30 30 31 30 27 26 26 28 28 28 28 28 28 28 29 28 28 28 30 30 29 31 28 30 32 34 34 35 37 40 41 41 45 47 46 46 45 44 43 42 42 43 43 42 43 43 41 40 39 37 31 27 20 18 16 16 15 14 15 16 15 14 14 16 21 33 45 101 149 162 170 156 150 146 143 137 131 128 129 133 136 136 139 146 164 178 191 195 180 159 149 149 151 150 149 149 149 160 223 219 234 238 235 241 248 248 244 243 241 243 248 247 246 248 246 242 240 240 249 247 242 244 249 244 245 246 246 247 157 67 47 37 29 26 26 31 29 24 18 17 18 18 17 18 19 18 20 22 23 26 29 30 31 34 34 34 37 40 42 43 40 38 36 35 37 36 37 33 35 35 37 36 38 41 40 40 41 41 41 40 40 39 39 38 36 38 39 39 40 40 40 38 39 38 104 85 70 56 46 45 51 75 229 252 218 147 51 48 59 71 85 95 108 108 107 100 83 74 68 60 52 50 47 44 43 41 41 39 40 38 37 37 36 37 37 35 34 34 33 32 34 35 34 34 33 34 31 32 33 32 32 32 31 32 34 33 32 30 33 33 32 35 36 38 36 34 34 34 34 33 33 33 31 29 31 33 33 33 33 36 38 37 41 40 40 40 39 43 45 49 50 48 43 41 38 34 34 33 31 29 30 30 29 30 30 30 31 30 30 30 29 29 30 33 31 33 35 35 40 49 63 75 84 89 104 100 81 67 54 56 77 126 203 241 250 251 250 253 239 124 55 78 106 124 152 143 143 143 146 148 150 153 159 160 141 152 200 213 232 253 253 252 251 249 247 246 249 240 130 124 176 210 227 247 254 235 244 251 253 230 71 66 59 59 52 52 48 49 53 59 66 73 114 205 250 252 249 186 111 138 108 84 74 62 51 49 45 44 41 40 38 37 39 38 37 37 35 36 36 37 36 39 41 42 41 42 43 44 46 46 44 45 46 47 45 43 45 44 44 43 43 43 42 43 44 43 41 40 41 40 40 38 35 34 32 33 31 32 32 32 33 32 31 30 28 29 30 30 29 28 28 29 28 26 26 26 27 27 27 28 28 27 28 27 26 28 27 27 27 26 27 27 28 27 26 28 29 27 29 30 30 30 31 30 30 33 35 34 34 32 32 32 30 29 29 29 28 27 26 28 28 27 27 28 29 30 30 29 27 29 29 30 28 30 31 31 32 33 35 36 38 40 41 42 46 47 46 46 45 43 45 44 43 44 43 44 45 44 40 39 41 39 32 26 20 17 16 16 14 14 14 14 15 14 15 15 19 30 43 79 147 153 169 152 146 142 138 133 130 130 132 134 141 142 145 158 175 185 194 188 166 153 150 151 150 149 148 148 149 190 242 244 243 242 244 247 247 244 238 239 239 238 241 242 252 251 244 240 239 239 243 245 242 247 248 249 242 249 246 247 139 63 44 33 29 27 27 31 29 24 18 18 18 18 18 18 19 20 21 24 26 28 29 31 33 35 34 34 36 41 41 42 38 36 37 36 37 35 36 34 35 35 36 38 39 40 38 40 39 40 42 40 38 40 39 40 40 41 41 41 40 40 40 40 38 40 98 99 80 67 53 47 48 60 181 249 251 248 82 26 32 39 55 76 91 91 95 103 119 112 103 96 87 81 70 68 62 56 50 47 46 47 43 42 42 42 41 41 39 37 36 37 37 37 36 34 35 34 33 32 33 33 34 34 34 32 32 33 32 31 32 30 32 33 34 35 34 33 34 34 34 34 33 32 31 31 29 30 31 30 31 33 35 36 36 35 37 39 38 39 42 44 47 48 48 46 44 39 36 35 33 31 31 31 31 29 30 31 31 31 29 30 30 31 31 33 34 35 39 43 56 71 81 84 88 104 126 81 60 55 67 102 178 228 248 248 248 248 239 221 151 68 64 62 82 98 118 128 144 146 149 151 152 157 151 137 110 97 103 116 170 198 221 236 245 250 251 253 251 251 174 120 168 197 219 235 249 237 228 252 254 246 98 76 71 60 55 55 53 54 54 61 76 128 232 250 250 249 253 238 142 148 121 92 78 67 53 49 45 43 39 39 38 36 36 36 35 36 36 35 36 36 35 38 42 42 44 44 45 48 47 47 47 48 47 47 47 47 46 45 43 44 43 44 43 43 43 42 43 42 40 39 38 37 36 33 32 33 32 33 32 32 33 33 32 30 29 29 32 31 30 31 27 29 28 27 26 26 26 27 27 28 26 26 26 27 27 27 27 28 27 28 27 26 26 26 27 28 28 27 28 29 29 30 30 29 30 32 34 34 33 33 33 32 33 33 30 30 28 27 28 28 26 26 28 27 30 34 29 29 29 28 30 30 28 30 32 31 30 32 34 36 38 40 39 42 46 47 48 48 47 44 44 44 46 44 44 43 43 43 41 42 38 39 35 29 22 19 17 16 14 14 15 14 15 15 14 14 15 24 41 57 133 149 167 152 142 140 136 131 131 133 134 139 142 145 157 172 185 194 190 173 152 149 154 155 151 149 147 148 160 221 246 246 239 239 243 250 250 244 242 240 238 240 241 238 240 245 249 242 242 245 239 238 241 246 249 250 241 242 244 239 99 60 41 32 28 27 28 30 31 24 20 19 18 17 18 18 19 21 22 22 26 27 30 32 32 33 37 36 39 41 42 41 37 35 35 35 35 34 34 35 34 37 37 38 40 40 40 39 40 39 40 40 39 39 39 40 39 40 40 39 41 41 41 39 39 40 88 110 87 80 65 54 51 55 114 227 252 245 76 34 34 40 61 129 162 169 153 118 92 89 92 97 96 94 91 97 100 93 77 66 60 54 52 53 51 50 49 48 46 44 45 42 42 42 40 39 38 35 37 36 35 35 36 36 35 34 35 35 33 32 32 32 33 32 34 33 34 34 35 36 34 33 32 32 32 32 31 32 31 30 31 32 33 34 35 35 36 37 38 38 41 43 48 50 51 51 48 46 42 40 37 35 34 32 31 33 31 31 32 33 31 30 30 32 32 33 36 39 45 54 69 77 80 83 87 108 87 58 56 78 133 199 242 245 239 232 243 226 152 90 56 48 54 68 72 84 99 106 131 146 149 155 148 140 131 129 126 128 124 126 142 144 146 168 196 223 242 250 252 253 210 129 162 194 210 222 237 233 215 248 251 249 140 82 92 65 60 60 58 58 65 71 142 223 251 249 249 253 245 209 157 153 132 102 80 70 56 47 45 40 39 39 38 37 35 35 34 35 35 34 36 36 38 37 40 44 45 45 46 47 48 48 47 48 48 47 46 44 45 45 43 43 42 43 44 44 44 44 43 41 39 40 38 36 36 35 34 33 33 34 33 32 32 31 32 30 30 31 35 33 32 33 28 29 28 27 26 26 27 27 27 28 27 27 28 27 27 27 28 28 26 28 29 29 27 29 28 28 28 27 27 27 28 29 29 29 29 31 34 33 34 33 34 34 34 33 31 30 30 30 29 29 29 28 27 26 29 30 29 28 28 28 28 28 30 31 32 32 32 34 36 37 39 39 39 41 45 46 45 47 46 43 43 44 45 44 43 42 43 44 43 42 41 41 35 30 23 20 19 17 15 16 14 14 16 15 14 15 15 21 38 47 121 146 164 154 141 138 134 133 133 135 139 143 143 151 169 180 194 197 187 168 148 153 157 155 151 148 148 142 189 238 238 241 242 242 246 246 241 246 250 248 244 244 247 246 244 244 247 249 246 245 246 246 244 242 243 246 235 238 244 226 80 58 37 31 28 26 29 31 28 20 18 18 19 19 18 18 19 21 23 23 26 28 32 33 34 35 37 36 40 41 44 42 38 36 34 35 35 34 35 36 35 35 38 39 39 39 39 39 39 40 39 39 39 39 39 39 39 40 39 40 41 41 41 39 39 40 82 110 102 90 86 75 61 56 65 126 216 206 40 44 39 41 127 237 237 239 239 233 218 193 160 139 115 101 90 81 83 89 100 105 103 100 90 83 79 76 71 69 66 64 62 59 57 54 51 47 45 45 42 41 42 42 37 37 36 37 38 36 35 35 34 35 34 35 35 34 35 35 34 36 34 35 35 33 33 32 32 31 31 30 30 32 33 33 33 32 34 35 36 36 39 42 46 50 51 54 53 51 49 46 45 40 37 36 35 34 34 30 35 35 33 33 36 37 38 40 44 50 59 68 78 80 79 77 67 58 60 75 133 189 234 248 240 238 230 208 139 74 50 51 47 46 52 58 83 83 87 97 97 100 106 114 117 121 121 115 114 114 117 122 136 145 149 152 149 159 198 219 234 244 234 150 153 194 196 208 211 209 201 236 250 252 208 106 121 98 75 73 74 76 95 156 243 251 247 249 245 233 204 159 163 150 148 117 84 71 58 51 43 41 40 38 38 37 35 35 34 34 35 35 35 35 38 36 39 43 46 46 47 47 48 51 51 49 47 48 47 45 46 46 45 45 43 43 43 43 44 44 41 40 40 40 39 37 35 34 33 32 34 35 34 34 32 31 33 33 32 32 35 35 34 34 30 30 28 28 27 27 28 28 28 29 30 29 28 28 28 26 28 29 27 29 29 28 28 30 29 27 28 29 26 28 28 29 29 29 30 31 34 36 36 36 34 34 32 32 32 30 29 29 29 28 27 27 27 26 29 29 27 27 27 29 28 29 30 30 32 32 32 33 35 37 39 40 41 43 45 46 46 46 46 45 45 45 45 45 45 44 44 45 44 45 42 39 36 33 25 21 20 18 17 16 16 16 17 16 15 15 16 19 35 42 97 142 157 163 143 140 133 132 134 139 143 145 150 163 179 186 195 185 182 180 151 155 156 155 150 150 148 152 235 249 248 247 241 238 240 243 247 247 244 244 244 246 249 247 247 246 245 248 245 241 243 239 238 247 243 241 239 247 244 192 70 53 37 31 27 23 30 31 26 19 17 18 18 19 17 17 18 20 23 24 29 30 32 32 35 36 35 35 41 42 42 42 38 37 36 36 33 34 36 34 38 37 38 38 39 40 42 41 39 38 38 37 38 40 40 39 40 40 39 39 39 40 39 38 38 39 76 94 113 100 98 94 80 68 65 67 92 91 38 45 39 37 162 245 238 232 238 241 237 242 242 230 227 210 180 152 120 102 87 81 84 83 89 92 92 92 89 84 81 82 84 88 90 87 87 75 65 56 50 49 46 45 42 41 39 40 40 38 37 37 36 35 33 36 34 34 35 35 35 36 36 36 36 35 34 34 34 32 33 31 31 32 33 33 32 32 34 35 38 37 37 38 43 47 50 52 51 51 50 48 52 48 41 41 40 38 36 37 38 36 37 39 40 42 45 50 60 68 75 75 76 70 61 58 57 71 114 166 224 245 241 240 239 229 179 97 54 52 51 51 53 54 58 62 73 91 113 123 113 116 117 120 126 121 115 113 110 105 102 103 111 120 128 143 155 153 155 174 201 219 237 172 143 194 187 204 197 197 195 215 246 248 240 159 127 132 103 99 101 118 192 239 251 250 249 251 225 214 224 183 148 153 152 127 92 78 62 51 44 41 40 39 39 37 35 35 35 35 35 35 37 38 38 37 39 42 47 47 49 48 49 51 51 49 49 49 47 46 45 46 45 44 45 46 43 44 43 42 39 39 41 40 39 36 35 35 33 34 36 37 36 36 32 33 33 32 34 34 33 34 32 32 31 30 29 28 28 28 29 29 29 29 29 29 27 27 28 27 28 28 27 28 28 28 28 29 29 28 28 28 28 28 29 30 29 30 29 31 33 37 36 37 35 33 31 32 31 31 30 30 28 27 25 25 27 27 28 28 27 27 27 27 29 30 29 28 31 32 33 35 36 37 39 41 41 44 44 46 46 47 46 45 44 46 45 46 46 45 45 46 45 45 44 41 37 33 26 22 19 17 18 17 16 17 16 15 15 15 15 17 33 42 81 135 151 166 153 142 134 135 136 142 143 148 161 174 186 189 189 175 162 174 159 155 153 153 148 149 148 175 239 244 248 244 239 236 238 240 251 252 239 239 246 245 240 240 242 244 247 244 244 249 246 242 241 241 243 244 247 247 244 156 66 50 35 31 27 25 30 28 25 19 18 19 18 19 17 17 18 20 23 25 29 30 33 34 34 34 37 37 42 44 43 41 36 36 37 35 34 33 35 35 38 38 39 36 39 39 41 39 39 39 39 38 38 41 40 38 39 39 40 39 39 39 40 38 39 39 73 80 108 108 104 114 114 105 90 72 62 55 47 45 46 43 118 177 200 216 228 242 241 247 247 245 248 252 246 244 242 237 217 206 194 170 149 131 113 96 88 87 80 77 75 73 74 84 86 79 80 84 84 83 78 75 63 60 54 51 48 46 42 40 40 39 39 40 38 36 36 35 35 36 37 36 36 35 36 35 34 34 33 33 32 32 31 32 32 31 32 33 35 37 36 37 39 40 45 46 46 44 45 45 47 48 49 52 53 51 49 49 49 47 51 55 60 65 71 77 77 75 72 64 57 54 64 82 130 178 211 231 241 237 235 231 183 114 49 49 52 53 56 56 61 66 77 93 110 123 121 123 134 152 182 200 216 223 220 215 203 187 160 134 115 107 103 116 135 148 155 146 154 162 189 210 144 155 166 193 183 180 184 186 247 251 251 240 178 155 152 158 184 227 250 252 253 252 252 230 189 192 187 174 178 171 138 139 101 85 67 55 47 43 38 37 37 36 36 35 35 34 35 36 36 35 36 37 40 43 45 47 49 50 52 51 49 50 49 47 47 47 47 46 44 44 44 46 44 42 40 40 40 42 41 39 39 37 36 34 33 34 35 36 36 35 34 34 33 32 35 34 35 36 34 32 31 32 30 29 29 27 30 30 29 28 28 29 28 28 28 28 27 30 30 29 26 27 27 28 29 29 29 29 28 29 29 29 29 30 30 30 33 34 35 37 34 34 33 34 33 32 32 30 29 30 29 28 29 27 28 29 29 28 27 26 29 30 29 30 31 31 32 36 37 36 40 43 43 43 44 46 45 45 45 46 46 46 46 46 44 45 44 46 46 45 47 44 38 35 27 22 20 18 18 16 15 16 16 15 16 16 17 18 26 40 58 123 144 164 155 137 135 137 141 145 147 160 174 182 189 190 175 159 152 158 156 152 152 152 149 150 158 218 241 241 247 244 241 240 243 244 247 249 248 247 250 248 244 239 239 236 241 242 246 246 249 248 242 238 244 248 244 244 234 122 58 43 34 29 27 27 29 28 22 20 19 18 18 19 17 18 20 22 25 27 29 30 34 34 37 37 39 38 43 45 44 39 36 35 34 33 33 33 34 35 37 38 39 40 41 41 39 37 38 37 38 38 39 40 40 40 38 39 40 38 40 40 40 39 38 37 72 75 95 113 101 108 117 127 124 107 90 74 61 57 55 56 60 70 81 99 115 132 156 178 211 230 236 245 247 247 245 238 240 245 239 231 239 239 221 206 197 187 168 156 132 112 94 93 95 81 78 82 89 88 86 99 106 108 98 87 72 64 55 52 49 47 46 45 45 42 40 40 38 37 37 37 36 36 37 36 37 35 34 34 34 32 32 33 34 33 34 36 35 36 36 37 37 36 39 41 42 45 49 50 54 58 61 63 66 67 68 71 74 74 81 81 80 80 74 68 65 62 59 59 74 106 148 179 212 214 191 193 211 221 207 156 71 51 51 51 56 57 60 63 75 86 105 113 119 123 146 181 218 233 248 250 246 246 247 247 240 242 233 219 180 156 122 109 112 129 147 160 140 136 155 191 196 127 123 171 175 165 176 179 233 252 248 251 246 230 220 231 244 249 247 249 252 252 242 190 178 171 162 142 145 169 144 145 115 93 72 59 47 44 39 38 37 36 36 35 36 34 35 36 35 37 39 38 40 44 47 49 49 50 48 50 51 51 49 47 46 46 48 46 43 44 45 45 43 42 43 41 41 41 40 40 37 36 34 33 35 37 36 37 36 35 35 34 33 33 36 37 36 35 36 36 34 34 33 33 31 29 30 30 30 31 29 29 29 28 28 28 29 29 29 28 28 28 27 27 29 29 28 30 29 28 30 30 30 31 31 31 34 35 35 37 36 36 33 33 34 31 31 31 30 28 29 28 29 28 27 27 28 27 28 29 29 30 30 30 31 31 33 34 36 37 39 42 43 43 43 44 44 45 46 47 46 46 46 45 44 46 45 46 48 46 48 45 40 36 30 24 19 18 15 14 15 14 16 15 15 16 17 19 24 35 49 106 144 157 162 140 138 141 148 149 158 170 177 184 188 180 165 151 156 157 155 150 152 149 150 150 177 239 249 246 247 242 246 248 247 248 246 247 239 247 249 250 247 245 244 241 242 242 244 248 250 245 243 243 249 248 246 244 219 98 55 41 33 28 26 28 30 28 21 18 18 18 19 19 17 18 20 23 28 29 33 33 33 36 38 35 37 37 42 45 46 39 37 35 33 34 34 34 35 35 37 36 37 39 41 41 39 38 39 37 37 38 38 38 39 40 39 38 39 37 39 39 39 40 39 40 70 71 85 125 114 93 102 111 127 138 137 121 107 98 84 76 69 66 66 67 66 66 62 61 65 72 86 106 128 146 169 186 210 228 230 234 231 230 236 242 244 245 245 241 245 243 231 213 201 179 157 141 127 120 101 92 87 88 99 108 115 117 116 105 93 83 75 67 61 53 51 50 47 42 41 42 41 40 41 41 39 38 37 37 39 38 37 36 36 35 36 37 36 35 37 38 39 38 39 39 40 45 53 55 62 66 70 69 79 82 86 87 81 76 70 63 60 57 61 66 76 87 116 153 187 186 155 164 173 173 141 113 123 129 71 48 55 53 57 60 63 69 78 89 106 118 115 119 143 183 239 253 252 253 253 254 250 246 249 252 251 251 250 252 250 245 208 158 116 108 128 144 141 125 139 181 202 174 87 127 164 159 171 187 213 250 244 245 247 250 252 252 251 253 253 252 254 246 202 193 146 135 152 130 132 141 158 140 138 111 83 65 52 45 41 41 37 36 35 36 35 35 37 35 35 37 39 38 40 43 48 49 50 51 49 51 51 51 51 48 47 47 45 45 44 44 45 43 42 42 44 41 41 41 39 40 38 35 35 35 36 37 35 34 34 33 34 34 34 34 35 35 34 35 35 36 37 37 35 34 33 33 34 32 32 33 31 31 30 29 29 29 27 28 28 27 29 29 30 29 30 30 28 30 29 28 30 32 31 30 31 33 33 36 37 36 35 35 32 33 35 33 32 30 29 29 29 28 29 27 27 26 27 28 31 30 29 29 30 30 31 30 32 34 37 38 38 41 42 43 42 43 44 45 47 47 45 46 47 45 45 45 45 46 47 47 48 47 40 39 31 23 20 19 16 15 17 15 17 15 15 17 17 18 22 32 43 79 142 145 169 153 139 147 149 158 172 178 185 184 174 163 154 153 157 158 151 149 149 150 149 150 221 249 247 249 249 247 246 246 245 246 246 246 247 246 249 248 242 241 242 242 247 243 242 245 238 238 239 247 245 243 237 242 185 76 50 38 31 29 27 29 30 27 20 18 19 18 18 19 19 19 20 25 31 31 34 33 33 36 37 36 36 37 41 43 41 37 36 35 34 35 35 36 35 35 35 36 37 40 41 39 38 40 41 39 39 38 39 40 41 40 40 38 40 39 40 39 38 40 40 41 74 71 79 110 145 108 93 99 114 118 128 128 130 132 128 122 109 101 92 83 75 70 67 65 63 64 63 61 59 61 66 76 88 102 118 133 158 189 209 218 236 244 243 243 247 247 240 234 241 238 231 232 225 220 206 199 184 168 145 119 100 93 93 96 107 110 115 118 117 107 92 75 63 57 52 51 49 49 48 48 44 44 43 42 43 42 41 40 41 40 39 39 38 39 40 43 41 39 40 42 41 44 46 49 57 60 66 65 72 72 72 66 62 59 55 57 71 87 112 133 159 178 202 217 219 218 210 207 199 184 123 75 70 57 49 53 55 59 64 69 75 84 102 113 116 116 132 162 222 245 251 248 249 249 251 251 252 249 251 253 253 252 252 254 251 251 251 229 157 126 113 132 138 131 111 149 191 194 124 151 174 160 169 205 204 241 241 247 251 252 253 253 251 253 252 254 250 241 163 158 122 124 171 127 112 123 152 142 141 129 96 74 55 49 42 39 36 36 36 35 34 35 36 35 36 36 39 40 40 42 47 48 50 49 49 52 52 50 50 49 46 45 44 44 43 44 45 43 41 41 42 41 40 42 40 39 37 34 35 35 35 35 36 34 31 32 33 33 33 34 35 35 33 35 34 35 36 35 34 35 35 34 36 36 35 33 32 32 31 29 30 29 28 27 27 28 29 29 28 29 29 28 27 29 29 29 28 32 31 30 32 32 32 34 37 37 37 37 35 34 35 34 32 31 31 30 29 29 28 26 27 28 29 29 29 29 29 29 30 30 31 30 31 34 35 37 39 41 43 45 43 44 44 45 47 47 47 47 48 48 47 45 44 47 47 47 48 47 44 41 32 25 20 19 18 17 17 16 17 16 16 17 16 17 19 30 40 61 138 142 158 164 147 152 159 167 184 204 198 191 161 149 151 157 156 156 151 146 149 148 150 166 245 239 246 250 246 241 248 251 252 250 247 249 246 240 251 246 243 240 239 244 244 243 244 242 243 246 247 244 241 244 242 241 145 67 45 35 30 27 28 31 31 27 19 17 20 18 17 18 20 21 22 27 32 33 35 34 37 38 39 40 37 37 41 42 40 38 35 35 34 34 35 35 36 35 36 38 38 40 40 40 39 41 41 39 39 39 39 39 41 42 41 39 40 40 40 39 40 42 39 40 89 74 74 83 139 159 115 94 95 104 112 115 112 115 118 121 120 121 124 121 121 115 109 100 89 83 77 74 67 65 60 59 61 59 60 58 54 56 60 70 98 122 149 164 190 202 213 219 228 232 239 239 240 246 246 249 246 240 243 235 230 217 194 170 144 121 105 100 99 103 113 115 116 112 105 96 89 84 75 71 67 64 60 57 55 54 52 51 50 48 47 47 48 46 47 49 47 45 45 46 44 44 47 48 48 50 50 52 55 60 66 79 96 111 134 150 165 169 175 202 237 247 247 243 246 241 237 239 249 237 135 51 51 52 56 61 67 72 79 87 101 118 124 119 131 150 179 201 236 248 240 238 239 243 246 248 248 250 247 253 251 251 254 253 251 246 246 248 238 182 126 121 130 127 104 100 170 190 204 242 179 162 160 208 197 231 248 249 249 249 253 252 248 250 249 245 249 203 122 127 107 125 146 110 133 136 136 140 136 136 120 91 63 49 41 40 37 36 35 33 33 35 35 35 36 38 39 41 41 43 48 46 49 50 50 50 51 50 46 46 46 46 45 44 43 42 42 42 42 42 41 42 41 41 39 37 36 35 35 36 36 36 36 34 33 33 31 32 33 34 33 33 32 33 34 35 34 34 37 37 34 36 36 36 35 34 34 35 35 33 32 31 30 30 28 29 30 32 30 31 29 29 29 29 29 29 28 31 32 31 31 32 34 35 38 37 39 39 36 34 35 35 34 32 30 30 30 29 28 27 29 30 28 28 29 30 29 29 30 30 31 32 32 32 34 36 37 40 42 45 45 45 44 46 45 46 47 47 48 50 49 46 47 50 45 44 48 47 45 40 35 28 22 20 19 18 17 17 17 18 18 17 18 19 21 27 42 48 122 141 151 164 168 165 171 184 199 193 180 174 153 146 150 157 155 154 150 149 150 147 156 204 246 242 246 245 242 245 251 251 248 247 252 251 250 249 248 249 247 248 247 247 246 248 247 243 240 243 240 242 243 241 233 208 90 61 41 34 30 28 29 31 27 23 18 17 18 17 17 18 21 22 24 30 33 33 35 35 39 41 39 39 38 40 40 40 38 37 36 35 35 34 35 35 35 37 37 38 40 41 41 41 41 41 40 39 39 38 38 40 41 40 38 38 38 38 38 40 42 42 41 40 114 79 74 77 120 162 165 147 119 108 107 112 122 121 119 116 113 110 112 111 113 116 118 117 112 114 115 105 95 89 82 78 74 71 67 63 62 59 59 59 57 56 62 65 73 78 89 100 122 150 185 209 224 241 252 250 246 236 248 244 238 243 247 248 240 227 215 209 185 165 139 122 110 101 100 99 98 98 101 99 97 99 95 91 86 84 80 77 75 72 69 67 65 61 60 56 53 51 49 47 46 46 45 44 42 40 40 48 91 109 123 140 147 148 140 126 114 124 193 240 251 248 242 248 253 252 249 243 207 129 56 48 53 59 66 73 80 84 94 109 121 122 125 146 154 146 142 145 169 200 192 192 202 215 219 219 235 249 247 248 249 251 251 249 249 250 252 249 251 244 159 120 124 122 107 102 133 183 199 233 184 155 151 188 215 218 254 253 249 249 249 249 252 251 247 249 246 164 117 111 106 130 113 136 183 178 138 136 136 137 132 106 72 55 43 39 36 35 35 32 33 33 34 34 35 37 40 40 43 45 46 47 50 48 49 50 47 47 48 46 46 44 45 43 44 44 42 40 41 41 39 38 39 38 38 37 35 34 35 35 35 34 35 35 34 34 33 33 33 33 34 34 33 32 32 33 32 34 36 35 34 36 36 36 37 35 36 36 36 35 34 33 32 31 31 30 31 30 29 29 30 31 31 31 30 31 30 30 30 29 29 31 33 34 39 39 40 40 37 35 34 34 34 33 31 31 30 30 29 28 29 29 26 28 30 30 29 29 30 31 30 31 32 32 33 37 39 39 41 44 45 44 46 48 45 47 46 47 48 49 48 47 50 54 47 45 48 51 47 43 37 29 23 21 19 18 19 17 17 18 18 17 19 20 21 26 38 45 100 138 148 154 176 184 187 189 202 191 169 153 147 151 152 152 152 153 152 148 149 152 166 230 243 243 243 247 248 244 240 239 249 245 246 245 246 247 246 246 236 235 251 254 252 253 251 243 241 240 240 243 239 235 213 167 66 57 39 32 29 28 30 31 27 22 18 18 18 18 18 19 19 22 27 29 33 35 37 36 38 40 40 38 38 38 39 40 39 37 35 35 34 34 35 35 35 36 37 39 41 42 41 40 39 39 40 39 39 40 40 40 42 41 38 38 38 38 37 39 41 41 40 40 176 91 77 78 96 146 178 174 216 215 179 148 130 136 134 123 115 113 116 114 115 115 112 111 111 110 107 109 107 114 119 116 108 109 99 97 94 86 81 75 69 68 60 60 60 57 57 58 58 56 58 62 69 91 119 142 163 180 209 222 230 237 250 250 248 248 251 249 248 241 242 248 237 228 214 188 162 148 132 122 115 110 101 96 94 94 91 91 90 88 85 82 78 75 71 70 65 59 57 51 45 44 41 36 32 32 34 38 66 63 69 62 55 53 59 76 142 214 247 246 241 242 246 253 249 247 220 154 66 57 60 62 72 77 83 88 96 107 124 123 127 147 201 231 217 197 170 141 137 132 132 142 167 176 160 154 161 182 235 237 230 231 238 246 248 243 244 249 248 250 234 144 118 130 114 122 125 144 197 217 206 163 146 148 206 205 249 251 250 249 246 245 249 252 252 252 224 129 122 111 127 109 106 188 206 144 136 124 136 138 138 126 91 68 50 44 39 35 34 33 33 34 33 35 33 34 38 40 42 46 47 48 48 49 47 49 49 51 49 48 47 46 44 42 42 39 38 38 39 39 38 36 38 36 37 35 33 32 35 35 32 32 31 33 33 32 32 32 30 32 38 40 36 34 32 32 32 33 33 33 33 34 33 34 37 37 36 36 36 37 37 37 36 34 33 30 30 30 31 30 31 32 30 30 32 31 31 31 31 31 31 33 33 34 39 39 39 40 37 37 35 35 35 33 32 32 30 30 30 28 29 30 29 28 28 29 28 30 31 30 29 31 31 32 34 36 36 38 41 43 44 45 43 45 45 47 47 48 49 48 47 47 48 52 50 49 49 51 52 46 40 31 24 21 21 19 20 19 18 20 20 20 21 21 22 27 40 48 76 135 142 149 161 182 191 191 186 178 168 152 150 152 153 150 150 153 148 149 150 150 194 232 239 247 245 242 242 247 236 242 249 247 244 251 243 239 235 238 241 244 250 247 243 239 238 239 245 246 241 234 234 218 179 123 57 51 37 31 27 29 31 30 26 21 18 17 18 19 18 19 19 24 30 31 34 36 37 36 37 39 38 38 38 39 40 39 37 34 32 34 34 34 35 37 36 35 36 39 43 43 42 42 40 40 42 40 40 37 38 39 42 41 39 38 38 38 38 40 40 40 40 41 219 120 81 78 85 121 178 176 206 244 248 236 215 206 197 155 115 110 109 111 113 115 114 116 115 115 112 112 109 112 110 107 110 111 112 112 116 116 122 121 117 103 93 83 72 69 68 65 61 60 62 59 59 57 60 60 63 68 84 97 112 121 157 177 195 219 235 246 248 242 233 240 241 245 244 237 236 237 231 225 222 216 209 204 190 186 184 181 177 174 167 163 160 160 148 136 117 106 94 70 43 43 37 32 28 27 29 31 39 56 45 43 55 67 97 163 235 248 246 249 249 248 243 240 223 180 95 66 60 64 71 81 86 85 93 102 117 120 121 130 177 224 240 245 245 249 239 221 182 160 158 170 175 177 171 159 144 152 174 181 189 189 202 230 216 200 203 220 225 226 232 203 107 129 122 128 132 118 181 210 216 169 149 147 187 199 237 253 249 247 246 249 252 253 252 252 204 127 125 123 146 94 119 206 185 124 115 144 161 140 141 134 112 83 59 48 40 38 35 33 34 33 33 36 35 37 37 40 42 47 50 51 50 49 49 48 48 49 48 47 45 42 40 40 39 38 37 37 36 37 36 35 34 34 32 33 32 30 32 32 30 31 29 31 33 32 31 32 31 30 35 37 36 32 32 31 33 34 32 31 32 33 32 32 35 35 34 35 36 37 38 38 37 37 36 35 32 32 33 31 32 31 31 31 30 30 30 30 32 30 33 34 33 33 37 40 40 40 37 37 36 36 36 34 34 32 31 31 29 27 28 29 30 30 28 29 28 29 31 30 29 30 32 34 35 36 38 39 40 41 44 45 43 46 47 47 47 47 48 49 49 47 48 49 49 53 49 50 50 46 41 34 24 21 22 20 20 18 19 19 21 21 22 24 28 36 42 45 64 125 141 147 153 167 181 182 180 172 167 160 154 151 152 150 150 149 149 151 151 156 223 236 239 250 251 247 241 244 243 241 245 251 243 245 244 239 237 237 239 248 244 239 238 238 241 242 247 244 241 237 222 182 150 101 56 48 35 28 26 26 30 31 27 22 19 18 19 20 18 19 20 24 31 33 36 37 39 39 40 42 40 41 40 39 39 38 38 36 34 36 34 32 34 36 36 36 36 39 42 41 43 41 41 40 39 38 40 40 40 41 42 42 42 40 39 39 39 41 39 39 40 40 240 180 84 81 80 94 163 180 194 229 250 245 233 241 241 240 222 201 180 159 139 126 110 106 109 110 107 109 110 111 110 109 111 111 110 110 108 107 111 109 110 115 115 113 118 118 110 107 97 93 89 82 75 71 65 66 63 62 60 59 60 62 62 58 62 66 81 101 126 142 162 186 207 227 238 239 238 239 244 240 246 252 247 245 236 240 245 249 251 251 247 244 244 247 239 210 166 123 79 63 50 48 39 31 25 24 27 31 49 52 53 65 91 144 226 246 248 252 253 254 253 247 239 190 92 63 68 69 78 91 97 93 92 99 115 122 121 126 166 215 244 244 246 239 238 247 246 245 242 240 243 246 247 249 249 242 235 228 214 195 174 165 163 169 164 147 140 147 147 146 192 222 159 109 141 123 140 122 150 198 219 194 144 152 177 199 220 248 252 250 247 251 252 253 254 252 163 133 126 154 107 93 141 218 139 112 117 194 210 153 140 142 126 106 73 55 43 39 36 35 33 33 34 35 35 36 37 40 43 48 51 52 52 52 52 51 49 49 48 46 43 41 39 38 37 36 37 36 35 36 34 33 34 33 34 34 32 32 31 30 31 32 30 30 31 30 29 30 30 30 32 30 31 31 30 28 31 31 31 30 31 31 32 32 33 34 35 36 37 37 38 38 38 37 37 37 36 35 34 33 33 33 33 32 33 31 31 31 31 32 34 35 33 34 37 38 38 39 38 37 38 34 34 34 32 31 33 31 28 29 30 31 30 30 27 27 29 28 29 29 29 28 31 34 36 36 37 37 39 41 45 46 45 46 46 46 46 46 49 49 51 51 46 45 50 51 48 47 48 46 43 36 25 23 22 21 21 21 22 21 23 22 24 28 39 64 73 44 53 111 139 142 147 153 168 173 174 171 165 159 154 150 150 148 149 149 149 151 150 188 248 247 237 239 245 242 248 249 246 245 241 240 239 249 247 242 246 242 241 249 249 240 239 240 243 240 245 242 247 236 184 151 147 77 52 41 33 31 28 28 31 29 25 22 19 19 18 17 19 20 20 24 30 32 37 39 40 42 42 42 41 41 43 40 39 39 36 34 34 35 34 35 34 34 35 34 37 39 41 43 43 42 41 41 39 39 40 41 40 40 41 41 40 38 39 38 37 37 37 36 40 40 234 225 105 86 78 84 140 174 191 211 245 246 246 251 251 248 244 245 245 238 235 224 201 185 168 149 126 111 101 100 98 103 105 107 109 112 115 115 113 113 113 109 107 107 107 111 111 115 114 114 124 121 113 116 109 99 94 86 76 70 66 65 62 63 61 63 59 58 56 60 65 75 86 105 115 128 150 181 213 222 238 243 245 249 246 241 241 250 251 246 244 250 244 243 246 246 248 236 201 164 100 63 53 46 32 26 32 38 54 66 80 115 196 231 245 250 247 251 248 252 251 224 139 84 64 67 79 93 105 104 98 99 110 120 119 119 143 187 238 249 242 239 246 240 247 248 246 246 238 239 251 249 243 238 244 244 241 241 239 240 239 238 232 226 216 201 184 167 139 144 193 212 201 112 133 128 134 136 135 175 217 195 137 159 161 181 213 242 246 245 252 253 254 254 253 236 144 145 140 150 95 93 168 216 105 110 149 218 241 184 138 142 141 122 94 67 50 44 38 38 36 35 36 35 38 38 38 40 42 47 51 53 55 54 52 53 52 50 49 44 41 39 38 37 38 37 35 36 37 36 33 32 34 31 34 32 31 31 31 30 31 31 30 30 29 29 30 29 31 32 33 30 31 31 30 29 28 30 30 29 28 30 31 29 32 33 32 34 36 37 37 36 35 36 37 39 38 37 36 34 33 34 33 32 33 32 33 32 32 33 33 33 34 35 38 39 38 40 39 37 38 36 35 34 33 32 32 31 30 30 31 31 29 28 28 29 27 26 28 30 32 31 32 34 35 36 37 36 40 39 42 44 45 43 45 46 48 46 48 50 51 50 47 45 49 51 47 46 46 46 44 38 29 25 24 23 21 21 23 23 24 25 27 35 55 98 118 48 47 90 138 140 147 152 157 163 168 169 163 158 151 151 149 147 149 148 149 151 158 219 244 244 244 244 244 242 244 242 244 245 244 240 238 245 243 242 246 244 247 249 244 242 236 241 244 244 246 239 233 214 165 150 138 68 49 39 33 28 28 30 32 29 24 20 18 19 17 17 19 19 22 25 31 33 39 39 41 44 43 43 41 42 43 42 40 37 35 35 34 33 33 33 32 33 35 35 37 41 41 42 42 42 41 40 40 40 41 39 40 41 41 41 40 39 38 37 36 36 37 37 40 38 245 249 155 97 76 80 107 160 186 191 234 247 243 248 249 246 246 244 243 247 248 244 239 240 246 249 244 231 213 202 182 170 142 121 108 104 104 103 102 101 107 105 103 108 110 109 108 110 109 109 110 107 108 107 111 118 121 120 123 122 122 114 99 93 86 74 74 70 65 64 61 60 62 61 60 59 58 59 63 69 89 105 136 161 179 194 215 233 240 233 238 244 248 252 249 247 251 249 247 247 239 208 150 107 35 34 39 40 53 130 197 235 241 242 247 240 248 252 242 216 136 80 65 73 84 103 120 120 103 99 109 118 124 119 136 175 222 236 239 242 244 248 247 240 244 242 244 240 241 244 244 245 244 242 243 243 247 245 243 245 242 242 243 241 241 240 245 242 229 223 209 204 195 149 111 131 132 138 132 149 213 189 122 147 151 149 193 226 235 237 245 252 254 252 242 202 141 157 168 116 95 96 202 182 102 118 192 235 253 232 154 126 151 140 118 96 62 50 43 39 39 38 37 37 38 39 39 40 42 46 52 54 54 55 53 53 51 50 48 43 40 38 36 36 35 34 33 34 33 34 35 32 33 32 31 30 29 29 30 31 33 32 29 29 30 29 29 30 30 32 33 32 31 31 30 30 28 29 28 29 31 32 30 30 32 32 30 32 34 36 36 36 36 36 37 38 37 36 37 38 36 37 35 36 33 32 35 37 36 34 32 34 36 36 37 38 39 41 38 38 37 37 35 33 34 33 31 31 32 30 30 28 29 29 29 28 26 28 30 30 30 30 32 33 35 36 37 39 41 39 39 41 42 44 45 44 47 48 50 50 51 51 48 44 46 49 48 47 48 50 47 42 33 27 27 25 25 25 25 25 27 29 39 55 96 128 139 56 47 66 137 138 146 148 149 151 158 161 158 154 151 151 149 148 148 150 152 151 190 241 240 244 251 248 241 245 247 246 247 241 238 240 241 243 242 241 244 240 243 238 245 247 243 246 246 247 247 240 203 166 151 148 115 59 46 36 30 27 29 32 30 25 21 19 18 19 18 19 21 20 25 28 31 35 37 41 42 42 44 44 41 42 40 41 38 37 36 36 33 35 34 34 33 33 34 37 39 42 42 42 43 42 41 40 40 41 39 38 39 38 39 40 39 39 40 37 38 37 37 35 38 38 244 244 205 110 94 78 89 139 184 185 214 245 246 251 253 250 245 238 238 247 250 238 239 243 250 248 242 243 237 242 251 250 229 219 204 198 190 176 152 129 109 98 91 94 98 103 106 108 111 108 109 109 111 107 107 109 111 114 116 116 121 121 121 123 125 123 114 108 105 100 89 81 74 69 65 65 61 60 61 60 61 59 60 65 72 78 94 112 125 136 164 189 218 238 248 244 249 251 243 241 244 241 245 209 38 40 42 41 84 216 243 244 247 247 247 243 246 233 161 101 71 74 79 96 125 137 111 103 105 118 127 122 124 147 209 236 239 240 242 239 250 248 242 244 249 245 243 242 243 245 238 245 248 248 241 239 248 248 242 233 232 236 235 239 235 241 245 246 240 240 241 241 243 204 106 125 139 142 136 139 210 197 121 126 140 146 176 211 206 196 203 233 251 252 245 181 147 172 172 108 102 123 211 149 115 137 211 244 253 251 180 128 130 144 135 113 87 61 50 45 44 42 40 39 40 39 42 43 46 49 54 55 56 56 54 54 51 50 44 40 38 36 35 36 35 33 32 32 31 32 32 30 31 30 32 31 31 30 29 29 31 30 29 29 27 28 29 30 31 31 29 30 32 30 31 30 31 30 29 29 31 30 31 31 31 32 31 33 32 33 34 35 34 35 37 37 37 37 38 40 38 38 38 39 37 37 36 36 37 35 34 35 37 37 36 37 39 42 38 39 38 41 36 35 34 32 33 33 32 31 30 29 28 28 30 29 28 30 30 31 31 30 30 31 34 36 38 40 41 42 42 43 43 45 46 45 45 48 50 50 48 48 49 46 45 46 50 50 51 51 50 46 38 31 27 28 27 26 29 31 31 38 61 96 119 128 112 63 47 59 129 140 145 147 146 149 151 154 152 149 150 151 148 147 150 151 154 156 225 252 248 244 250 247 240 247 249 247 244 242 241 242 242 246 247 245 248 250 244 236 247 249 247 242 242 246 241 220 168 153 148 151 101 52 42 35 32 29 31 34 31 26 21 19 18 18 21 21 21 21 24 29 31 35 40 42 40 41 43 42 42 42 40 40 40 38 36 35 35 35 34 33 34 34 36 38 39 40 41 41 43 41 40 39 39 41 41 40 39 38 39 39 40 40 40 38 37 36 37 36 37 37 213 210 189 102 114 82 82 107 168 182 190 235 244 243 244 248 249 249 246 235 230 237 239 245 249 247 252 249 238 249 252 251 241 240 241 246 252 252 247 240 231 212 191 176 165 145 123 113 102 100 97 98 99 103 107 109 110 113 113 112 117 120 117 114 114 115 116 119 121 127 128 127 129 131 117 107 104 96 85 80 75 72 67 64 63 61 61 62 64 63 59 61 70 81 104 122 142 157 182 200 217 227 247 214 36 45 41 39 120 239 236 247 248 244 235 208 147 95 73 80 92 110 141 144 123 109 104 113 129 125 123 135 196 231 242 241 241 245 248 241 246 246 249 249 249 243 241 249 245 245 245 249 240 245 243 240 248 244 236 237 241 241 239 243 242 245 246 247 236 238 237 234 243 236 134 125 147 148 138 137 186 195 111 117 128 138 164 204 177 172 175 164 182 194 199 150 153 139 152 130 129 164 205 126 121 164 222 249 250 249 215 161 101 101 140 132 108 91 66 55 49 44 45 43 43 45 44 48 55 59 59 57 57 53 55 53 52 46 41 38 35 33 34 35 33 30 30 31 30 30 28 30 28 28 30 30 27 29 29 30 30 30 30 30 28 27 28 30 31 29 30 31 30 31 31 30 30 31 31 32 31 30 30 31 29 31 31 30 30 31 31 32 33 33 36 36 36 37 38 39 37 37 39 39 38 38 37 38 39 38 37 37 38 37 36 37 38 40 41 39 39 41 38 36 34 33 33 30 30 31 30 30 29 30 30 29 29 30 30 30 29 32 33 33 35 36 39 41 42 42 43 42 44 44 43 44 42 43 47 49 49 47 46 46 45 47 52 54 55 55 53 54 45 35 31 31 29 31 37 41 50 67 99 113 110 105 130 121 43 53 105 139 144 145 146 146 146 145 148 148 148 151 151 150 150 151 156 179 249 250 250 247 243 247 237 241 242 243 248 250 242 243 243 243 240 236 244 246 246 242 239 241 248 244 242 236 207 176 156 156 153 151 78 50 39 37 35 32 34 37 33 25 22 19 21 21 21 19 20 21 24 29 34 36 41 42 42 39 39 43 42 40 40 39 38 37 36 34 35 34 32 33 33 34 36 37 36 40 40 41 42 40 39 40 40 41 39 40 40 39 37 39 39 39 39 40 39 38 40 39 37 38 108 102 81 61 111 94 80 89 150 178 186 217 246 247 249 248 250 244 239 237 230 233 238 239 249 249 252 252 248 250 252 247 246 245 251 249 252 252 248 245 242 237 233 236 241 230 221 209 200 186 159 143 129 112 96 95 95 98 99 103 110 112 114 114 116 118 118 115 116 117 114 118 122 125 122 123 128 129 131 128 125 122 111 98 89 80 74 71 70 67 63 65 64 64 65 63 63 63 76 83 96 111 138 120 30 44 43 40 124 234 226 221 193 156 119 95 77 81 94 114 133 145 134 119 112 113 122 123 122 125 173 214 239 245 245 246 244 246 247 240 242 241 244 248 252 249 252 248 246 243 243 250 247 247 243 240 250 248 248 250 250 247 231 241 244 245 243 249 237 235 235 234 237 237 156 135 144 156 135 135 166 188 77 108 127 130 152 191 195 194 183 170 154 159 152 145 153 138 140 155 142 161 194 110 124 183 217 228 242 245 240 183 124 92 91 136 127 109 83 68 54 52 52 51 55 56 55 55 59 61 63 62 60 56 54 54 49 44 39 37 35 33 32 33 32 31 30 30 29 29 29 29 28 27 29 29 28 29 28 28 30 30 30 29 27 27 28 30 29 28 29 30 31 29 30 29 29 29 29 30 31 30 29 30 30 31 30 31 31 31 31 32 31 31 35 35 35 36 36 38 39 39 41 40 39 39 39 39 40 40 39 39 40 38 38 38 39 39 41 40 40 39 38 37 35 34 33 31 31 31 29 30 31 30 29 30 31 31 30 31 30 33 32 33 36 36 39 41 43 46 45 45 44 42 42 42 41 44 47 47 49 47 44 47 48 49 54 56 58 58 56 59 54 44 37 34 34 38 45 55 74 91 101 104 103 123 184 189 49 51 84 137 143 148 147 147 145 144 144 146 149 151 153 153 154 153 157 207 248 246 253 253 248 244 247 249 246 246 252 251 245 241 247 247 244 241 241 239 241 239 236 241 244 245 237 217 172 156 149 148 145 140 63 49 42 42 39 36 41 43 36 28 21 19 22 21 20 19 21 22 25 31 35 38 42 42 45 42 42 43 41 40 41 40 39 37 34 33 34 33 33 34 35 36 37 37 39 42 42 39 40 40 41 40 39 39 40 41 40 39 38 39 38 38 38 39 38 38 40 38 38 39 77 75 55 45 84 116 80 84 117 170 195 194 236 241 250 244 248 249 238 239 246 248 246 247 250 252 251 247 243 243 242 244 243 242 247 253 252 252 245 241 246 250 238 242 236 240 238 243 239 240 243 238 238 225 208 212 193 169 146 132 118 112 107 101 101 101 104 107 109 111 110 114 118 118 116 120 117 118 117 118 123 126 134 137 138 136 127 118 114 111 103 97 87 81 75 73 69 66 65 63 64 65 64 58 53 50 51 54 61 82 80 76 72 76 87 95 114 135 153 143 127 120 119 122 127 127 118 121 153 197 242 245 249 240 241 243 245 242 245 241 238 243 245 245 253 251 244 243 246 245 246 248 247 245 247 246 247 254 254 250 251 247 237 245 242 242 248 250 245 237 234 237 227 230 173 125 149 161 131 130 152 186 81 91 137 128 136 159 219 245 240 242 240 243 209 161 174 175 135 141 112 167 180 98 134 203 201 163 177 199 235 189 156 113 65 69 113 125 108 92 74 66 66 70 75 77 74 67 61 60 62 64 61 59 55 50 44 41 37 37 34 33 33 32 30 32 31 31 30 30 31 29 28 28 29 29 28 28 29 30 29 27 27 28 27 27 27 29 28 29 28 29 29 29 30 29 28 28 28 29 31 29 29 30 31 31 31 31 32 30 30 31 30 31 33 33 34 35 37 36 39 40 40 39 41 41 41 40 43 41 40 41 40 38 38 40 40 38 39 40 39 39 39 38 37 37 36 34 33 32 31 29 32 31 31 29 30 29 29 30 31 33 32 34 35 35 35 37 43 44 43 45 46 43 42 42 43 45 46 48 47 46 47 48 49 49 50 55 56 58 60 65 65 59 54 49 45 46 53 74 83 80 80 98 141 179 206 237 93 52 65 126 143 146 146 144 141 142 141 144 147 150 153 155 155 161 171 233 244 249 250 244 244 246 242 249 249 248 252 250 244 243 243 239 241 244 249 243 241 239 243 246 248 244 222 180 150 152 149 149 149 128 55 48 53 59 55 51 54 60 43 31 23 21 22 21 20 20 21 24 27 32 35 38 41 41 44 43 43 40 39 40 40 39 38 36 34 33 34 34 36 35 37 36 37 38 38 41 43 44 42 41 41 40 41 39 41 40 39 40 40 40 40 41 38 39 38 37 38 40 40 38 71 71 55 44 60 124 89 82 100 154 191 188 223 242 247 243 246 246 238 245 251 250 245 240 240 244 245 234 237 241 241 248 247 248 251 253 250 250 248 247 249 242 246 249 250 247 243 242 238 238 242 240 239 233 228 238 240 240 240 226 221 215 198 180 163 145 120 106 102 98 97 101 102 105 108 111 112 116 118 120 122 123 122 123 121 123 126 131 133 134 139 145 138 129 123 115 105 93 85 79 76 72 68 67 63 62 63 65 71 77 83 89 103 118 138 152 160 151 133 124 124 123 124 122 119 114 128 177 225 235 238 242 245 245 249 248 251 243 246 248 236 238 245 248 247 250 243 244 244 245 246 247 242 245 244 245 245 246 247 238 237 240 247 249 243 248 245 249 249 240 235 235 230 234 190 123 152 157 122 128 143 178 86 83 108 119 132 135 214 239 239 246 244 241 205 156 167 168 160 127 119 182 164 89 151 214 188 148 153 165 216 189 173 123 90 54 60 92 120 111 88 74 79 84 86 86 83 77 71 62 60 64 64 59 53 47 41 39 35 36 33 32 31 31 30 30 30 31 30 29 29 27 27 28 28 28 28 30 29 29 29 28 29 29 28 27 27 27 28 29 29 29 29 28 29 29 29 29 28 28 28 28 27 28 30 31 32 31 33 32 30 30 30 31 32 32 34 34 36 37 37 37 39 38 40 40 42 42 42 40 41 41 41 40 39 41 41 40 39 41 38 38 39 38 38 38 37 35 34 33 32 31 33 31 31 32 32 30 31 30 31 33 34 34 34 35 35 38 40 41 44 43 44 43 41 41 43 44 46 46 46 47 47 49 49 51 51 55 57 62 66 69 71 72 70 67 59 57 65 73 73 69 82 136 180 198 234 249 141 56 60 113 141 144 148 145 145 144 143 145 146 149 151 153 156 161 189 242 248 248 245 246 248 250 246 248 249 250 246 247 249 244 244 245 242 241 245 245 247 241 241 240 244 225 188 166 154 154 156 153 153 117 52 48 72 95 86 72 62 70 47 34 26 24 22 21 21 21 22 25 28 32 37 38 41 42 44 42 40 40 40 40 40 39 36 35 33 33 34 33 35 36 37 37 37 37 37 42 41 42 41 42 41 40 41 40 42 40 39 40 40 40 40 41 38 39 40 38 38 40 40 39 111 67 60 48 48 96 122 83 89 125 179 189 199 238 247 248 245 245 249 251 239 242 240 235 238 228 231 236 249 246 251 251 248 247 244 247 250 251 252 248 245 244 242 247 249 247 242 246 248 248 235 234 236 239 248 245 237 239 247 245 244 246 251 249 246 242 242 230 213 192 164 151 135 122 109 108 101 101 104 105 110 113 118 118 119 122 122 123 125 118 119 121 124 125 129 133 136 137 136 135 129 119 114 114 115 116 119 124 135 142 151 162 169 160 150 141 138 130 125 122 118 113 109 109 125 164 217 239 232 230 238 246 246 246 240 245 250 245 243 245 247 243 244 244 249 253 250 245 241 241 248 245 239 237 239 239 235 246 244 238 242 242 245 250 245 247 244 244 249 248 240 243 248 247 210 140 157 152 127 131 144 169 94 72 92 107 130 130 193 231 247 248 243 244 194 159 171 171 165 160 151 197 141 88 171 215 223 203 188 186 181 173 180 148 103 69 46 43 68 94 96 83 74 80 87 87 87 83 79 71 59 61 60 56 48 43 39 36 35 35 33 33 32 32 32 30 29 28 29 30 28 28 28 27 29 29 27 28 26 26 26 28 29 29 27 28 28 26 27 26 28 26 26 27 29 28 29 28 27 27 26 27 27 27 27 28 30 31 29 31 29 29 29 27 29 30 31 32 33 35 35 36 38 39 40 41 42 42 41 41 43 42 41 41 40 41 42 41 39 41 40 40 39 38 38 39 38 37 36 34 33 32 32 31 30 31 32 30 30 31 31 31 32 32 31 34 37 37 38 38 41 41 39 41 42 42 42 43 42 44 45 48 49 48 48 50 54 57 63 67 71 74 77 80 77 74 70 68 69 68 66 63 114 178 199 229 240 241 181 67 58 90 139 143 147 147 146 142 142 143 146 149 152 155 159 170 226 243 251 249 251 247 244 243 245 248 250 251 245 242 249 246 243 238 236 239 244 243 240 246 245 242 230 193 159 157 155 151 154 151 151 97 52 46 104 152 147 101 77 74 54 42 34 27 22 23 22 22 23 26 32 34 38 40 44 47 45 42 42 41 40 40 39 39 37 35 34 33 35 34 35 35 34 34 36 38 39 42 43 42 42 40 40 40 40 41 41 40 41 40 39 40 39 41 39 38 38 38 39 39 38 37 178 69 71 57 50 69 129 95 87 101 163 192 192 225 248 242 249 252 248 245 238 244 248 238 239 229 238 246 247 247 246 248 243 242 244 246 238 238 244 242 243 247 241 245 246 245 238 240 243 242 236 242 243 241 250 248 250 240 245 245 243 245 250 250 248 247 251 248 240 241 236 237 229 216 208 206 182 165 146 133 117 109 104 101 107 110 111 115 119 120 120 123 125 123 122 125 124 126 126 125 127 129 132 135 141 139 140 138 140 140 141 140 136 130 128 128 126 119 112 107 105 105 115 147 205 237 242 238 233 239 248 252 241 243 240 248 251 249 249 247 249 247 249 247 247 245 246 244 248 250 247 241 239 243 246 247 240 248 242 247 249 251 245 243 236 242 239 240 244 250 250 247 240 242 211 138 151 134 156 137 143 167 110 76 87 106 126 140 169 222 253 248 247 250 189 166 181 184 168 172 178 207 123 88 182 212 238 247 243 243 238 230 218 175 111 89 46 44 46 50 75 92 86 86 93 90 84 82 83 77 61 60 60 52 45 41 37 36 36 37 34 33 33 32 32 31 31 29 30 31 30 29 30 28 29 29 28 27 29 28 27 27 29 28 27 28 28 28 28 27 28 26 26 26 29 29 28 29 27 26 25 25 26 27 26 28 29 29 27 28 29 30 30 30 32 31 30 33 33 34 33 35 38 40 42 41 41 41 43 42 42 43 42 43 42 40 43 42 41 41 39 39 41 40 40 39 36 37 36 34 34 31 30 31 31 30 30 30 28 29 30 30 31 30 30 31 34 34 35 36 37 39 40 41 41 42 41 41 41 43 42 45 45 48 47 51 55 58 67 70 77 79 82 83 78 76 76 69 65 59 62 67 161 194 224 243 247 245 211 84 60 73 136 143 145 145 144 142 143 144 147 150 157 160 163 196 252 246 245 250 251 247 240 243 246 248 250 249 250 251 244 237 240 239 230 226 227 226 227 227 231 229 203 177 158 150 148 146 154 152 143 83 50 53 114 172 162 133 124 106 73 54 39 31 24 24 23 22 24 29 34 36 38 40 45 49 47 44 41 41 41 39 37 36 35 35 33 33 34 35 35 35 34 36 37 38 39 43 43 42 42 41 40 39 39 40 40 40 40 40 40 40 41 40 38 38 39 40 38 38 40 38 202 84 77 72 63 60 116 119 82 89 134 179 196 202 242 240 245 245 247 240 236 242 244 239 246 245 250 242 239 242 248 246 242 241 241 244 248 248 246 246 251 249 246 243 249 243 244 248 248 249 242 248 249 252 253 249 246 243 243 243 242 250 246 240 243 247 251 250 249 250 248 243 241 236 241 252 248 247 250 247 238 227 204 186 170 153 139 124 110 109 105 108 107 112 116 119 120 121 121 122 123 123 127 131 132 136 142 144 141 135 125 118 112 107 105 103 99 94 95 103 124 161 216 242 243 239 242 245 241 241 244 247 243 247 242 239 245 249 240 245 240 237 244 247 238 233 239 241 242 250 241 248 248 252 248 248 242 240 239 241 243 242 242 236 230 243 249 246 246 247 250 247 248 247 209 140 141 127 146 137 141 164 130 79 85 104 118 153 154 207 247 246 242 249 179 162 154 156 154 164 178 212 108 89 194 210 235 242 243 245 244 242 242 200 132 119 54 47 44 42 47 64 99 108 103 102 97 89 81 79 64 59 55 50 44 40 37 37 36 35 34 33 32 33 33 34 33 32 30 30 31 31 31 30 28 28 28 30 30 29 28 26 27 28 28 30 29 28 27 29 29 28 29 28 29 27 28 29 30 29 27 27 27 27 28 27 26 29 27 27 27 28 30 29 29 29 29 30 31 33 33 34 34 36 39 41 41 42 42 43 44 44 43 43 44 43 40 41 42 42 42 40 40 42 39 37 34 34 34 34 33 32 31 32 31 29 28 29 28 29 31 30 30 29 29 29 32 32 32 36 37 38 40 39 38 39 40 39 38 40 39 42 44 46 47 48 50 57 67 74 80 81 83 81 82 83 75 68 61 60 62 122 199 223 245 247 246 241 238 127 59 61 127 139 141 144 144 143 144 143 147 152 158 167 177 231 254 253 247 252 253 250 250 249 250 251 243 248 248 252 241 239 240 237 229 237 224 219 214 219 221 204 172 159 154 147 149 149 150 149 136 69 50 70 128 176 157 127 114 194 154 78 59 38 30 28 26 25 28 32 34 37 43 45 50 50 48 44 40 41 39 38 37 37 35 33 33 33 33 34 37 37 36 35 36 38 41 41 44 42 40 40 40 40 41 40 40 39 40 41 42 41 42 41 39 38 40 39 40 40 38 37 202 93 89 87 81 73 103 136 90 87 110 166 195 203 230 240 242 245 248 244 237 246 245 238 245 248 242 237 236 240 245 239 244 234 237 239 250 252 243 242 244 246 247 245 247 246 246 252 245 238 239 242 243 249 251 249 247 253 244 241 244 248 244 249 251 247 245 248 244 249 244 237 248 241 246 249 247 247 248 246 246 251 249 245 245 241 234 219 206 193 172 159 135 122 113 109 106 105 104 107 110 110 116 121 131 141 154 151 139 127 121 112 105 103 103 102 101 104 120 150 208 241 253 253 248 242 241 250 246 245 246 246 245 245 242 244 238 241 241 240 240 241 248 245 248 242 242 240 248 244 237 237 251 249 235 238 249 244 222 218 238 235 232 231 232 239 242 244 249 243 243 245 242 234 204 137 144 123 142 137 145 166 146 79 89 91 104 148 168 203 242 245 243 251 172 146 141 144 136 148 167 210 98 93 193 210 232 247 239 244 238 241 248 219 151 120 81 53 44 41 43 52 146 187 127 114 117 105 92 86 76 64 54 48 44 42 38 38 36 35 35 34 33 34 32 33 34 34 30 30 32 32 32 32 30 29 28 31 29 29 29 27 28 29 32 31 29 29 29 30 28 28 29 29 28 26 28 28 30 30 28 28 26 27 28 28 27 28 27 27 26 26 28 27 27 29 29 29 29 30 31 33 34 35 36 38 39 43 42 43 43 43 43 44 45 44 42 42 41 41 40 41 40 41 39 37 36 35 33 32 31 31 32 30 31 31 29 29 29 28 29 30 28 29 28 28 31 31 34 37 37 36 38 39 39 39 39 40 39 39 40 42 43 43 44 45 48 52 67 77 82 84 81 84 90 85 73 72 68 57 90 172 221 244 245 244 250 250 245 165 58 61 110 138 140 144 143 142 143 145 146 152 158 165 185 240 255 254 254 254 254 246 250 247 246 250 247 243 248 252 246 238 235 231 222 223 225 219 213 223 223 205 169 155 150 145 151 155 150 145 124 65 46 93 121 141 124 105 150 223 110 75 69 46 34 31 28 25 27 33 36 39 45 48 52 53 48 45 41 41 38 39 39 37 35 33 33 32 33 34 37 36 37 36 38 39 42 43 42 42 42 42 41 40 40 40 40 40 41 41 42 40 42 41 41 40 41 40 39 39 37 38 224 153 132 134 131 150 174 139 120 84 93 138 191 201 211 240 246 246 244 239 239 242 248 243 250 251 246 244 241 242 242 240 239 237 230 233 239 249 244 248 250 249 249 240 238 240 244 248 244 244 242 243 242 245 249 248 247 243 242 244 245 246 247 246 245 243 241 247 250 250 247 248 250 248 251 252 248 241 237 250 247 245 242 242 247 249 238 237 240 243 248 249 243 237 232 222 205 186 170 165 167 177 193 175 135 139 156 143 131 132 136 134 131 132 132 140 165 190 218 232 243 249 254 252 249 247 246 243 244 249 249 249 245 237 237 241 243 249 246 249 245 245 249 247 238 236 239 241 239 235 239 239 249 240 220 223 250 245 233 232 248 245 250 246 236 241 237 243 240 237 239 238 235 237 209 141 142 125 147 138 151 172 177 97 103 89 95 115 187 192 236 246 242 244 163 141 142 151 124 121 165 202 88 88 192 212 218 243 243 246 246 245 249 243 185 124 106 65 44 41 40 50 109 224 231 177 115 111 113 110 96 86 66 56 51 46 42 41 36 35 36 36 33 35 34 35 35 35 33 32 32 33 33 32 31 31 31 30 30 31 30 30 28 29 31 30 29 30 29 29 29 29 30 29 28 27 28 28 28 29 28 28 27 27 27 28 28 27 28 28 26 27 27 28 28 29 28 28 29 30 30 31 33 33 33 35 38 41 41 42 42 40 42 44 45 46 50 48 44 42 41 42 42 42 41 38 36 35 34 33 32 33 34 32 31 29 28 28 29 29 28 29 28 30 28 27 29 31 34 35 33 35 37 37 36 38 38 38 37 39 42 43 43 44 42 44 50 55 73 80 80 81 87 91 87 79 85 94 67 72 168 210 245 248 249 245 248 250 244 217 66 60 87 134 138 140 142 143 145 145 147 151 156 162 194 244 253 254 254 252 243 242 247 242 244 246 253 252 251 252 250 244 237 230 229 235 236 229 228 233 237 222 180 161 153 150 153 153 146 148 107 60 49 120 112 108 113 109 214 168 72 53 79 57 38 31 27 26 28 32 37 39 44 49 53 53 49 46 41 41 40 39 36 36 35 35 36 35 34 35 37 34 38 38 39 39 41 42 41 42 43 40 39 40 41 42 41 39 40 41 39 42 43 41 40 40 41 40 40 41 39 38 232 232 226 233 227 240 242 178 136 95 92 115 180 198 203 235 251 239 241 247 244 245 243 240 251 246 245 244 243 248 248 245 236 232 235 239 243 249 248 244 244 245 250 247 243 241 246 246 243 237 240 238 234 236 237 240 250 248 246 245 242 239 241 236 244 240 240 241 246 249 249 247 244 247 251 252 251 245 244 248 242 239 242 242 249 247 240 239 236 244 249 250 246 247 248 251 250 242 232 241 246 247 235 235 222 229 238 217 188 176 176 182 195 207 214 222 228 232 238 239 241 249 252 254 251 252 253 249 247 245 241 240 240 238 237 240 244 243 238 240 234 245 246 244 238 243 231 238 249 247 245 246 250 243 213 222 250 248 247 241 250 249 240 230 231 233 234 234 229 234 231 228 226 232 211 146 138 122 151 138 156 171 208 126 105 93 94 99 180 183 231 244 245 245 159 142 144 157 121 118 163 201 86 86 180 209 210 238 245 248 250 248 251 251 208 152 111 84 51 45 40 44 80 187 246 238 188 141 116 98 104 103 95 79 58 53 49 46 42 39 39 37 34 35 38 36 36 36 36 34 34 33 34 33 34 34 32 31 31 32 32 32 31 31 31 32 30 29 29 28 28 29 29 28 29 29 29 30 28 30 29 29 29 28 27 26 26 27 28 28 27 26 27 29 29 28 28 29 29 29 29 29 30 31 33 32 34 35 39 41 42 41 41 42 43 42 45 44 43 43 43 42 43 43 42 42 38 36 34 33 33 33 32 31 31 30 29 29 29 28 27 26 28 30 30 29 29 31 32 32 33 34 37 36 34 36 37 36 36 39 42 41 42 42 41 45 52 63 77 79 81 85 93 92 83 85 106 88 69 135 214 241 249 248 250 250 246 247 248 240 92 61 74 128 136 138 140 140 144 144 147 152 155 159 205 242 254 254 254 252 248 247 249 247 244 246 247 243 243 249 252 246 249 244 241 240 241 241 236 233 242 236 197 171 158 155 156 154 149 148 102 53 57 143 103 108 116 141 214 113 61 41 75 69 42 32 29 27 28 33 38 39 44 52 56 54 50 45 41 42 40 38 36 36 35 35 36 35 34 34 33 34 37 36 38 41 42 42 42 42 41 40 40 41 39 40 40 39 41 43 40 41 42 41 42 43 42 40 40 41 39 38 220 242 240 247 246 250 242 238 154 119 90 95 158 186 196 209 252 248 246 244 244 242 238 239 247 247 246 249 247 245 246 247 246 240 247 241 244 246 238 242 248 248 248 246 244 248 243 234 232 244 248 240 246 245 239 243 241 242 244 244 242 238 239 232 230 230 239 247 251 246 249 251 252 254 250 248 252 247 247 243 244 244 245 243 248 247 247 247 251 249 247 245 249 245 242 248 251 247 238 244 241 237 235 233 245 252 250 242 241 239 236 237 241 249 245 245 244 237 230 241 250 247 248 253 252 248 238 237 238 247 249 250 248 247 248 245 242 240 247 247 242 240 249 240 234 236 240 243 248 248 250 251 247 248 236 236 241 252 245 245 243 244 242 244 236 228 237 239 238 237 233 228 229 228 205 144 133 126 159 137 159 180 221 173 113 100 92 94 161 179 220 243 249 242 156 137 142 147 120 139 175 205 85 89 159 210 208 233 245 246 248 243 245 250 235 186 118 121 68 48 41 42 59 125 245 245 243 213 150 138 123 107 91 89 81 75 68 63 56 49 46 42 41 39 40 38 38 37 36 36 35 34 35 35 34 35 34 34 33 34 34 34 33 33 32 33 32 32 31 31 31 30 30 30 29 30 31 29 28 30 28 29 29 29 28 28 28 28 29 27 28 27 26 26 26 26 26 29 29 28 29 29 30 31 30 32 33 34 35 37 39 41 40 42 42 43 44 44 43 44 44 46 45 44 44 43 41 39 36 33 33 34 32 31 30 30 30 30 29 28 27 27 27 27 29 29 28 30 31 31 31 30 33 33 34 34 33 33 35 37 39 39 39 39 44 48 57 69 76 77 87 92 89 84 93 108 88 70 139 211 247 252 243 249 255 253 248 242 253 250 145 62 69 112 134 134 137 141 142 144 145 150 155 161 196 230 253 255 254 250 247 242 248 250 249 251 252 249 247 246 250 248 247 249 243 242 241 241 237 238 240 239 227 200 176 165 160 157 149 145 84 52 77 158 98 113 128 195 146 72 52 42 58 82 48 33 29 28 31 35 40 40 46 52 58 57 50 44 42 40 40 38 36 37 34 33 34 33 33 35 34 35 38 39 39 38 41 42 40 40 40 40 41 42 40 40 41 41 40 41 39 39 40 39 42 43 42 40 40 41 38 37 221 234 249 250 243 251 252 251 190 143 93 94 132 176 197 198 241 250 252 241 237 239 238 239 241 245 244 243 245 242 245 247 243 248 249 241 245 238 238 244 251 246 247 240 242 245 248 242 242 249 249 242 248 249 239 244 247 246 241 240 242 240 244 229 226 230 237 243 249 249 252 254 251 250 247 247 246 244 246 242 241 246 243 244 250 252 252 251 251 246 242 241 249 241 242 250 248 248 245 244 239 235 241 238 240 247 247 249 245 242 237 234 231 239 244 242 238 239 236 228 246 248 241 238 238 233 239 243 248 248 241 246 252 250 246 246 250 246 245 246 239 240 249 238 238 247 249 244 246 248 250 250 244 244 244 244 235 247 245 243 244 248 241 240 248 241 242 244 246 242 239 237 234 234 202 147 123 131 157 138 161 181 223 206 121 116 90 96 142 186 208 236 251 233 155 127 143 148 126 150 176 204 88 91 139 205 211 225 246 249 246 243 241 247 245 202 140 123 113 53 45 44 51 83 213 244 244 249 213 129 82 111 130 72 77 81 78 82 84 72 57 53 50 47 45 45 43 40 39 39 38 37 38 38 37 36 36 35 35 34 34 36 33 34 34 33 32 33 32 32 32 33 32 31 30 31 33 31 30 29 29 30 31 31 30 30 29 28 28 27 27 26 26 26 26 27 26 28 29 27 27 27 28 28 29 30 30 31 32 33 36 38 39 41 44 45 46 46 46 47 48 48 47 46 45 45 44 41 39 37 35 35 33 32 31 32 31 30 28 29 29 28 29 28 29 30 29 30 32 31 32 31 33 33 32 33 34 34 35 37 37 38 40 42 46 52 62 69 76 86 88 82 83 92 106 98 71 117 208 240 245 244 239 247 250 244 248 241 246 247 192 73 62 95 131 131 135 140 142 142 144 150 155 152 185 210 247 254 254 251 243 249 246 243 243 247 254 251 248 241 245 242 245 244 239 239 237 235 238 240 242 243 239 234 205 179 169 164 156 147 69 47 105 151 105 120 153 203 90 58 51 51 60 89 56 37 33 29 32 37 41 41 48 56 60 58 51 45 41 40 40 38 36 36 35 33 34 34 35 35 35 35 36 37 38 40 41 43 41 42 40 42 42 41 40 40 41 41 40 40 39 40 41 42 41 43 42 39 40 40 39 37 211 223 248 252 245 250 244 245 225 168 117 89 112 156 192 200 211 247 250 245 241 251 241 241 246 242 233 242 248 252 249 245 245 248 249 244 252 245 240 239 246 244 244 246 242 241 248 248 246 245 246 245 249 252 246 242 243 239 238 229 226 232 245 231 225 230 239 241 239 239 244 248 248 241 243 245 247 248 250 246 247 250 244 245 248 249 247 244 249 242 242 243 250 252 251 247 242 242 238 247 240 237 252 251 249 251 243 245 251 249 247 241 242 241 236 240 226 231 227 224 239 248 245 242 239 238 245 238 244 250 244 233 246 248 245 250 245 241 247 248 240 245 250 246 251 252 247 237 240 247 247 244 242 245 251 246 247 247 249 249 246 247 241 245 250 252 246 244 246 249 241 242 237 246 212 144 120 130 150 135 161 186 228 242 144 128 95 94 117 197 184 222 251 227 149 124 142 156 120 147 185 202 95 92 115 192 215 215 234 241 243 242 238 244 250 231 158 108 142 98 58 48 46 64 157 246 248 244 243 229 139 63 56 51 40 47 62 74 83 88 84 74 67 67 64 61 54 53 46 47 46 43 42 46 45 42 39 38 38 39 40 37 35 37 37 36 35 35 35 34 34 33 34 33 34 34 33 34 31 30 32 31 31 31 29 31 29 29 29 29 29 27 27 27 25 26 27 27 28 27 28 27 27 28 29 29 28 30 30 30 32 31 35 34 40 43 46 45 48 48 47 50 49 49 48 47 47 46 43 41 38 37 35 33 34 31 30 28 28 29 29 30 29 29 32 32 32 32 32 31 32 32 33 32 32 34 35 35 35 35 35 38 40 43 49 58 71 79 84 85 80 84 94 102 91 78 136 218 244 237 243 247 248 251 244 245 248 241 221 205 162 81 56 79 124 133 133 136 138 141 143 148 155 133 165 180 220 251 254 254 236 246 246 241 246 252 247 241 246 250 249 246 241 236 236 240 243 240 239 240 239 239 240 246 231 210 188 173 155 142 62 42 151 137 116 124 196 140 58 50 52 70 115 131 62 38 33 33 33 40 42 42 49 56 58 55 48 43 41 41 37 37 36 35 34 33 34 35 35 35 34 36 36 35 38 40 41 41 41 42 40 41 42 40 41 40 41 41 39 40 39 39 40 41 41 42 42 39 38 38 37 37 190 220 234 247 245 248 243 241 238 193 141 95 98 138 190 202 190 237 246 243 243 244 242 244 246 243 238 244 245 241 244 246 247 245 246 249 246 239 242 241 242 247 249 249 248 244 245 248 241 244 249 244 249 247 243 242 246 238 243 238 226 229 240 244 233 227 240 248 244 230 233 236 244 242 239 245 249 241 239 250 243 245 245 250 246 239 240 238 245 248 251 251 246 245 243 235 232 243 244 246 244 239 248 252 248 253 246 243 243 240 248 250 253 248 236 236 228 230 234 232 237 245 247 248 246 242 247 245 238 240 247 242 248 247 246 246 250 251 248 249 243 246 251 254 252 251 249 247 249 250 251 242 242 247 250 244 253 249 246 246 239 241 245 243 244 251 250 248 249 245 248 245 242 249 202 145 118 133 147 133 164 191 234 251 167 133 108 91 106 187 181 213 241 219 147 124 140 152 114 146 189 203 109 93 104 179 216 214 231 245 237 239 243 245 239 240 187 124 111 121 85 53 49 57 112 219 239 240 238 242 236 151 50 47 31 32 36 58 112 89 78 81 76 78 87 93 85 76 67 60 56 55 51 49 49 46 43 44 42 44 43 40 39 39 37 36 38 38 36 36 37 37 36 35 35 34 34 34 32 33 32 31 31 31 30 31 31 31 32 31 30 30 30 29 26 27 28 27 30 29 28 28 28 28 29 30 31 30 29 31 32 30 33 33 37 38 42 43 46 47 48 50 50 51 49 50 51 49 48 45 41 37 37 36 34 34 33 30 28 29 30 31 30 32 32 31 31 32 34 32 31 30 32 33 33 34 34 36 36 36 37 39 44 46 54 66 83 83 80 81 81 90 105 92 80 129 223 249 244 241 235 237 246 250 245 232 187 145 104 83 67 74 58 71 110 131 134 135 136 139 142 148 172 139 142 164 199 246 254 254 237 244 248 247 246 247 246 250 244 242 247 247 245 245 244 245 238 242 245 244 239 241 241 243 242 242 226 208 181 132 56 47 180 137 127 145 189 84 53 51 78 120 172 180 71 42 36 35 36 42 43 45 53 56 58 54 47 42 40 41 38 37 35 35 34 34 34 35 35 34 34 35 37 36 38 40 41 41 41 42 41 42 41 41 41 40 41 39 38 38 40 39 40 41 41 42 40 38 38 39 38 37 189 210 225 238 246 248 250 248 244 230 157 114 94 107 176 198 187 212 247 240 244 244 238 241 246 244 241 241 243 244 244 245 243 244 250 249 245 238 240 246 245 240 242 247 250 247 243 246 248 251 247 245 247 244 237 239 238 236 246 240 230 231 237 244 246 242 239 249 244 238 243 237 236 240 246 241 245 238 234 238 242 245 243 247 247 247 244 242 243 242 240 233 224 236 245 245 235 241 251 248 245 245 250 251 251 252 246 243 245 244 244 249 242 237 242 245 247 245 245 249 247 240 228 217 226 244 244 252 248 241 241 244 242 245 250 247 249 250 248 248 244 244 243 251 249 243 241 239 249 247 242 244 243 241 242 246 248 246 244 247 250 250 250 245 244 242 241 241 248 251 241 236 244 248 202 143 116 133 146 136 167 195 237 248 196 137 123 91 98 149 189 205 237 211 145 125 140 139 112 140 199 204 140 90 100 148 214 217 222 245 243 242 243 241 239 245 226 168 124 110 135 94 59 53 70 149 240 245 242 249 252 205 46 46 31 32 39 50 85 129 135 120 108 101 89 89 100 109 107 100 86 81 77 71 65 61 59 57 56 54 51 50 47 45 45 44 41 42 42 40 40 41 38 37 36 36 37 36 36 36 35 33 34 34 33 34 32 32 33 32 33 32 32 31 31 30 30 29 30 30 28 29 30 29 30 28 29 29 31 32 31 31 30 31 32 33 35 38 40 43 45 48 48 51 51 50 53 52 50 51 48 44 41 40 34 36 32 32 31 31 31 32 30 33 33 33 32 31 30 31 30 30 32 32 32 32 35 36 37 39 41 43 49 55 62 75 86 91 97 97 97 106 84 84 161 233 248 240 238 246 237 236 228 199 135 86 65 61 54 49 48 55 84 63 97 122 132 133 136 137 140 150 234 232 201 176 175 230 253 254 244 233 249 247 241 239 241 245 248 249 251 251 249 246 245 242 241 242 245 246 245 242 241 242 242 247 246 246 229 125 53 72 190 141 138 184 107 60 56 86 141 179 184 162 102 51 41 37 39 45 48 49 54 54 54 49 44 41 40 39 36 37 33 33 32 34 35 33 34 33 35 35 36 37 41 43 43 42 42 41 40 42 41 42 40 39 42 41 41 40 39 40 40 40 40 41 40 38 39 39 38 37 204 194 222 232 242 241 243 246 246 238 186 135 93 98 153 191 194 195 246 245 239 238 243 247 245 247 250 250 241 247 247 247 246 252 248 245 241 239 243 243 247 245 235 240 245 248 246 246 242 247 241 246 250 247 240 245 249 245 244 233 240 243 236 238 238 242 248 242 236 237 239 232 239 241 246 242 240 233 228 233 237 240 250 250 237 232 237 244 250 248 241 227 229 245 254 249 240 244 253 251 251 249 253 253 251 251 247 243 248 247 241 244 242 247 244 242 240 231 236 243 237 236 243 236 234 242 248 251 248 242 244 246 242 246 246 242 249 252 249 248 248 252 249 253 251 251 247 240 248 247 242 245 249 241 250 250 250 251 251 251 253 250 248 251 249 245 245 241 247 248 241 236 241 247 196 143 119 135 149 138 169 200 236 242 219 146 130 98 99 118 192 188 237 208 144 127 143 138 110 144 199 200 162 96 100 121 209 220 219 245 248 250 250 243 235 246 243 192 142 118 111 136 100 69 63 75 180 242 252 250 245 186 46 51 38 38 58 123 157 169 191 203 203 191 151 124 104 99 97 95 94 92 95 95 95 90 82 80 75 72 67 63 59 57 55 53 51 50 48 46 45 45 40 39 40 40 39 40 39 37 38 36 34 36 35 37 34 34 34 35 33 32 33 32 34 31 32 30 31 31 30 30 29 29 30 30 31 31 33 32 31 33 30 30 31 32 33 35 35 37 40 42 47 49 51 52 52 53 54 53 54 52 48 43 37 37 34 33 34 32 32 31 31 33 32 35 33 33 31 31 33 32 32 33 33 33 35 38 39 42 47 50 58 66 76 91 108 116 112 110 101 81 91 165 238 252 252 244 242 248 233 193 118 84 63 57 52 51 48 47 47 50 92 78 86 114 130 134 138 137 143 167 226 229 225 220 189 216 253 254 249 227 252 252 247 238 242 240 244 247 250 253 243 242 245 246 247 246 245 246 242 240 240 242 242 243 243 248 223 110 55 105 183 148 158 157 65 65 92 138 182 183 162 161 135 74 44 42 41 46 51 52 56 56 53 46 41 41 40 41 36 38 34 34 34 34 33 32 33 34 34 35 37 38 39 42 41 42 42 41 41 43 42 42 41 40 43 40 41 39 39 39 39 40 39 39 41 39 39 38 37 36 210 188 213 223 242 245 244 243 250 250 229 159 110 93 119 177 197 187 224 248 245 247 245 248 248 242 240 243 247 248 246 243 249 253 245 240 244 240 241 236 247 245 249 248 244 246 249 252 247 245 245 245 252 248 237 236 239 239 238 245 242 241 239 237 236 243 244 247 246 241 245 231 235 241 247 246 247 240 236 238 243 246 252 249 240 248 249 242 235 238 244 245 245 242 249 243 243 246 251 252 248 249 250 248 250 249 248 244 246 240 241 246 244 241 244 247 235 224 220 236 239 236 239 243 250 248 247 244 248 247 247 241 241 244 247 249 248 249 249 250 246 248 248 249 248 245 243 245 245 248 240 240 243 242 246 250 249 249 247 246 250 249 241 242 247 244 243 241 245 247 248 247 239 240 182 140 117 138 150 138 171 201 243 251 235 166 132 117 109 99 192 180 232 198 139 124 141 137 108 143 201 195 187 115 96 108 160 202 219 237 250 246 242 242 234 233 244 233 166 140 146 169 161 140 103 72 65 120 200 227 233 121 49 49 40 36 144 241 245 251 251 249 249 240 235 237 226 203 165 138 119 107 96 90 89 87 94 99 101 95 89 85 80 78 79 72 67 65 63 62 60 56 51 51 50 48 48 46 45 43 41 40 39 39 37 38 36 35 37 36 36 34 34 33 34 34 35 34 35 34 34 33 33 33 31 32 31 30 31 32 32 32 29 30 32 31 33 35 34 37 38 39 42 45 49 52 55 56 57 57 56 56 55 52 43 41 39 37 34 34 34 33 34 32 32 32 32 32 32 34 33 34 32 33 35 37 39 41 46 50 56 65 80 93 118 136 135 126 111 94 83 117 208 245 247 248 252 243 225 180 96 64 55 51 50 48 47 48 48 54 63 75 89 104 90 99 124 133 141 143 150 134 152 175 184 191 199 206 245 253 254 230 238 251 252 247 244 241 240 239 249 252 248 238 236 240 244 246 245 246 247 239 240 242 242 241 245 247 201 94 53 140 175 161 147 86 69 90 161 182 176 156 159 160 158 116 58 48 45 46 51 58 59 60 54 49 41 41 41 40 38 36 32 31 33 33 33 33 33 34 35 36 37 38 40 40 42 43 42 43 43 41 40 40 40 40 41 40 42 41 42 41 40 40 40 40 40 39 39 38 37 36 191 203 196 221 234 243 244 243 247 249 246 189 127 95 107 153 191 190 205 244 244 251 247 250 248 239 242 243 244 245 248 247 251 251 245 242 241 242 240 241 253 252 244 243 241 248 249 249 249 244 240 244 249 240 242 244 240 237 239 242 244 244 248 240 238 242 240 246 252 249 251 246 240 237 241 243 247 239 243 250 245 251 249 250 244 247 244 232 226 238 239 244 239 241 247 247 240 240 249 248 243 242 244 243 250 248 243 238 244 240 243 245 248 243 240 236 227 220 220 232 245 248 247 250 250 246 247 243 247 245 248 247 246 244 244 243 243 247 250 249 245 244 247 246 242 242 245 249 250 245 241 242 249 245 244 247 248 247 241 243 252 248 243 240 244 241 242 236 237 240 246 241 240 241 183 139 117 140 158 138 173 206 246 253 249 201 127 132 133 104 169 182 221 192 141 127 141 135 114 154 205 217 190 143 93 106 126 164 220 229 252 250 248 245 242 242 250 249 209 160 147 180 197 185 161 141 97 69 84 105 122 67 51 44 42 38 191 248 248 252 250 246 246 242 240 245 248 249 245 234 222 205 176 156 124 105 92 88 85 89 88 86 85 88 96 94 92 92 88 84 84 77 69 68 63 61 58 56 54 51 49 47 45 44 43 41 42 40 40 40 37 37 36 35 36 35 36 35 35 35 35 35 34 34 32 32 32 31 32 34 33 32 31 33 34 33 34 35 35 37 38 38 41 44 46 51 56 59 59 59 59 60 58 56 52 46 42 39 37 37 35 36 35 33 33 32 33 33 33 33 33 33 34 37 39 40 45 49 56 65 81 94 110 121 155 201 156 118 86 88 157 219 240 241 241 243 245 202 118 76 57 52 50 49 47 48 48 51 60 69 83 103 122 143 144 117 106 120 143 150 158 151 147 146 147 155 171 182 218 249 254 237 231 250 247 245 248 241 239 239 244 251 248 243 245 242 244 246 245 241 246 246 243 245 246 247 246 248 160 78 55 154 176 178 106 68 94 144 194 203 183 179 171 162 158 137 90 52 47 46 55 63 64 61 56 50 42 40 39 39 38 38 33 31 32 34 33 33 34 34 36 37 38 37 40 41 41 42 43 43 43 40 40 40 39 38 40 40 41 42 41 42 40 41 40 40 40 40 40 38 36 35 151 206 191 210 223 240 252 247 241 241 242 229 150 114 95 126 182 195 200 228 240 239 239 247 243 244 236 242 249 240 246 248 248 247 245 246 240 238 239 250 251 247 245 244 243 241 242 248 245 236 239 248 245 239 244 251 252 245 239 242 244 241 246 249 250 253 251 248 252 250 250 251 246 247 248 245 249 245 250 250 245 245 249 248 244 247 248 237 240 250 245 243 244 251 252 250 247 247 247 245 242 244 247 239 247 245 245 240 249 240 245 237 248 243 243 232 234 233 234 243 248 251 252 253 251 249 250 244 244 247 248 244 243 240 245 242 241 245 252 253 249 247 250 251 245 243 244 247 246 241 251 247 243 247 246 246 248 248 250 247 243 249 248 244 241 237 230 228 236 249 244 243 244 246 177 137 117 145 161 143 176 207 245 249 246 235 144 136 127 105 132 191 192 186 136 125 151 134 114 156 209 239 194 176 91 99 114 130 213 219 239 242 250 250 246 238 245 249 247 209 147 141 155 174 193 185 183 160 99 79 65 57 50 48 44 40 120 166 184 207 221 228 242 242 242 247 251 245 246 244 241 242 245 249 242 232 214 197 172 150 129 114 101 91 90 89 89 88 91 94 99 102 100 94 86 84 82 78 74 70 64 63 60 58 54 52 49 49 46 44 43 42 41 40 39 39 38 38 38 38 37 35 36 37 35 35 35 34 34 34 33 34 35 35 34 35 35 35 38 38 37 37 39 40 42 45 52 57 61 63 62 62 62 61 59 55 48 41 38 39 38 36 34 34 36 35 33 32 34 35 35 37 39 41 44 48 54 62 80 93 106 113 121 122 149 141 97 98 139 201 240 239 243 240 237 208 121 69 56 54 49 49 46 45 48 55 61 72 96 122 148 159 165 163 159 161 146 130 123 137 165 172 172 167 162 149 146 154 159 209 248 239 216 245 245 243 245 243 248 250 246 247 248 241 247 244 238 243 243 241 244 243 247 244 246 245 244 196 108 67 62 142 191 183 79 85 147 182 223 235 237 230 204 185 176 159 134 83 52 54 64 70 70 63 57 51 44 41 38 38 37 36 33 33 32 33 33 34 34 35 36 36 37 39 40 43 42 43 43 42 42 40 40 40 39 39 38 40 41 42 41 40 39 41 40 39 40 40 38 37 35 37 132 195 197 197 221 235 252 247 239 240 245 243 182 129 96 107 171 191 202 211 241 245 248 251 247 247 245 241 245 247 250 248 247 245 240 245 244 241 247 245 248 249 250 252 248 244 247 246 247 246 248 250 248 247 244 243 251 245 243 243 244 246 244 241 249 253 250 250 253 251 245 251 248 243 249 246 249 248 246 243 242 249 252 243 244 249 250 245 247 248 244 240 248 253 253 249 245 247 248 249 243 236 244 239 240 244 246 248 248 244 242 236 246 250 249 242 246 240 234 234 243 246 248 246 247 249 251 250 244 239 243 250 249 247 251 249 246 250 252 252 251 244 239 245 248 249 237 244 242 245 251 248 244 247 246 244 247 251 249 247 246 249 247 234 231 232 243 245 245 251 251 248 248 250 178 136 118 151 161 141 178 211 243 248 247 247 168 133 111 101 116 194 175 177 133 128 155 132 119 161 211 243 205 198 96 99 110 122 200 218 230 243 253 252 247 242 242 245 247 240 180 129 146 148 154 177 194 201 182 154 106 78 59 59 56 51 54 63 74 83 100 113 138 166 190 214 229 239 247 241 235 240 243 242 238 239 245 242 242 239 230 221 195 179 176 164 148 132 112 101 91 90 90 88 88 86 83 79 78 77 72 75 78 79 81 76 69 63 56 55 53 52 49 46 44 43 43 44 43 42 40 37 39 39 39 37 37 37 36 36 36 37 35 36 36 37 37 36 38 38 37 37 38 39 41 43 47 52 58 60 60 61 62 63 62 61 55 48 41 40 41 40 39 37 37 37 35 35 38 39 40 41 46 47 52 58 67 80 91 99 106 106 106 102 90 87 128 188 234 238 241 243 248 237 158 94 58 55 51 49 48 49 49 54 60 67 91 120 153 165 158 159 155 148 144 142 143 132 113 112 117 126 150 172 175 165 170 167 156 192 228 231 206 235 247 248 244 241 246 248 249 251 247 241 246 245 237 239 242 241 244 240 244 243 245 250 223 146 104 62 76 131 149 131 92 131 172 206 235 240 234 233 232 226 220 195 131 125 64 67 88 86 76 68 56 50 45 42 39 39 38 35 33 34 33 33 33 34 33 33 34 35 37 40 41 43 43 44 43 43 43 41 40 41 40 39 39 40 40 41 41 40 39 40 41 40 40 40 37 37 36 36 144 164 205 185 217 226 244 247 244 238 245 243 213 156 108 97 142 179 197 199 229 246 246 247 248 248 251 242 238 248 249 243 241 246 246 250 246 243 245 245 250 249 243 245 252 249 246 247 248 249 251 247 246 243 241 240 240 239 233 237 241 241 236 244 247 250 252 249 242 238 244 251 250 239 243 242 249 247 246 250 247 239 240 227 223 231 245 250 246 246 244 244 246 251 244 247 248 251 246 244 243 237 243 244 246 248 243 247 244 245 249 246 250 246 244 241 249 244 239 243 249 244 236 237 244 244 250 247 239 234 244 249 246 246 248 246 247 247 249 248 248 240 245 250 247 244 240 241 246 239 247 247 243 244 245 248 247 246 245 235 236 249 235 220 225 242 243 243 249 251 253 250 245 251 171 130 121 160 154 142 180 215 250 248 248 249 204 138 116 97 104 168 186 171 130 133 162 126 130 167 217 242 226 206 124 96 109 123 174 220 225 250 250 252 244 239 237 240 236 242 233 179 120 137 152 152 147 162 182 192 199 192 169 137 108 93 76 69 61 61 62 65 64 68 73 79 86 102 125 139 159 182 200 212 225 233 242 242 243 247 239 228 209 224 252 248 247 247 240 230 211 195 175 155 135 127 108 102 91 84 75 73 70 73 81 89 100 106 103 93 86 78 71 67 62 59 53 52 50 49 47 47 45 44 45 43 40 39 40 41 39 38 38 39 40 39 38 39 38 38 38 39 39 40 42 43 45 47 54 57 58 58 59 61 58 58 58 55 52 50 46 45 44 41 41 41 42 44 44 46 50 54 60 65 73 77 82 87 90 93 86 81 83 95 135 185 238 246 250 250 245 238 175 103 61 56 53 50 49 47 47 53 64 73 95 121 153 165 170 168 178 195 215 226 231 231 228 217 190 162 129 113 106 114 149 173 179 174 176 232 232 213 207 228 242 243 246 241 249 251 247 248 246 247 246 247 246 246 244 238 244 242 247 247 244 245 169 142 97 59 90 143 151 125 146 155 156 160 156 165 197 216 231 242 250 246 141 131 94 100 108 98 82 70 58 50 44 40 39 40 37 35 33 34 34 33 34 34 33 33 36 36 36 38 41 44 42 43 43 41 41 41 41 41 41 40 39 39 41 41 42 42 39 37 40 39 39 39 37 35 35 36 163 144 204 197 199 222 235 248 242 238 240 241 234 180 131 100 120 168 191 197 212 245 244 248 245 248 249 246 250 248 246 244 242 243 248 250 241 244 245 249 249 248 241 246 251 244 246 244 246 246 249 248 247 245 241 241 241 239 237 240 239 248 241 242 245 245 253 248 245 246 248 248 247 243 248 242 246 253 246 245 237 231 228 229 240 243 246 242 236 237 240 249 247 243 240 245 246 249 243 240 241 245 250 247 242 243 239 242 240 245 252 251 247 244 247 243 247 248 241 248 242 243 241 237 246 242 244 247 246 239 246 244 240 240 248 243 244 250 251 244 243 244 248 250 243 233 230 233 237 236 244 247 238 232 246 253 248 248 246 233 232 246 242 234 242 249 250 247 249 251 254 252 252 247 165 131 120 159 145 144 182 213 249 247 249 244 226 148 123 96 97 137 205 170 128 135 169 118 137 173 222 250 240 203 151 93 105 121 164 216 221 246 251 246 243 246 246 237 238 238 247 234 166 117 121 138 148 147 152 158 167 183 199 203 198 187 172 155 135 117 91 76 66 63 68 72 75 72 68 69 72 81 87 98 113 132 161 184 216 231 214 200 219 243 254 251 250 252 253 254 253 252 245 238 238 233 213 205 179 153 116 100 86 81 79 76 80 85 89 94 95 98 97 95 90 88 78 72 65 63 57 56 54 53 51 48 47 43 46 45 44 42 42 41 42 41 42 42 41 41 42 42 41 41 42 46 46 47 51 56 65 69 71 71 71 69 66 64 63 61 59 55 53 54 51 51 49 51 53 58 63 70 76 79 80 79 78 80 77 75 82 102 151 194 227 236 245 242 243 245 204 133 74 59 54 51 50 51 50 51 58 69 87 113 146 164 168 167 195 223 236 234 243 247 237 234 241 244 235 224 205 168 119 104 109 131 177 191 172 197 214 210 226 225 240 242 242 239 244 250 250 243 246 248 248 245 243 248 242 242 245 248 248 247 250 225 150 140 87 62 95 121 138 150 166 179 192 167 90 72 80 101 158 218 249 249 180 113 117 99 121 105 86 74 61 52 46 43 38 39 37 36 35 35 35 35 34 34 34 34 35 36 35 39 41 45 41 42 42 43 44 43 41 41 40 42 40 40 42 41 41 41 39 38 38 38 39 37 36 35 33 35 176 152 181 209 188 215 223 244 238 242 248 251 246 221 145 112 102 151 181 199 199 236 244 237 233 236 237 240 240 239 249 251 243 246 245 237 244 250 244 238 243 246 246 246 242 245 250 245 243 245 245 245 247 247 248 248 249 242 243 245 244 246 243 248 246 240 248 248 245 246 248 253 248 242 246 242 239 248 235 232 234 238 229 241 242 246 249 242 244 245 244 245 249 243 250 252 240 243 241 241 248 249 250 248 248 245 243 242 243 241 242 243 243 252 252 246 249 247 243 244 243 238 232 230 227 236 245 243 240 246 245 237 241 243 246 248 248 248 239 232 238 244 238 240 242 239 239 234 236 236 243 241 239 241 247 247 246 240 237 232 237 245 239 233 241 243 243 250 253 250 251 248 250 248 164 130 118 156 134 147 183 218 248 246 247 249 241 174 132 102 91 110 200 172 124 138 165 111 142 181 223 251 247 209 178 99 102 109 170 205 219 240 251 251 247 249 246 240 240 241 243 250 243 207 148 132 132 150 162 144 137 138 146 144 150 160 163 171 183 190 194 189 170 149 127 109 94 87 75 70 66 66 65 65 65 65 65 67 70 74 77 88 135 175 198 217 229 240 248 250 253 253 250 246 247 248 246 250 249 248 244 235 225 212 186 167 142 130 124 118 103 100 92 89 90 91 92 97 100 95 91 89 86 81 73 69 65 61 57 56 54 54 52 53 49 49 49 50 47 46 46 46 49 48 46 49 48 51 55 58 66 73 81 82 87 88 89 88 85 86 86 82 80 80 75 73 71 67 69 70 74 72 71 73 74 76 85 98 121 152 198 227 247 245 240 240 245 246 206 142 70 61 56 53 52 52 50 55 62 70 87 112 147 160 168 176 196 224 247 246 238 241 239 237 242 243 247 242 243 247 243 233 205 155 112 110 124 174 196 179 162 186 217 218 238 243 241 242 244 248 253 249 249 252 249 242 245 245 242 246 245 245 241 247 239 218 130 150 73 76 104 109 123 132 142 153 166 173 112 64 54 52 48 71 158 222 220 115 114 93 115 109 92 77 65 56 47 46 40 39 38 37 35 33 33 32 34 34 35 35 35 36 36 39 43 45 43 42 40 41 41 40 41 41 42 43 40 40 42 42 41 40 39 38 36 37 38 36 36 35 34 33 185 167 170 196 196 202 222 235 246 247 248 248 248 240 165 131 98 127 176 192 197 220 247 239 236 234 235 246 236 239 244 248 244 242 241 244 247 249 249 244 247 249 246 248 246 248 244 245 243 250 246 242 242 242 245 245 249 249 250 248 237 234 236 238 239 237 243 246 250 250 251 253 250 249 250 241 239 240 237 237 242 244 243 249 244 247 251 248 249 246 247 243 247 251 252 251 248 249 242 245 250 246 248 251 250 247 245 247 245 246 246 251 246 251 248 247 249 246 241 235 235 236 240 241 234 245 252 252 245 250 242 241 246 243 242 246 247 250 248 237 230 239 238 241 241 247 241 241 243 245 246 243 246 251 250 250 235 236 237 236 249 248 237 236 241 245 247 248 247 245 250 250 247 244 161 129 120 148 128 151 183 221 251 250 249 246 244 199 138 116 90 100 181 170 119 133 157 110 140 184 223 248 247 224 174 108 102 103 160 197 220 229 251 249 249 245 244 242 242 241 244 239 240 236 229 205 163 139 126 133 108 118 155 158 158 161 152 148 137 135 139 151 164 175 183 181 175 169 151 134 114 96 77 71 69 67 66 65 63 62 61 57 60 70 85 94 112 127 157 178 200 222 237 242 248 250 250 250 250 250 253 251 250 250 251 248 243 235 223 225 206 193 172 155 134 116 98 90 90 87 90 94 96 96 97 98 96 96 94 88 80 77 68 67 62 61 60 59 56 54 57 56 55 55 55 55 55 56 60 63 64 68 76 85 97 102 102 100 97 98 97 94 93 91 89 83 78 74 72 70 69 72 76 90 115 140 170 196 224 235 244 245 248 244 247 248 234 189 93 66 58 54 53 54 53 57 60 68 81 105 138 155 168 167 198 228 246 244 248 250 241 245 240 237 244 249 253 247 241 246 245 239 240 218 161 118 108 125 176 190 148 154 196 216 229 243 248 237 247 244 246 248 246 252 247 243 247 246 242 246 245 244 246 249 237 221 143 159 75 99 106 170 190 173 155 142 133 144 142 92 57 48 46 44 55 94 207 162 101 97 102 110 95 79 70 57 51 48 41 42 40 38 36 34 35 33 35 35 35 34 35 36 38 41 45 46 45 44 41 40 40 39 39 42 41 43 41 40 41 42 41 40 39 37 37 38 37 37 36 35 34 33 209 179 170 184 199 189 218 224 240 240 244 245 245 240 207 149 108 107 158 178 200 201 235 237 244 251 246 242 245 248 248 249 248 244 245 244 245 250 245 247 248 248 251 253 253 246 240 244 253 252 248 251 244 240 240 246 240 237 239 236 242 246 239 240 246 245 246 245 245 249 250 250 248 250 244 243 251 245 240 243 247 250 250 243 244 245 245 245 247 246 248 243 248 252 247 242 245 244 247 251 243 236 242 250 247 247 245 244 247 245 244 247 242 246 246 244 250 250 243 241 237 243 248 250 243 244 244 244 247 249 250 243 234 240 235 239 250 250 248 250 246 238 239 240 237 238 238 241 235 240 244 236 238 249 251 248 247 248 248 244 249 248 240 236 247 252 250 243 238 241 247 246 242 240 157 133 119 138 130 155 191 225 250 241 246 251 245 233 151 133 92 95 162 166 112 128 139 106 149 189 229 243 247 239 176 120 98 108 133 179 219 217 246 249 251 252 249 253 245 240 248 244 239 234 247 248 241 217 198 194 167 148 129 140 134 143 152 155 161 164 158 152 136 133 129 133 136 144 152 160 171 176 178 164 148 135 115 99 86 80 72 66 63 63 63 64 62 63 67 66 66 72 88 107 136 156 182 204 223 231 241 246 251 252 252 252 253 249 248 249 249 244 244 249 250 241 226 215 199 182 155 139 125 119 107 104 100 91 89 91 93 94 99 101 99 95 93 91 90 88 84 80 79 77 75 74 74 73 74 74 75 76 79 82 89 90 87 79 71 68 66 62 62 76 92 97 104 111 125 137 156 169 176 180 193 212 235 248 250 246 246 242 251 250 234 195 110 66 59 56 55 56 57 58 63 69 83 102 137 157 163 164 188 225 251 250 250 246 248 251 249 248 246 238 250 251 249 248 241 234 243 248 243 241 220 173 126 109 128 187 163 126 165 206 226 243 249 244 246 247 249 246 247 245 248 247 245 243 248 249 244 243 245 233 211 203 206 165 86 135 106 138 149 150 152 154 139 131 123 121 84 55 43 43 43 40 66 118 123 102 94 103 103 89 78 63 53 50 45 43 41 38 36 35 34 32 34 34 34 35 36 39 38 40 44 47 46 44 42 42 43 42 40 40 40 41 42 43 42 41 40 40 38 38 38 37 36 35 36 34 34 33 232 197 172 176 193 194 200 221 236 243 243 244 240 245 234 167 124 102 139 173 198 201 223 238 236 240 243 247 250 240 240 243 243 243 241 244 242 246 243 247 245 248 250 246 248 245 242 250 252 246 251 251 244 245 247 248 240 232 228 229 234 241 239 238 247 246 246 245 247 246 244 246 252 252 247 242 244 245 247 248 249 247 250 245 236 232 248 249 247 249 247 243 237 244 239 244 246 244 248 249 250 246 247 251 249 246 240 238 243 247 241 242 243 242 242 243 249 253 245 243 241 244 247 248 249 249 246 246 244 243 242 249 245 242 235 233 240 250 247 249 249 246 241 242 240 235 234 235 233 241 241 242 245 249 252 250 251 246 241 233 242 243 241 238 252 254 249 246 246 251 252 250 249 239 154 134 120 131 131 155 194 225 251 246 247 247 249 249 170 143 98 92 165 163 108 125 123 110 153 190 232 243 244 244 199 137 95 107 121 176 213 217 235 248 250 250 253 253 249 244 250 243 241 243 246 246 248 248 247 244 235 215 195 190 185 133 116 123 129 134 150 155 154 157 155 152 149 140 140 135 128 129 135 144 159 166 176 175 168 160 146 133 110 95 81 72 68 67 67 63 64 63 61 62 64 65 74 86 98 110 128 149 188 208 225 235 247 245 245 250 253 252 245 243 253 251 245 244 251 250 241 237 232 226 213 202 187 173 159 145 131 119 109 102 96 93 93 91 92 92 90 88 89 88 85 83 87 85 83 84 81 80 78 77 75 76 85 89 83 53 45 43 48 74 132 142 136 130 124 122 120 116 124 164 221 243 249 248 251 252 247 243 251 233 144 85 63 60 58 56 57 60 65 70 78 92 121 148 167 165 177 210 243 248 244 249 248 249 250 252 251 246 241 238 243 243 240 235 243 245 249 249 246 241 248 215 150 128 106 162 177 138 153 190 223 243 244 246 250 251 248 245 249 244 245 243 246 246 247 250 242 240 244 213 202 201 213 156 114 154 107 125 123 126 132 138 149 148 133 114 104 80 50 44 40 38 40 42 118 108 95 99 105 97 86 68 56 51 46 44 40 38 37 35 33 34 34 34 34 35 35 37 38 40 43 45 46 44 44 42 43 43 41 39 41 41 43 41 41 39 39 39 39 38 35 34 34 36 36 34 34 32 244 216 181 176 184 203 187 214 224 246 248 243 243 249 235 200 138 113 119 166 188 199 204 237 246 245 243 238 248 242 245 250 247 245 245 242 239 245 243 244 247 249 247 247 247 244 241 241 246 246 242 241 241 236 240 238 244 252 248 237 234 241 241 239 240 242 247 245 246 248 245 240 247 252 246 240 247 245 249 247 248 248 248 250 246 240 248 246 243 248 250 245 240 243 242 243 243 246 249 250 245 251 248 241 247 250 247 246 244 245 244 243 248 243 239 239 252 249 243 244 242 236 237 245 250 243 245 250 244 238 243 245 248 248 242 238 238 247 248 249 248 250 249 239 240 238 239 238 236 241 240 242 251 252 250 254 246 237 236 241 249 252 247 242 251 254 253 249 244 247 244 242 247 228 151 134 121 122 133 154 196 230 249 252 251 249 252 251 198 153 112 83 171 160 107 124 113 117 149 191 237 240 240 242 224 161 94 100 114 162 203 220 224 250 248 243 244 248 251 248 250 244 247 246 243 239 238 244 244 249 250 250 248 245 245 238 200 169 144 131 117 106 110 119 128 132 132 132 134 141 145 148 151 152 157 157 146 139 139 149 163 170 177 184 177 169 155 138 121 111 97 86 79 73 69 66 62 64 63 65 64 65 63 68 73 86 109 130 155 170 200 215 227 232 242 245 252 248 250 253 248 241 244 249 251 250 251 250 249 249 243 242 235 230 222 216 207 202 198 194 190 185 183 181 180 179 182 185 188 189 180 171 162 154 141 131 122 115 103 57 42 34 35 38 39 35 38 48 66 66 86 130 192 235 246 251 251 248 249 252 251 233 170 104 64 58 58 58 59 62 63 70 80 90 120 143 166 170 178 210 238 239 244 246 249 251 251 251 245 237 246 246 241 239 246 247 250 243 242 250 252 248 247 245 250 248 179 139 127 115 188 165 144 175 208 237 248 248 245 250 250 246 242 247 241 240 245 246 249 246 244 245 233 194 188 174 149 147 146 160 102 102 106 113 125 134 147 148 157 146 118 99 69 52 41 38 34 36 67 134 89 99 102 102 94 79 58 53 48 45 42 39 37 35 34 35 34 33 35 35 35 36 40 39 43 43 47 46 44 44 43 42 42 42 42 42 41 40 40 39 38 36 35 36 36 35 34 36 36 35 35 34 247 237 190 175 173 195 191 200 223 236 243 239 243 249 242 232 156 126 108 154 183 192 200 225 248 243 238 238 249 243 248 246 246 247 246 246 244 243 247 245 237 240 247 252 249 248 246 239 239 247 247 250 250 236 234 237 243 250 249 242 241 246 243 241 238 241 245 245 253 248 242 240 247 251 247 241 243 241 247 244 249 253 247 246 245 242 245 248 250 249 245 242 241 246 248 246 247 248 250 250 250 250 247 244 247 245 246 249 247 245 246 247 246 245 239 241 250 246 239 242 236 240 243 242 243 244 245 246 243 244 246 246 246 247 244 239 235 236 247 249 250 248 251 249 247 238 242 237 239 238 251 246 249 252 251 251 250 246 243 244 248 249 250 246 251 254 254 250 240 245 248 246 248 224 151 137 117 120 135 154 203 226 248 249 249 250 250 250 219 159 125 80 173 155 104 123 112 120 157 194 240 249 235 241 240 176 103 100 108 138 198 219 219 241 246 236 237 235 241 244 249 249 252 243 237 241 244 243 246 252 249 248 247 248 248 249 249 246 232 220 205 187 162 142 127 119 114 109 110 111 116 120 128 134 145 153 155 151 145 142 138 144 148 151 158 159 162 165 172 174 169 165 156 141 129 113 97 86 76 68 66 66 68 64 65 65 61 60 65 70 84 93 109 119 145 167 199 218 235 247 247 244 244 246 249 247 250 251 252 250 249 251 250 250 251 252 250 251 251 251 251 249 248 247 248 245 246 248 247 244 239 218 176 120 76 62 48 45 56 54 37 31 30 31 33 37 54 70 79 113 194 235 244 242 242 246 246 243 240 245 213 137 75 65 59 60 59 62 68 71 80 86 107 133 159 166 172 195 234 245 246 245 246 243 251 249 251 250 246 242 242 247 246 244 246 245 245 242 242 248 249 249 244 244 243 248 219 143 141 114 157 185 151 170 193 227 252 249 244 248 248 249 242 244 243 244 246 243 246 245 243 244 214 181 182 132 132 137 157 141 105 112 126 124 133 133 140 143 145 151 145 120 85 66 47 40 33 34 38 120 108 99 100 103 96 84 61 54 49 45 43 43 39 36 36 35 35 36 35 36 38 37 41 40 43 43 44 46 47 47 43 44 42 41 42 43 42 40 39 39 37 37 34 36 35 34 34 36 37 34 33 33 245 246 211 183 167 179 198 184 220 225 243 240 242 243 248 241 193 148 110 128 177 182 196 208 243 249 243 240 242 242 240 244 245 247 238 240 241 241 241 242 241 243 243 247 252 247 244 244 242 240 241 247 249 235 230 233 241 244 251 249 243 241 245 247 248 252 242 246 249 249 243 239 244 251 249 245 246 241 245 247 249 246 241 240 243 246 249 245 249 245 240 244 244 248 250 242 243 241 241 245 250 245 242 241 247 246 246 244 245 242 247 246 247 249 248 246 247 249 240 242 240 238 245 248 249 250 247 245 248 250 246 242 240 240 248 245 241 236 238 239 237 236 244 247 242 241 238 234 236 244 247 245 251 254 249 244 253 247 248 244 249 248 250 252 252 251 250 246 243 247 251 252 251 225 149 137 118 122 136 153 204 230 246 248 247 245 250 247 239 179 140 93 176 152 104 124 109 123 161 196 246 249 244 247 251 210 112 101 104 111 189 213 217 230 245 236 245 248 245 245 251 252 247 247 249 248 243 241 248 250 245 242 242 246 250 252 250 250 247 246 245 249 246 238 239 226 207 187 165 149 135 125 114 103 100 103 112 118 125 126 130 128 128 133 135 138 139 143 145 146 150 154 160 164 171 173 180 169 164 163 145 128 113 101 91 82 75 70 68 64 63 65 64 63 63 60 66 73 86 108 131 150 173 188 215 229 236 245 253 253 253 252 250 251 252 254 251 249 253 254 254 253 253 246 248 252 251 250 250 251 253 253 252 240 191 135 77 55 47 56 48 33 31 33 38 59 84 118 204 239 249 252 249 238 238 245 246 246 209 146 78 65 60 58 61 65 69 76 86 93 108 131 159 167 173 189 228 247 247 250 246 243 250 249 245 246 243 247 248 249 247 239 245 243 240 243 242 244 246 249 249 243 240 241 245 244 245 185 118 141 124 162 172 175 170 203 251 250 246 244 244 247 241 244 244 247 243 245 245 240 238 243 198 198 139 128 131 120 110 123 127 122 141 164 191 202 207 204 172 151 146 145 114 88 62 47 40 36 30 53 143 102 105 98 100 91 70 57 48 46 44 43 41 39 37 37 37 37 37 37 38 39 41 41 45 43 45 44 44 46 44 43 42 42 42 43 40 38 36 36 37 36 35 35 34 35 34 34 35 34 33 33 243 245 233 196 172 166 198 191 199 221 238 239 239 244 248 248 226 167 127 116 170 181 193 202 229 245 243 242 244 241 240 242 247 247 240 243 248 245 248 246 243 248 247 242 248 242 242 249 242 243 242 238 238 242 239 242 241 245 252 251 243 248 242 243 245 250 243 244 243 241 238 239 244 252 250 247 248 248 244 244 239 241 249 250 242 244 249 243 242 245 240 243 242 242 250 247 234 245 248 249 248 248 245 244 241 239 240 244 245 244 244 245 243 245 246 248 249 252 243 244 248 244 244 246 249 246 246 240 247 251 243 241 246 243 242 238 245 244 238 234 233 234 243 243 248 250 243 236 236 240 241 244 242 246 247 244 249 239 240 237 237 247 241 249 253 252 250 246 248 250 253 252 252 220 148 136 117 123 137 155 209 232 243 242 246 245 246 250 245 196 148 105 180 147 107 123 110 126 159 200 249 250 244 244 249 237 132 105 103 104 172 209 217 222 246 243 247 248 247 249 253 249 246 249 250 248 237 236 248 252 247 245 247 244 244 251 247 245 250 250 250 249 247 246 246 243 246 245 232 230 225 221 202 170 140 127 122 124 116 112 110 112 114 113 116 120 126 126 129 130 133 137 138 139 141 146 150 155 161 169 172 172 174 175 168 162 149 139 121 105 91 81 73 70 67 68 62 61 65 65 61 65 70 78 91 110 122 144 176 199 219 229 241 250 251 251 248 248 253 254 253 251 250 246 248 253 250 249 251 250 249 253 253 252 250 241 194 144 76 50 50 38 34 37 50 87 158 223 249 251 251 252 248 246 245 245 230 177 103 71 64 61 61 67 72 77 87 93 101 122 149 168 169 174 217 241 251 250 251 252 251 249 249 247 249 247 249 250 250 253 249 245 244 241 246 247 246 248 245 248 248 246 242 246 249 247 248 209 128 138 129 134 179 180 171 193 247 249 241 245 244 239 240 241 245 245 240 245 246 242 241 238 203 193 126 132 124 106 139 123 112 147 190 216 239 241 245 249 239 216 166 140 138 109 79 57 45 39 36 30 112 123 104 97 100 95 78 61 49 46 43 43 41 39 38 39 37 36 38 37 37 40 42 41 45 44 44 44 42 43 45 43 43 42 42 41 39 37 34 35 36 36 35 36 36 35 35 34 34 34 34 35 246 245 243 212 182 159 187 200 185 216 228 248 245 242 245 246 241 195 150 119 153 176 189 194 211 233 243 248 244 250 242 240 237 245 243 242 246 248 245 247 249 250 251 248 242 239 246 243 246 250 244 239 237 237 241 244 250 247 251 252 248 250 240 244 244 246 247 241 250 250 244 241 242 246 250 250 249 252 250 247 248 249 249 250 246 237 240 245 248 249 245 246 249 249 249 248 248 248 252 251 250 251 250 250 251 248 247 243 248 244 250 248 245 247 242 241 250 250 251 249 249 244 251 249 241 242 246 243 249 247 244 249 249 250 249 244 238 237 238 245 241 232 243 247 238 241 252 250 245 247 243 240 231 236 236 243 251 249 252 247 241 241 240 247 252 250 246 247 247 244 248 250 250 212 146 134 118 131 139 158 212 237 249 250 250 249 248 249 248 227 153 126 183 144 111 119 112 131 162 200 251 245 242 252 249 246 166 118 103 105 143 202 214 214 246 248 244 240 241 246 247 245 251 253 250 251 248 240 242 249 246 245 252 245 244 250 250 243 245 245 249 246 246 247 248 244 244 243 242 247 246 247 231 190 142 160 224 239 226 206 181 165 145 134 119 114 107 108 109 108 110 115 119 123 126 127 127 128 133 136 139 146 150 156 162 162 165 172 178 182 180 173 162 152 136 121 104 95 80 75 71 68 66 60 58 63 66 69 64 68 73 80 102 125 153 170 196 215 229 237 241 246 248 249 251 254 254 253 253 252 252 252 253 249 249 250 243 246 226 138 36 40 41 39 53 168 245 247 253 252 250 250 247 252 237 188 102 71 65 62 63 69 79 84 91 93 99 112 146 162 173 175 205 230 237 243 247 246 245 242 249 248 249 250 250 250 252 251 252 250 249 245 244 246 248 252 244 241 249 246 247 249 249 251 248 246 243 228 153 112 151 117 178 184 182 182 235 246 241 246 244 239 239 240 241 240 240 242 241 239 245 217 177 141 137 127 112 153 140 101 144 204 230 248 249 251 244 241 242 246 243 198 140 133 96 77 53 44 40 37 46 136 107 108 99 97 87 71 50 47 44 42 41 41 41 39 37 36 36 37 39 40 41 42 44 46 45 46 45 42 42 44 44 41 41 40 39 38 34 33 34 35 35 35 35 35 35 34 36 36 34 32 246 245 244 233 190 167 173 197 187 201 226 238 243 247 245 240 236 211 161 131 140 169 184 195 192 233 249 246 247 245 242 239 237 243 245 244 248 250 247 250 252 249 246 244 244 241 249 248 245 245 239 235 246 246 247 245 244 243 248 248 244 246 244 242 247 246 245 244 248 250 243 243 242 243 244 245 243 247 251 250 246 243 250 250 245 239 244 247 247 252 249 247 250 251 248 249 251 249 249 247 246 249 249 250 250 245 247 246 246 246 248 249 244 246 247 242 239 241 240 238 240 240 241 247 248 245 248 243 242 246 252 250 240 239 243 243 242 238 240 240 236 232 239 242 235 238 247 248 240 246 243 239 235 247 248 246 247 243 247 245 245 246 249 250 248 248 246 248 245 243 247 244 244 205 149 134 120 136 143 160 214 235 247 250 250 252 252 250 249 245 164 143 179 145 117 115 119 132 168 204 252 250 247 246 252 252 195 134 109 107 127 195 214 214 237 245 243 244 244 246 246 245 248 250 247 252 248 241 242 249 245 243 247 247 251 250 246 244 240 241 248 246 246 248 252 249 249 247 242 243 250 248 203 167 165 213 250 252 249 250 249 245 236 228 211 191 175 160 141 128 113 110 108 110 111 110 113 115 117 118 118 124 130 137 143 145 151 148 149 154 159 167 171 176 176 173 171 166 160 147 127 115 94 84 77 70 70 69 66 67 66 64 65 63 67 71 83 95 113 123 142 169 189 208 230 241 248 251 251 250 249 246 251 253 251 250 244 250 252 183 41 46 47 41 77 217 241 241 244 245 247 251 246 208 134 86 66 66 66 71 89 97 98 99 104 108 129 153 166 171 193 224 243 251 252 252 245 247 242 236 233 234 238 249 243 248 246 251 253 251 248 248 245 248 248 249 248 251 250 244 248 248 247 244 242 246 241 240 170 110 149 123 174 191 183 195 222 246 245 241 243 243 243 238 244 246 249 247 246 244 240 197 154 145 146 116 157 141 103 111 191 224 240 249 252 251 241 242 244 245 248 241 192 144 113 88 71 54 45 42 37 81 139 108 107 93 92 82 60 50 45 42 41 41 41 40 38 37 38 39 39 41 40 42 45 45 45 47 46 44 42 44 43 41 39 39 38 37 35 34 34 36 35 34 35 36 34 35 36 37 34 33 245 242 239 242 213 183 162 181 194 182 219 225 242 242 237 225 222 213 186 152 139 165 169 193 187 215 243 244 247 247 242 245 244 244 242 241 243 249 245 248 241 244 249 245 247 247 246 253 250 244 237 242 247 247 246 249 242 241 248 248 244 244 245 240 245 249 250 252 249 247 249 244 249 246 244 248 245 251 247 244 244 245 249 250 245 244 245 245 244 249 245 240 245 252 247 244 247 251 252 252 244 246 248 249 246 243 248 249 242 245 249 250 244 241 238 241 237 234 241 242 247 242 234 242 240 248 251 246 245 244 244 233 233 235 232 241 246 249 241 235 237 235 239 245 235 231 232 236 237 236 238 242 249 252 251 247 241 245 247 250 244 243 251 252 245 245 251 249 250 251 252 252 251 204 147 132 124 137 142 161 217 234 240 244 250 250 248 251 248 251 195 157 175 148 122 115 121 136 170 205 245 244 250 250 250 251 224 138 125 102 113 169 209 217 222 250 249 253 251 247 244 241 246 239 242 252 252 250 247 248 242 249 250 246 247 246 245 240 242 247 249 242 244 250 245 245 246 243 240 242 249 241 178 154 228 250 249 249 250 252 253 251 249 250 245 245 246 246 247 240 228 216 193 171 151 145 132 120 110 108 107 105 110 112 115 116 122 127 134 139 146 148 151 151 152 154 156 158 162 161 169 175 177 176 165 157 139 126 110 103 90 81 74 69 66 64 60 63 63 64 65 64 63 71 83 94 117 145 174 187 205 223 238 243 249 252 248 252 250 172 46 52 48 41 107 231 243 239 238 237 228 202 136 81 74 70 77 94 120 133 123 109 113 117 130 155 164 169 183 214 243 241 238 240 250 251 248 252 248 249 246 244 243 242 240 234 229 231 224 224 232 243 247 246 245 249 250 250 249 248 247 246 248 247 247 246 249 249 189 123 128 130 172 193 176 169 199 243 241 242 244 248 247 241 243 242 239 240 243 246 231 170 150 169 147 163 140 105 108 162 221 237 248 251 250 251 248 242 243 242 241 243 244 196 134 112 89 70 53 46 41 35 109 130 108 105 90 91 71 54 48 43 39 39 39 40 41 39 40 39 38 40 43 44 47 48 47 47 46 43 44 43 43 41 38 36 36 35 35 35 35 35 35 34 34 34 35 38 34 35 35 34 250 247 244 242 233 195 168 166 195 187 200 221 239 245 230 219 217 212 210 166 142 159 166 182 189 200 240 240 248 246 244 239 246 248 242 243 243 246 246 247 243 245 248 250 242 244 248 249 250 246 244 244 247 241 244 247 237 243 250 248 251 248 246 244 247 244 246 252 252 248 249 245 247 250 252 247 249 251 242 247 251 252 252 248 244 245 241 244 246 247 249 245 245 251 248 248 249 249 246 249 247 247 247 244 244 246 245 243 233 243 245 248 249 247 243 243 234 235 241 242 246 250 247 246 248 249 252 247 243 239 242 242 245 246 239 237 243 246 238 236 229 230 235 247 241 235 235 232 237 243 238 238 250 252 249 250 252 252 249 248 248 249 247 251 252 249 247 246 249 253 252 249 248 198 147 131 125 137 144 161 220 240 242 248 247 244 243 243 243 249 220 171 175 153 123 115 122 140 173 190 221 244 240 245 237 234 193 113 140 105 108 146 208 217 213 239 252 253 253 251 243 240 240 241 244 252 254 254 250 252 248 249 249 249 247 247 246 243 243 249 250 244 245 248 240 238 236 240 245 246 247 243 236 223 247 252 253 253 253 253 252 251 248 246 246 249 249 251 252 249 241 244 241 233 238 237 223 210 190 174 154 136 122 112 108 106 110 110 112 112 117 121 128 130 134 136 139 138 144 144 144 139 149 149 158 163 170 175 175 174 167 160 148 130 111 100 84 73 68 65 65 63 62 63 65 63 64 67 71 79 87 104 121 133 162 192 220 235 247 199 67 50 46 40 143 236 233 235 212 169 120 90 73 73 80 107 162 177 140 119 120 123 130 143 156 161 171 201 237 248 246 245 243 240 245 252 247 247 248 251 249 246 240 245 246 248 245 246 243 237 232 237 234 227 226 233 237 244 249 251 250 249 248 248 250 247 246 245 205 138 120 130 172 189 172 165 176 240 242 244 247 249 243 241 241 239 243 245 243 246 211 150 156 167 167 161 107 103 132 204 226 237 245 250 251 250 252 248 248 243 247 251 250 241 173 130 108 86 62 51 44 42 57 128 119 106 94 89 84 62 51 44 41 39 40 41 42 41 41 40 40 43 43 44 48 49 49 48 46 45 45 45 44 41 38 36 36 35 37 35 34 35 35 34 33 34 37 37 35 36 35 34 249 240 241 241 238 212 183 160 183 193 185 213 228 240 236 236 234 234 234 188 148 148 174 180 193 195 226 250 247 241 246 242 242 243 240 242 244 248 244 243 246 244 243 244 246 248 246 251 253 249 243 247 245 240 245 242 244 251 251 248 250 249 239 243 250 241 242 246 251 248 249 252 247 246 252 252 252 250 246 246 252 252 253 251 246 237 237 244 246 250 246 244 251 248 245 246 249 250 246 244 248 251 250 248 242 241 242 237 234 248 252 250 246 242 237 244 236 246 249 248 247 242 245 245 249 252 249 246 252 246 241 245 244 246 247 245 239 244 245 238 229 233 235 242 249 244 243 241 244 247 241 244 250 246 240 245 250 250 251 246 250 254 248 249 248 245 243 244 240 242 252 249 250 192 149 130 125 134 144 166 222 237 248 249 246 241 246 249 247 247 240 192 170 151 128 121 123 143 180 202 189 155 146 128 118 111 95 76 136 124 101 120 200 214 217 226 252 253 253 254 249 247 243 243 248 253 252 252 249 249 237 236 244 251 250 246 245 244 241 247 245 243 246 245 246 247 240 241 243 252 231 240 252 245 246 250 251 254 252 253 251 252 252 249 248 250 246 242 253 250 251 248 250 250 246 250 250 252 252 251 248 245 234 224 205 191 173 154 137 126 115 110 107 105 109 111 111 112 117 121 129 137 139 141 143 140 140 141 144 151 153 158 166 172 175 176 180 176 163 151 135 121 100 90 84 77 69 70 68 67 63 63 63 65 63 63 71 79 93 88 57 47 46 50 108 131 109 91 70 68 74 83 101 135 171 192 166 120 110 115 129 143 161 166 170 194 235 248 252 248 246 253 252 247 250 248 242 239 243 244 248 245 245 248 248 252 251 252 253 251 248 249 251 250 247 244 242 241 231 225 228 225 230 237 238 233 240 241 220 158 130 134 171 181 175 162 153 238 248 247 245 245 245 243 243 241 238 241 245 241 175 147 141 126 160 121 106 109 174 221 229 233 247 248 248 252 250 246 248 248 247 252 252 248 232 173 125 110 82 65 54 47 42 59 137 114 103 96 87 74 57 47 44 41 43 43 41 40 41 41 40 43 43 45 47 47 47 47 44 43 45 44 43 40 39 36 34 33 37 36 35 35 34 34 35 36 36 37 36 37 36 35 248 240 242 238 242 233 191 170 166 189 190 199 221 236 237 240 235 242 249 217 150 143 175 172 186 200 212 243 243 241 246 247 236 239 245 244 248 250 247 243 246 242 244 242 250 251 249 249 250 246 245 245 240 240 244 243 240 248 251 251 248 245 247 244 250 242 235 241 245 250 246 247 251 251 253 249 247 244 239 237 242 244 245 251 246 233 234 250 245 245 246 245 251 246 249 252 250 248 245 247 247 247 250 250 240 238 242 241 239 245 247 245 248 244 245 248 250 246 245 241 242 240 239 242 244 245 248 250 251 248 242 245 239 242 250 252 238 242 245 249 238 239 237 247 250 240 244 247 244 242 236 229 242 251 248 249 245 244 243 238 249 254 254 254 254 253 252 252 252 251 252 252 247 189 149 128 124 136 148 168 223 243 249 251 249 248 249 249 249 250 246 206 165 143 130 122 123 147 185 194 122 177 136 106 105 103 93 79 115 145 99 110 182 214 215 216 251 250 248 247 250 250 243 243 241 246 244 249 247 246 242 243 249 249 248 246 244 247 239 247 243 240 245 245 239 238 240 245 246 250 212 205 244 243 249 249 245 250 250 253 252 248 248 250 247 239 241 246 249 249 246 246 252 252 245 246 249 253 252 249 251 253 249 252 252 249 245 240 229 223 204 188 168 150 136 123 109 103 105 110 113 115 120 122 127 129 134 137 143 144 147 148 148 145 143 145 149 159 171 176 183 187 183 176 173 163 147 132 111 98 83 72 65 62 66 65 65 62 62 59 54 51 49 51 54 60 63 73 84 99 136 166 189 181 151 132 118 124 132 145 163 166 160 189 235 245 249 246 247 244 245 251 252 250 249 245 246 248 244 243 248 249 252 252 247 248 252 250 251 246 242 247 242 239 239 245 246 243 247 245 238 231 233 231 219 196 191 212 212 165 133 147 160 175 174 164 144 228 251 247 242 241 247 247 246 242 244 238 247 235 156 145 127 117 143 116 113 136 204 224 230 232 243 249 248 248 252 250 251 250 250 250 253 252 245 229 146 130 99 81 61 52 45 39 90 134 104 104 88 79 65 53 46 46 45 43 42 42 41 42 43 44 44 45 45 47 50 48 45 45 44 43 42 39 37 35 34 33 34 33 33 33 34 35 35 35 34 34 35 35 35 35 241 236 241 239 237 240 210 183 159 179 198 182 216 227 243 242 242 239 245 245 178 141 154 179 176 200 211 226 240 236 243 244 244 244 239 241 241 242 245 250 250 247 249 249 246 245 239 241 235 235 249 247 246 239 242 244 243 245 250 247 248 252 251 249 251 250 248 248 242 246 247 241 244 244 244 244 245 242 240 246 248 244 241 242 235 233 236 241 245 245 244 245 243 251 249 248 245 244 243 249 240 247 247 248 243 239 241 248 242 241 244 246 243 249 248 249 251 250 246 244 237 238 241 250 248 248 247 253 252 252 251 246 245 246 241 246 248 243 247 248 248 245 249 248 245 244 248 247 242 237 231 232 240 246 244 238 239 238 245 248 253 254 252 249 252 253 248 250 251 253 255 255 250 190 151 128 125 137 150 172 226 244 246 246 245 246 248 245 244 244 250 227 159 143 125 122 124 147 192 169 178 178 91 99 98 98 90 82 90 170 101 105 154 207 216 206 245 252 250 245 242 245 238 237 239 240 245 246 244 245 243 243 245 242 244 248 248 245 246 248 245 239 238 240 237 242 246 249 239 221 196 224 252 250 248 244 240 247 251 253 248 245 238 243 248 250 241 244 250 253 249 251 251 248 247 248 252 254 248 247 253 253 253 251 245 248 252 250 246 251 249 245 245 248 246 240 219 200 185 167 150 140 123 118 115 113 114 117 117 120 122 123 129 134 140 143 149 151 150 149 151 153 159 164 171 177 184 190 196 196 184 179 166 150 128 114 105 97 90 84 89 92 97 103 115 134 158 175 196 197 187 163 128 118 130 144 158 162 168 166 157 166 224 245 248 252 250 248 246 247 247 245 243 241 244 247 248 246 246 251 253 253 251 251 252 247 248 250 250 246 243 247 247 242 240 241 236 236 239 241 230 235 247 249 250 244 226 202 196 164 127 149 160 162 173 163 136 216 238 235 245 246 246 249 249 245 246 243 247 212 141 143 135 126 133 142 142 179 223 221 230 233 244 247 248 251 251 250 251 247 252 251 251 253 250 249 212 153 125 98 77 62 51 48 45 90 123 96 94 89 70 61 53 49 47 46 45 44 44 44 45 47 46 47 47 48 49 49 48 47 46 42 41 40 38 36 36 34 33 33 31 32 34 35 35 34 35 34 35 34 34 34 245 238 235 231 232 237 235 197 163 163 201 190 201 221 237 236 238 243 250 248 211 150 146 174 184 187 210 217 241 235 247 245 241 239 237 240 249 242 240 245 248 245 249 249 247 241 243 241 237 237 250 247 247 239 240 243 246 241 246 248 252 251 248 247 249 250 250 251 246 248 247 243 242 240 242 239 237 241 246 248 248 247 251 250 243 247 248 245 250 249 244 246 244 248 248 245 249 249 245 244 241 247 242 245 244 241 247 250 245 243 243 247 247 247 243 245 248 250 247 247 239 246 247 248 242 240 244 250 253 253 253 248 247 250 247 250 242 240 250 245 245 247 246 249 247 250 248 247 240 237 237 239 245 247 243 246 244 243 243 252 247 247 253 247 248 251 252 252 250 250 253 251 247 183 149 126 125 137 154 179 226 246 251 250 249 249 251 247 246 247 248 226 156 143 120 121 124 148 192 197 198 103 112 118 98 98 90 85 76 175 118 104 134 195 217 210 236 253 248 251 241 238 233 231 231 235 245 249 248 248 242 247 248 246 246 245 249 246 247 247 249 248 243 240 240 240 250 246 219 186 210 248 250 250 249 248 245 248 247 246 241 251 243 243 242 246 246 250 248 253 242 247 251 252 245 246 252 253 250 250 252 251 250 250 247 251 253 252 248 251 251 247 249 251 249 250 246 245 246 245 240 232 216 207 188 176 157 141 127 118 115 111 112 117 122 125 128 130 134 138 142 146 148 155 163 165 160 160 164 168 174 185 189 188 184 184 186 182 180 182 183 180 181 182 184 190 194 188 171 153 141 145 150 155 165 165 156 146 139 137 181 228 252 253 249 251 252 252 249 250 245 247 248 243 238 245 252 253 249 247 248 251 252 248 249 248 248 248 251 250 250 248 250 250 248 244 242 240 246 247 240 237 238 242 247 250 247 244 234 171 129 147 174 158 162 165 131 211 190 198 228 243 239 238 247 251 246 246 245 188 150 163 154 143 130 179 164 190 222 221 229 233 247 245 247 250 250 250 250 247 248 250 250 252 249 250 247 196 140 116 90 75 60 54 48 50 104 106 90 89 79 69 60 54 54 51 49 48 48 48 49 51 50 50 50 49 48 49 48 47 44 39 40 39 36 34 36 33 34 34 32 35 35 35 35 35 36 35 35 35 34 34 240 238 240 238 245 242 238 215 177 163 176 202 185 213 229 243 239 236 235 240 241 177 140 154 194 176 200 212 228 243 243 240 241 245 244 241 241 242 246 245 240 244 249 248 241 240 244 239 238 238 246 244 245 238 241 247 247 243 243 247 250 246 243 248 251 246 244 249 251 249 249 251 251 245 242 241 237 239 248 250 250 251 250 244 244 247 245 245 245 246 249 247 248 246 245 247 249 248 247 247 248 246 248 246 247 240 243 249 244 244 247 251 250 243 246 249 248 250 248 248 249 251 244 247 244 247 248 247 252 251 250 250 246 249 247 251 248 246 249 247 251 251 246 248 246 247 245 249 242 247 234 231 238 250 251 250 248 244 248 248 244 247 250 249 246 250 251 247 249 252 252 246 240 175 148 123 125 138 155 180 225 230 235 242 249 253 254 250 250 249 247 217 155 147 118 119 124 155 197 194 113 85 141 179 89 97 92 90 80 147 155 104 118 180 209 217 224 245 244 250 245 240 235 231 239 249 246 246 244 245 247 246 249 249 248 244 246 246 249 248 246 247 243 244 249 245 247 225 187 190 245 250 246 251 250 252 241 246 247 249 247 249 250 247 249 250 243 244 246 249 240 246 248 252 245 250 253 254 252 249 252 251 247 248 251 254 252 251 253 251 252 252 247 252 253 251 250 252 251 253 253 250 248 253 251 251 252 247 238 228 213 195 176 158 137 128 121 119 116 121 123 127 129 130 135 138 143 147 148 150 151 148 149 151 156 157 156 155 149 144 140 147 154 147 140 141 147 150 161 172 174 168 158 146 130 122 121 135 173 217 242 248 248 252 249 249 251 251 253 252 246 247 252 249 249 252 245 244 250 248 249 254 251 246 248 250 250 251 251 251 250 247 248 252 250 252 253 250 250 241 241 246 244 241 239 247 248 242 230 169 137 154 176 149 141 166 127 200 204 200 215 221 208 183 179 195 200 203 205 159 165 160 158 162 147 186 180 205 208 215 229 230 238 238 243 249 250 250 252 252 250 246 250 252 247 242 248 244 179 153 108 92 73 59 54 48 49 88 105 98 86 77 65 63 62 62 59 57 54 52 53 54 52 52 52 51 50 48 48 45 42 41 40 36 35 34 35 34 35 35 34 36 36 36 35 34 35 33 34 34 34 33 238 239 242 247 237 239 239 234 190 168 168 195 193 203 223 238 236 240 236 242 240 206 146 145 180 185 187 203 217 240 238 239 235 242 247 246 238 239 245 244 239 243 245 241 242 241 240 242 238 235 248 245 244 248 251 247 242 244 244 241 239 243 247 248 249 245 250 250 251 248 249 245 247 246 246 248 249 247 248 249 249 250 247 245 241 242 245 248 246 247 249 248 248 248 250 245 242 245 246 245 240 240 248 247 245 243 242 241 244 244 241 249 252 245 251 250 242 244 244 246 245 251 252 251 248 248 245 243 252 248 241 240 247 249 247 249 253 253 245 242 249 245 247 246 246 248 249 250 243 245 242 243 240 249 253 246 246 240 245 246 249 251 249 248 242 244 248 246 248 249 246 244 235 172 146 127 126 138 159 180 229 235 230 244 253 255 254 252 246 246 249 210 155 143 118 120 128 158 201 155 104 96 118 158 94 99 98 94 98 128 179 112 110 162 203 217 218 242 245 246 247 243 240 242 247 252 247 248 246 249 252 252 252 252 249 250 249 246 249 245 241 244 246 245 247 246 232 200 194 237 239 242 245 248 249 251 244 248 244 247 252 250 250 248 244 245 251 252 253 252 242 247 247 246 247 252 253 253 251 249 252 250 248 251 252 252 248 249 251 251 253 253 252 253 252 253 252 251 253 254 250 251 253 254 252 253 252 253 252 251 253 251 249 244 230 221 209 196 174 158 144 133 120 117 120 123 129 134 138 138 143 144 141 139 143 140 138 142 149 149 137 134 131 130 130 133 136 136 137 133 126 122 115 117 117 127 169 214 244 250 246 246 247 252 252 253 252 252 253 250 249 248 248 252 253 252 246 245 251 253 252 253 249 246 251 251 252 252 247 250 248 246 247 247 251 253 251 251 247 248 249 251 251 249 244 239 234 236 231 164 139 151 157 136 143 164 126 181 245 250 252 249 232 198 147 138 134 129 153 149 163 150 151 165 180 189 185 211 202 204 235 228 235 236 248 246 250 249 251 254 251 247 246 250 245 247 248 249 225 174 138 102 85 68 56 50 47 51 93 116 106 88 72 70 70 68 66 64 60 54 50 53 55 52 52 52 49 47 47 43 40 39 38 37 35 35 34 33 33 34 35 34 34 36 34 34 35 34 32 32 33 32 237 241 249 245 243 245 241 244 214 178 163 177 202 187 217 225 245 242 238 246 241 239 164 141 163 191 184 199 209 231 245 249 247 248 246 240 233 240 241 241 238 233 239 238 233 241 244 242 234 237 247 243 239 243 245 249 245 240 238 235 240 239 241 245 251 244 244 250 253 253 250 243 243 245 246 241 241 252 250 252 250 246 242 249 249 243 241 239 246 243 242 245 250 247 247 246 245 245 249 248 244 241 244 244 250 247 244 243 240 245 246 246 249 250 251 249 249 245 242 234 244 252 250 245 239 244 247 245 250 252 249 245 247 241 248 250 248 250 248 245 242 245 247 247 246 250 245 246 244 240 248 250 241 244 251 252 245 237 235 237 241 246 250 252 251 251 251 252 251 247 242 238 227 171 145 125 127 135 161 186 226 238 245 238 247 251 254 254 238 238 242 201 155 132 122 121 127 159 203 145 107 111 126 128 108 108 104 104 110 108 188 133 105 134 196 212 219 233 245 245 247 246 244 245 246 249 252 252 251 249 247 245 245 248 249 246 243 245 250 243 241 247 249 244 248 236 166 161 231 248 253 253 252 248 250 248 248 247 245 248 251 251 250 248 251 253 253 252 252 252 251 248 251 249 252 253 246 246 252 253 253 252 248 251 253 254 253 254 254 254 253 253 253 254 253 253 253 254 253 253 245 249 254 253 244 249 251 251 254 252 252 253 253 253 253 253 251 252 249 250 249 242 225 209 191 180 164 145 130 127 125 127 127 130 137 142 157 151 126 114 114 117 127 121 111 109 105 107 108 110 112 117 127 141 185 222 250 254 252 252 251 252 248 250 250 250 249 247 251 253 252 250 244 247 250 251 249 253 253 249 244 245 247 247 250 250 252 250 252 251 248 244 249 251 250 249 250 248 247 247 245 244 250 249 244 241 243 229 217 157 137 136 137 140 140 160 134 167 232 244 246 248 249 249 234 209 187 163 146 142 162 171 165 173 185 186 194 214 185 173 207 229 219 226 235 248 242 241 247 247 244 245 243 241 243 242 246 240 244 219 169 134 98 86 65 59 50 46 51 79 119 120 101 86 79 75 70 65 62 56 54 52 51 50 49 50 45 43 42 41 40 39 38 37 35 35 34 34 35 33 34 34 34 33 34 34 34 33 35 35 34 31 239 242 249 247 244 243 236 239 236 196 160 160 199 194 203 220 240 241 242 243 240 246 196 144 155 180 185 192 205 221 238 246 254 248 243 247 240 240 240 240 232 231 236 234 226 238 247 242 243 243 250 252 242 245 249 249 237 235 247 238 241 247 243 245 252 247 245 249 252 253 252 248 244 243 241 241 245 252 249 249 247 244 242 244 244 245 239 233 245 244 244 244 244 242 239 243 247 249 248 248 245 243 247 251 249 248 253 251 242 248 248 246 243 242 248 251 251 249 248 240 242 245 244 243 246 250 251 252 248 251 250 249 250 242 247 248 244 246 247 249 247 245 248 245 246 249 248 243 249 238 243 248 245 249 247 250 244 230 228 227 229 236 248 249 246 245 248 249 249 250 246 248 232 169 146 128 125 139 161 192 227 244 247 244 245 247 253 254 245 243 231 187 158 131 124 124 128 161 201 148 119 122 133 141 125 119 121 163 175 129 150 147 106 121 189 210 220 225 247 244 246 246 247 250 250 248 246 251 253 252 246 245 248 253 247 244 243 245 245 242 240 246 250 248 240 211 170 205 247 250 253 250 249 248 251 251 252 251 249 249 252 251 249 246 250 253 254 251 250 251 252 252 249 249 252 254 246 243 250 252 254 254 252 252 253 253 253 252 252 251 250 252 252 251 252 253 250 250 251 248 253 253 254 253 248 250 248 251 254 253 254 253 255 254 251 251 248 250 252 251 253 250 247 249 250 249 244 236 224 219 207 194 174 159 156 165 176 167 155 146 131 114 127 133 135 121 112 113 116 125 145 172 209 227 246 249 254 254 250 244 252 250 252 252 252 251 251 250 249 249 254 254 248 251 248 246 248 253 253 252 245 248 253 253 253 251 254 254 250 251 248 245 251 248 249 251 251 250 250 246 240 242 250 243 241 249 249 242 223 155 134 133 138 149 138 159 145 161 229 244 245 239 233 243 248 250 251 241 172 146 162 181 187 183 169 179 197 213 175 146 163 177 199 221 218 239 243 240 246 241 245 245 250 252 245 236 243 249 250 248 196 165 114 95 79 64 56 50 44 49 79 110 119 109 91 82 74 68 60 56 55 53 46 45 44 43 42 41 40 39 38 38 37 36 37 37 37 35 34 33 35 35 34 34 34 34 34 33 34 33 33 33 244 245 238 248 242 242 235 241 242 209 175 170 170 205 189 216 229 241 240 239 248 249 234 166 144 165 183 191 197 208 231 249 251 246 244 239 233 231 234 238 231 234 238 241 244 247 244 236 241 241 248 244 245 250 248 239 236 240 241 238 246 243 245 248 251 241 237 237 243 250 252 249 249 250 248 243 248 247 249 248 250 243 244 248 243 247 245 236 232 237 247 250 245 246 243 247 247 248 244 243 248 250 250 243 247 243 243 250 250 245 248 247 244 246 250 252 252 251 240 241 241 250 250 250 241 240 246 250 243 251 242 241 240 241 249 245 244 247 246 243 245 247 238 245 247 248 245 247 249 242 234 244 248 250 241 237 252 247 241 241 246 249 249 244 243 240 241 243 247 250 249 249 230 166 142 127 128 143 162 193 228 246 248 250 249 250 250 252 254 252 247 187 157 131 124 123 136 169 196 157 129 121 138 206 232 222 225 237 245 242 126 105 120 116 172 207 219 217 249 253 252 248 243 242 245 245 247 248 252 247 247 245 246 248 248 248 245 248 245 243 243 239 231 235 213 182 217 242 251 252 245 247 247 249 246 248 246 249 248 248 253 252 247 246 249 250 253 253 249 246 251 253 252 250 248 249 253 250 251 253 254 251 253 253 254 254 251 249 249 250 252 253 253 247 246 252 251 249 251 251 252 252 254 253 250 250 249 250 249 244 239 239 250 252 251 251 251 253 253 251 250 249 244 248 252 251 252 253 251 250 248 248 248 248 249 249 243 245 247 230 213 212 204 198 195 195 202 203 214 229 244 252 254 254 252 250 248 251 252 247 245 250 252 249 249 249 251 253 250 251 254 253 251 251 250 251 252 253 254 254 250 246 243 247 251 253 252 252 251 251 251 250 250 248 253 254 254 254 249 245 238 237 251 249 246 250 246 249 223 154 137 132 137 134 141 150 165 174 217 243 238 231 231 239 233 246 249 250 178 158 148 163 175 169 156 150 202 208 194 185 179 169 166 183 181 193 202 207 220 231 232 230 235 240 238 237 244 244 241 244 235 183 151 107 93 79 64 57 49 46 47 61 100 114 113 98 84 75 61 54 52 49 46 45 44 42 42 40 39 39 39 38 38 38 37 37 37 35 35 36 35 35 35 35 33 33 32 34 35 33 33 34 247 244 239 246 238 240 235 240 248 230 188 171 168 193 193 207 222 238 245 238 246 250 247 199 139 154 178 186 195 206 224 249 244 237 241 242 244 239 233 227 236 233 230 234 238 240 240 237 234 234 240 243 241 245 238 240 247 246 239 239 248 247 249 246 244 240 244 243 238 235 242 244 246 246 248 246 244 243 246 248 249 241 238 243 247 242 238 238 236 239 244 245 243 249 243 242 244 249 247 244 244 247 246 247 249 248 247 251 247 240 246 248 250 249 245 242 245 248 244 240 239 243 242 242 237 238 245 243 238 247 250 247 246 243 243 240 252 252 242 247 247 246 239 247 242 243 247 245 250 247 241 239 233 236 245 244 246 248 246 243 241 246 248 243 241 242 244 246 249 251 249 250 226 163 140 126 128 144 161 194 230 248 250 249 248 249 247 250 252 245 237 180 153 128 126 121 143 172 202 163 137 121 129 202 248 249 251 250 252 250 184 147 133 113 157 205 215 218 239 249 251 250 244 247 248 248 252 249 250 249 248 244 246 250 249 247 247 246 244 243 234 222 206 186 169 182 246 247 252 253 251 252 251 252 252 251 250 243 242 247 252 251 248 251 249 250 250 251 250 250 251 253 250 250 248 246 249 248 251 251 250 248 252 248 251 253 251 251 249 250 252 252 252 250 249 247 250 247 251 250 248 251 253 255 255 251 249 247 242 237 234 235 240 249 247 247 253 253 252 251 247 243 243 249 252 254 252 250 249 249 249 248 251 251 254 250 244 250 254 254 253 248 244 245 246 248 252 250 246 247 253 254 254 254 250 248 248 250 253 247 249 252 252 251 251 249 246 249 253 253 252 248 248 250 253 252 250 252 255 253 249 248 246 248 250 253 250 249 248 247 249 251 249 249 251 253 248 249 249 248 243 248 251 250 247 250 248 250 217 152 140 133 138 133 143 145 179 186 214 248 236 234 240 247 244 249 238 240 161 159 128 114 136 140 165 146 205 204 235 245 242 237 230 225 218 215 200 183 182 180 191 214 215 222 226 234 229 238 236 239 244 217 159 129 100 92 74 62 55 51 47 46 68 96 111 122 110 90 69 62 53 50 45 44 44 42 42 40 40 40 40 39 38 38 36 37 35 36 35 37 35 36 34 34 34 32 32 33 33 34 33 33 242 240 238 240 239 239 239 245 247 245 209 172 175 164 201 188 219 228 245 241 241 245 248 233 151 146 174 179 193 203 206 230 242 239 237 234 242 238 234 233 227 221 245 234 222 229 246 249 241 222 230 232 235 232 233 241 241 244 247 245 244 241 248 242 242 250 247 241 239 240 247 248 245 244 243 249 246 246 250 249 245 243 247 247 244 242 241 246 242 240 239 242 246 238 242 242 249 248 250 248 248 248 250 246 245 249 249 248 249 249 245 243 241 247 253 249 239 238 241 242 243 235 233 237 239 247 244 243 244 243 251 246 246 247 251 246 247 252 245 246 248 252 245 241 240 245 245 238 239 234 239 241 247 246 244 244 244 242 244 244 239 242 249 245 245 249 248 244 251 253 250 249 219 159 141 129 132 141 165 195 230 251 242 242 248 248 251 252 249 238 234 173 154 124 126 120 144 175 206 182 152 126 152 228 247 247 250 250 245 242 236 197 158 118 135 198 213 220 229 247 247 241 239 242 249 246 244 244 245 247 248 246 253 252 251 250 244 244 243 235 232 220 207 190 181 233 251 249 254 253 253 251 252 252 251 253 247 245 248 245 243 248 246 249 251 249 249 252 251 249 254 253 246 246 252 252 247 250 252 253 252 250 253 254 255 253 250 250 254 251 252 251 251 253 251 248 246 241 249 250 242 245 253 253 254 252 252 252 252 247 249 253 251 250 251 251 250 251 251 248 251 249 245 251 250 253 254 250 252 252 251 251 251 253 251 252 252 252 254 252 254 252 252 252 251 251 253 254 251 249 252 254 253 249 250 253 254 253 253 250 250 253 253 250 248 253 253 250 250 254 253 252 249 249 251 252 248 253 254 255 254 254 254 254 254 254 254 253 252 251 250 250 246 246 253 252 246 249 248 244 240 249 252 246 244 253 253 253 205 151 138 133 142 140 143 148 191 193 210 251 245 246 252 251 238 238 230 220 154 155 117 106 122 130 162 153 206 203 237 250 251 250 248 251 251 252 251 250 244 226 204 196 194 196 191 194 193 203 180 168 202 231 192 156 118 98 90 75 62 59 50 46 49 138 146 111 128 118 76 80 73 59 49 44 43 42 42 41 41 41 41 39 38 38 38 37 36 36 35 35 36 35 35 35 34 34 33 33 35 34 33 34 241 239 235 236 237 244 246 245 242 242 229 190 173 170 184 187 209 220 238 244 238 242 241 238 180 141 165 182 188 204 201 222 245 246 248 244 243 244 243 232 236 228 239 236 241 245 238 237 229 223 227 234 241 236 236 242 245 242 248 250 241 243 240 243 243 241 246 243 242 241 249 252 250 247 246 250 248 246 253 252 243 251 246 244 241 243 245 240 243 243 244 247 240 240 239 243 250 247 250 253 250 249 251 248 249 249 246 247 246 247 247 243 239 244 252 252 248 245 243 238 233 233 245 240 237 245 244 243 250 252 248 244 243 243 246 249 250 250 246 245 249 249 243 246 241 244 245 237 245 240 235 237 248 250 242 242 247 240 244 250 241 247 245 250 246 242 243 244 250 251 252 248 219 162 138 128 132 142 169 196 228 254 251 249 247 247 246 248 250 250 227 163 156 126 123 123 147 178 208 195 161 144 211 237 243 246 251 248 248 248 245 212 184 131 125 187 214 219 222 245 249 247 239 240 247 245 248 249 249 244 249 251 253 251 252 252 246 238 234 228 222 222 206 187 208 242 247 248 251 252 253 254 252 251 249 251 248 251 251 245 241 250 244 250 252 251 253 251 248 248 252 253 250 251 251 253 251 248 251 251 246 248 252 253 253 250 250 249 252 252 250 254 253 252 252 247 245 244 245 244 241 248 253 252 252 252 253 248 249 250 252 253 251 252 254 253 253 254 250 246 251 248 243 251 252 254 251 247 250 251 248 249 252 248 249 249 250 251 254 253 254 252 251 251 251 251 253 253 252 252 252 252 253 247 245 250 253 254 252 250 250 252 253 253 248 250 251 250 251 254 252 252 249 249 248 253 250 253 254 253 252 251 252 253 254 250 254 254 251 249 252 252 249 249 254 254 251 254 253 248 245 250 251 248 250 249 251 253 199 149 132 132 149 143 146 150 196 195 206 249 249 248 250 242 224 229 230 216 153 144 118 113 117 140 155 154 211 205 234 249 249 252 252 252 252 251 251 254 252 252 251 250 244 241 238 240 241 238 210 170 170 197 189 167 148 110 98 89 68 63 56 51 43 65 210 182 111 105 88 87 96 80 59 51 48 47 44 42 41 41 41 40 39 39 39 39 38 37 37 37 37 37 35 36 34 35 36 35 35 36 33 34 236 241 241 236 234 242 244 240 243 244 245 214 173 177 160 192 186 216 227 246 238 241 246 237 212 153 150 176 181 192 201 208 238 240 241 242 234 235 236 237 244 240 239 232 241 242 243 237 228 227 236 237 243 251 238 246 248 248 246 238 238 247 247 244 241 242 247 240 242 249 253 250 252 251 246 247 249 251 252 249 248 241 241 242 240 243 246 241 246 249 249 247 250 247 249 247 245 249 251 247 247 251 249 244 249 247 248 246 242 243 251 249 243 240 243 243 246 248 244 241 236 239 240 246 249 249 245 242 245 244 245 248 249 249 246 247 250 248 246 246 247 243 245 249 241 245 248 231 235 238 243 246 245 248 245 246 247 247 247 246 242 248 249 249 246 245 246 243 242 241 245 252 218 163 137 128 135 145 161 186 225 246 247 249 244 249 250 244 243 236 192 157 148 126 122 121 151 184 208 201 173 188 233 233 237 240 247 251 248 245 243 230 194 156 115 170 214 215 218 235 251 248 245 242 244 245 246 243 243 244 246 249 249 245 249 252 250 243 224 217 211 217 215 193 242 250 253 252 251 251 252 253 253 255 251 252 249 249 248 251 251 251 251 248 250 253 251 246 251 252 253 252 252 252 248 251 250 251 251 250 252 253 249 247 251 252 251 248 252 251 251 253 248 248 252 249 245 247 245 246 249 252 252 253 254 252 253 254 254 251 250 248 250 253 254 254 252 253 254 255 251 249 248 244 247 252 251 251 250 252 254 250 252 245 247 250 251 253 254 252 254 252 248 250 249 250 251 250 252 249 247 250 251 252 251 249 249 253 249 246 248 252 251 247 244 248 249 249 250 250 249 251 250 254 254 253 254 254 253 252 250 249 253 253 253 250 253 254 252 253 251 244 232 245 251 250 248 250 249 252 254 254 253 254 249 247 252 254 190 145 131 136 150 136 155 159 203 193 204 244 245 246 243 235 229 228 225 204 150 132 130 133 111 147 153 158 207 203 233 253 249 248 248 251 250 250 252 254 252 252 252 253 250 252 252 251 253 253 253 249 249 247 243 230 168 145 109 101 88 70 61 56 52 41 90 183 207 141 91 84 107 110 80 61 58 53 50 48 44 43 42 40 38 38 39 38 37 36 35 35 37 38 36 36 35 36 35 35 35 34 35 34 237 236 235 233 234 242 242 240 243 249 241 232 185 168 173 172 187 208 222 238 247 247 246 248 225 179 143 166 177 187 201 204 232 247 244 246 229 230 242 241 243 241 237 230 238 240 234 231 240 239 240 241 246 252 242 246 245 249 248 244 242 250 250 242 242 243 246 248 245 246 251 250 252 250 247 246 247 250 250 249 251 243 247 244 244 248 249 242 250 249 250 252 249 247 247 248 249 248 249 246 247 251 253 245 241 242 245 240 243 240 247 252 240 241 241 236 239 245 250 252 245 238 228 236 240 242 243 249 248 246 249 252 249 246 244 240 246 249 251 248 242 245 244 250 249 246 243 244 240 243 247 243 237 238 249 251 247 247 248 243 244 246 248 245 245 244 245 240 245 244 243 251 211 158 138 128 136 141 152 177 224 243 245 248 242 240 245 240 235 196 189 160 144 123 122 125 155 186 204 198 186 183 234 233 239 237 241 239 247 242 240 240 201 177 117 150 210 211 218 224 249 248 252 250 247 244 245 246 244 247 247 242 241 239 250 253 250 248 238 231 188 215 248 240 240 248 247 251 251 250 253 252 251 254 252 252 251 248 246 246 251 250 250 248 251 252 250 247 251 249 250 253 252 253 254 252 248 252 250 247 252 254 249 244 246 251 250 248 249 250 252 252 246 247 250 251 244 248 251 251 252 253 253 252 252 254 254 255 255 254 250 248 253 255 254 253 253 254 255 254 252 248 244 247 249 250 253 252 252 250 251 251 252 251 249 253 255 254 254 254 252 253 252 254 253 254 249 252 254 251 250 250 252 252 252 251 250 253 253 249 249 247 250 249 246 248 249 246 246 251 254 252 252 253 249 244 251 253 254 252 248 247 251 252 254 251 253 255 254 254 254 251 248 250 251 249 252 253 250 251 253 253 254 254 250 249 250 252 183 142 129 137 145 128 161 163 206 200 201 245 253 247 245 236 227 229 230 200 150 132 132 144 134 139 157 163 209 200 230 253 253 251 252 249 251 248 250 251 252 249 251 250 249 251 253 252 252 253 254 253 253 253 253 254 211 166 129 106 100 84 68 63 54 51 55 91 134 151 141 111 85 102 98 76 73 65 56 53 49 45 43 41 40 39 39 39 36 40 38 38 37 38 37 37 37 37 36 35 35 34 34 35 237 234 236 234 242 240 240 245 241 243 242 244 207 172 180 154 178 186 219 227 236 237 239 246 247 222 146 150 176 184 199 207 216 241 241 241 237 241 250 243 239 245 242 248 243 246 235 237 244 246 243 240 250 246 241 243 247 245 250 252 245 251 249 241 237 237 231 232 241 242 248 250 250 240 239 243 250 245 243 245 245 240 244 241 247 247 245 242 245 247 245 247 244 242 242 246 246 243 248 246 240 239 244 246 243 238 242 248 243 241 244 251 245 244 236 231 233 239 241 245 235 240 238 232 230 239 247 248 250 248 244 247 249 247 244 245 243 242 253 249 242 247 245 245 245 244 241 242 243 240 234 238 240 243 247 248 244 242 242 242 251 253 247 245 249 250 246 246 247 244 235 247 203 154 139 131 135 132 146 171 228 244 242 240 237 231 226 224 201 180 168 158 139 125 122 123 160 190 202 183 191 187 223 242 245 239 240 240 239 245 244 247 212 193 130 133 204 211 219 214 241 242 252 251 249 251 252 250 251 248 246 243 244 244 245 247 248 247 239 216 213 246 253 248 242 242 247 250 250 251 251 252 252 251 250 250 247 251 251 246 248 250 253 255 254 253 251 253 246 252 252 253 253 252 248 249 253 254 253 251 251 245 248 252 252 251 251 250 250 251 251 248 249 251 250 250 248 248 250 249 245 247 252 253 251 253 255 255 255 255 255 254 254 253 253 255 254 254 254 254 250 248 248 251 250 252 254 253 250 242 242 251 252 251 248 252 254 254 255 255 252 249 252 253 252 253 252 251 253 254 253 254 253 252 253 254 255 254 254 253 250 247 251 249 250 247 244 243 250 252 253 254 254 254 253 250 254 254 253 249 246 250 252 251 254 251 252 253 253 255 255 255 255 255 254 254 252 253 254 253 253 253 254 254 254 254 253 249 170 138 126 133 145 122 165 168 205 197 196 244 249 247 251 246 244 245 242 202 154 137 133 144 149 131 151 166 204 176 224 252 253 252 250 247 250 249 249 248 251 250 247 250 248 249 248 250 250 247 247 252 253 253 249 251 245 204 158 127 101 100 81 69 61 55 53 60 89 155 170 163 174 132 91 84 84 93 81 69 58 55 49 45 45 43 41 41 38 38 40 40 38 38 39 38 36 36 38 36 35 36 35 34 237 240 242 242 243 240 243 249 238 245 238 241 222 193 166 178 150 171 212 221 234 239 235 237 239 232 170 144 168 182 194 205 210 231 239 237 245 241 248 243 238 234 246 243 241 245 241 246 242 248 246 245 244 236 232 241 249 247 246 250 250 251 246 244 234 235 239 241 246 246 243 246 248 239 237 240 249 243 243 241 240 238 249 247 246 235 239 237 244 249 247 241 247 245 244 239 242 247 248 245 243 244 244 243 246 246 246 246 246 246 245 250 250 246 240 234 231 229 230 227 232 241 239 238 242 247 248 246 243 240 245 243 244 244 246 249 240 241 250 247 246 247 247 245 241 240 242 242 249 242 235 246 238 246 249 246 243 246 245 245 247 251 241 243 252 253 249 238 240 239 242 247 194 154 139 129 134 132 147 161 228 236 229 222 218 220 216 198 182 167 185 158 136 127 125 121 166 193 191 143 183 197 207 233 235 242 250 249 245 247 247 249 230 201 151 125 195 212 217 215 232 237 244 247 250 253 253 252 252 247 245 245 246 244 243 245 245 244 203 207 249 253 248 251 253 251 251 250 252 254 252 251 248 247 244 243 249 252 252 248 251 251 253 255 252 250 252 250 249 253 246 244 247 252 249 248 252 253 254 253 250 242 247 252 251 252 252 253 252 253 253 251 252 253 250 248 249 250 249 249 250 250 248 248 248 249 254 255 255 255 253 252 253 253 252 254 254 254 253 253 247 247 248 248 248 252 251 252 253 250 248 252 252 247 236 241 251 251 253 255 254 250 247 254 254 254 254 254 254 254 252 253 249 252 254 254 254 254 253 253 253 251 254 252 250 239 236 245 253 250 250 251 253 252 250 246 253 254 253 249 244 248 252 252 253 252 249 247 252 253 253 251 253 253 253 253 251 251 250 251 252 251 253 254 254 251 250 244 165 136 127 135 150 126 166 178 202 199 190 241 246 251 253 252 247 239 234 192 155 140 135 142 137 130 151 173 191 146 216 251 251 253 249 247 245 247 250 252 251 252 250 247 246 249 248 247 250 250 252 253 251 252 252 253 247 242 177 151 112 105 93 78 68 59 54 55 79 210 242 236 241 231 162 120 90 87 95 93 79 65 55 53 52 48 45 44 41 41 40 40 39 38 39 37 38 38 37 37 37 37 37 35 243 244 248 245 241 239 245 245 240 241 240 244 240 218 170 185 160 153 186 215 228 242 235 238 236 238 210 152 154 180 185 198 206 213 241 245 244 236 234 239 241 236 238 241 243 243 244 248 247 239 244 246 242 243 247 252 251 246 248 246 251 251 236 236 237 240 246 246 247 243 243 246 246 245 250 244 244 246 248 244 237 236 238 245 247 244 242 247 250 245 244 240 243 245 246 245 238 239 247 238 242 250 249 240 247 245 245 248 252 250 241 237 237 243 245 243 239 237 233 234 245 250 244 235 238 247 241 236 239 243 245 246 246 246 247 246 250 249 248 247 246 246 251 246 239 240 239 243 247 246 239 235 238 241 248 248 244 245 248 250 242 248 245 246 251 249 244 241 240 242 248 250 186 152 139 130 131 134 143 142 235 234 229 221 214 217 196 173 141 191 189 153 135 126 129 127 168 199 166 117 175 205 190 226 241 249 250 247 250 245 249 250 241 204 175 136 183 207 213 220 226 246 246 252 250 245 246 245 243 243 243 243 246 245 246 249 243 236 213 228 253 240 219 242 253 253 253 251 253 253 247 248 246 249 250 250 250 251 250 248 252 249 251 253 250 248 254 253 250 249 242 240 246 251 253 250 245 249 254 253 252 247 244 250 249 250 253 254 252 254 255 254 255 254 251 247 250 251 252 249 250 250 252 252 248 247 253 253 255 254 250 253 255 255 254 248 253 254 252 252 253 252 250 247 248 245 249 253 253 252 249 253 252 252 251 251 253 250 248 254 254 251 252 255 255 255 253 252 252 255 254 253 248 248 253 255 255 253 253 254 254 255 254 252 249 246 250 252 253 252 253 253 250 251 252 250 249 251 253 251 247 252 251 251 250 252 248 247 250 253 254 251 252 250 252 252 246 241 246 247 251 254 254 255 254 255 252 238 158 134 133 138 149 129 164 185 195 203 182 237 252 250 249 248 237 230 225 181 152 132 133 136 122 126 150 175 171 126 215 249 251 250 250 246 243 243 250 252 253 251 249 248 251 252 245 241 250 252 251 250 249 253 252 251 250 250 222 176 141 115 103 92 75 68 60 56 52 117 244 250 248 248 235 185 145 126 96 84 88 85 76 67 62 58 52 52 48 45 43 42 42 41 41 40 41 39 40 40 39 38 38 38 244 245 249 247 235 236 236 243 238 236 244 239 240 240 182 161 191 140 159 207 220 237 228 237 241 243 233 169 146 169 183 193 204 207 235 244 236 240 235 241 245 247 239 242 245 247 244 245 244 238 249 253 247 243 252 252 248 247 247 245 253 250 234 238 245 246 248 247 250 246 243 250 249 247 250 245 246 246 241 241 236 235 238 242 245 246 245 248 248 242 241 241 238 247 243 244 243 243 245 245 242 250 252 244 244 246 243 252 253 248 243 243 240 240 249 248 247 249 246 244 242 245 248 244 238 248 240 236 239 246 248 248 244 238 244 244 251 250 252 243 242 244 245 241 241 248 245 243 243 250 238 239 244 243 247 251 243 230 238 248 241 239 249 247 248 247 242 240 240 244 243 249 184 149 139 133 131 139 141 137 238 233 224 216 214 215 170 128 168 219 182 150 135 128 128 132 171 201 157 111 170 198 190 221 239 248 254 253 253 248 252 253 243 215 186 152 176 205 211 220 222 241 240 245 246 241 245 245 240 240 240 240 242 241 245 249 238 229 237 246 248 232 224 243 253 252 252 252 252 252 246 248 249 251 248 247 248 251 252 247 250 246 248 254 255 253 253 253 251 251 249 252 249 248 250 246 246 253 254 251 250 248 247 252 251 253 252 251 255 255 254 255 255 252 247 247 252 252 252 252 253 249 252 253 253 251 249 246 251 253 251 253 255 254 255 253 252 254 248 248 255 254 252 250 249 250 251 253 249 251 253 254 252 250 249 247 249 247 250 253 251 253 254 252 253 254 254 253 253 255 254 253 252 252 253 254 254 252 254 253 252 254 254 253 253 252 253 250 249 254 253 254 249 252 253 252 252 252 254 254 246 248 252 252 254 252 250 253 251 252 254 254 254 250 252 246 238 239 246 241 246 252 254 254 253 254 253 232 154 133 136 141 145 132 163 193 187 208 176 234 252 247 241 245 248 239 232 179 151 127 132 132 117 128 152 185 145 132 217 250 250 251 252 247 245 245 246 250 250 251 251 249 250 249 246 244 247 250 249 249 250 252 253 253 251 245 245 208 159 131 112 105 94 80 67 60 58 56 182 249 252 249 243 239 176 116 126 126 96 80 76 75 75 72 65 59 56 52 49 47 47 45 42 41 43 41 42 40 41 41 39 40 245 241 238 239 238 237 228 241 247 245 242 241 233 247 211 165 183 171 126 177 220 226 237 241 241 239 232 211 140 153 181 187 199 205 218 242 244 248 245 240 240 241 247 244 245 245 245 245 246 239 238 241 251 247 239 237 245 246 237 236 240 243 242 244 245 244 250 253 248 243 241 248 247 245 247 246 245 240 241 240 241 243 244 245 249 250 253 250 244 239 244 243 251 242 242 245 244 246 245 241 237 242 242 241 251 251 246 249 249 250 249 248 245 242 241 244 245 239 236 237 240 235 247 242 234 243 242 241 245 248 245 241 247 244 245 246 246 249 252 248 244 248 245 242 245 245 247 242 239 242 244 239 244 250 243 242 239 240 250 247 239 250 252 252 247 248 238 240 242 242 236 238 176 151 137 130 134 142 133 139 238 230 223 214 213 219 176 156 206 227 168 150 135 133 127 134 170 200 164 111 157 185 202 206 238 243 249 251 253 253 253 249 249 235 194 169 175 199 210 216 223 241 249 248 246 241 248 246 244 243 241 244 247 241 247 252 229 219 244 251 248 246 249 252 250 243 241 243 247 246 252 252 252 252 247 249 253 251 245 245 251 249 250 251 252 254 253 251 249 247 250 252 245 239 248 253 253 254 251 245 248 250 250 253 255 254 250 250 249 250 253 254 254 249 247 248 249 249 249 250 255 254 251 250 253 252 248 246 244 246 250 253 254 251 253 254 252 250 246 247 253 255 252 249 250 253 253 253 247 246 250 251 251 249 249 253 251 251 253 249 248 253 254 252 251 251 253 254 254 254 255 255 254 253 255 252 253 253 254 253 254 254 251 247 242 247 245 247 250 253 251 248 250 253 253 252 254 255 253 251 250 251 253 253 253 249 252 252 252 252 252 255 252 249 254 253 253 248 243 248 246 251 254 255 252 251 249 214 149 132 135 145 143 142 158 201 172 212 168 228 249 241 242 238 232 243 241 179 150 123 133 132 109 133 150 188 133 144 214 249 253 252 251 245 248 245 242 246 248 252 249 248 249 248 252 253 243 246 250 248 246 245 251 248 246 245 248 247 189 147 128 121 125 113 92 76 64 62 79 199 246 247 247 248 247 206 97 70 97 83 63 65 68 73 79 81 78 70 62 57 53 52 49 47 47 44 45 42 42 42 41 41 240 234 233 230 234 240 240 232 239 242 241 240 233 241 231 189 161 198 144 139 215 220 238 245 248 248 237 239 158 142 173 186 195 201 212 230 238 239 241 237 244 243 247 241 241 237 242 238 243 248 238 237 251 241 238 244 251 242 234 237 234 233 238 245 244 244 250 253 250 248 247 244 245 241 246 243 246 242 245 244 242 242 249 249 247 249 251 252 243 241 244 249 254 250 246 247 246 246 250 248 248 249 246 243 248 249 251 251 246 245 245 244 244 240 243 242 249 242 235 241 246 244 250 245 240 246 249 252 252 249 243 237 239 239 242 245 242 249 243 243 244 249 250 247 249 248 248 246 244 244 244 241 241 243 237 241 245 247 250 249 248 249 252 250 246 245 240 241 243 243 238 237 168 152 136 129 132 142 130 136 231 219 215 210 206 214 153 127 201 207 153 152 135 133 127 135 171 204 169 126 142 181 206 197 235 242 250 253 252 251 254 248 253 251 204 180 175 201 211 214 222 227 251 246 245 246 246 246 248 244 245 245 247 246 246 248 229 218 248 250 252 250 248 249 250 246 241 242 248 250 250 249 251 253 250 242 246 251 248 245 249 252 247 242 246 249 247 248 252 251 253 253 253 249 251 252 253 251 250 248 250 253 250 252 254 254 253 248 250 251 251 253 253 251 249 251 250 252 250 250 253 253 253 254 255 254 253 253 247 248 253 252 252 252 251 254 254 251 250 253 253 249 248 250 247 249 252 253 251 248 250 249 253 247 247 253 253 254 253 249 244 251 251 250 253 253 255 251 250 253 254 254 255 253 255 253 255 254 253 254 255 254 252 248 247 252 247 245 252 254 252 252 253 252 254 253 255 255 254 253 254 253 252 252 247 251 253 254 254 249 253 255 252 253 251 252 253 253 251 253 252 250 251 255 254 252 251 208 148 134 133 142 127 151 160 206 160 208 169 222 252 248 241 232 232 238 242 176 150 124 132 131 107 135 151 185 140 156 213 247 253 253 252 250 247 244 245 251 252 251 249 248 249 253 251 249 250 249 246 249 243 241 249 249 246 245 252 252 234 173 135 133 160 160 124 100 74 65 59 109 229 245 248 251 250 251 207 111 49 49 54 60 57 62 72 77 85 88 86 77 68 64 55 55 53 51 49 48 46 45 44 43 207 220 232 236 241 243 235 231 243 248 244 238 242 241 243 213 159 172 180 139 182 216 228 240 242 236 245 243 192 145 157 181 194 199 207 219 243 244 239 237 246 239 244 247 241 235 244 241 244 242 242 246 247 247 243 251 252 249 243 236 237 240 244 246 244 247 251 248 247 246 245 242 243 241 238 241 243 246 244 241 246 239 245 251 252 251 248 246 237 236 239 242 248 250 250 249 251 244 244 245 245 239 239 237 244 245 250 253 252 246 244 242 242 245 241 245 249 242 232 232 229 234 243 247 245 244 247 240 241 246 247 238 235 243 248 248 245 241 249 250 252 247 246 249 243 247 247 248 244 238 239 237 238 240 244 243 250 251 250 250 250 244 249 247 249 246 241 238 229 233 241 241 164 152 134 132 132 148 132 122 164 165 155 139 193 211 134 90 148 175 138 153 136 131 131 139 175 203 178 140 129 177 207 196 226 244 252 253 252 249 249 249 251 252 216 190 172 201 208 211 221 217 247 249 244 244 243 242 242 244 242 240 246 247 244 225 222 238 252 254 252 250 245 249 252 246 245 246 242 243 250 251 249 251 246 245 251 248 244 247 250 252 250 246 250 254 252 247 246 248 253 255 251 248 253 251 252 250 245 248 250 254 254 255 255 254 250 249 255 255 250 249 249 249 249 248 250 246 252 252 253 252 252 252 254 251 252 246 250 253 255 254 251 254 254 252 255 250 249 254 250 250 253 251 247 251 252 250 248 250 247 250 252 251 248 250 254 254 251 247 241 242 249 253 253 254 252 249 251 251 248 250 254 254 253 253 251 254 255 253 252 254 253 254 254 254 251 251 254 254 252 248 247 251 255 254 254 255 255 255 254 253 252 255 245 244 249 253 253 253 253 254 253 252 253 253 252 245 239 250 254 251 248 253 253 250 251 200 150 131 131 133 122 159 162 205 146 211 173 214 253 244 245 249 252 249 234 169 150 122 135 129 109 137 151 181 152 173 211 245 246 251 250 249 250 246 247 247 248 251 248 243 250 251 249 245 250 251 245 243 247 252 250 249 251 249 252 249 252 228 148 127 139 158 165 131 96 82 66 59 124 215 242 244 251 248 248 232 83 47 51 55 46 39 55 81 84 80 83 89 91 93 90 85 76 71 63 59 57 54 52 50 177 178 188 212 235 239 242 237 240 247 248 239 243 246 241 226 178 146 188 171 155 210 222 239 237 233 244 241 221 156 148 175 192 199 207 212 234 237 235 235 234 233 243 245 241 234 242 247 249 241 245 247 242 240 243 245 251 249 243 245 243 245 247 249 251 252 251 251 247 243 240 245 246 243 238 243 244 247 245 239 247 248 247 246 241 246 248 246 245 240 239 243 252 250 249 242 245 244 245 244 242 242 245 240 245 246 252 254 252 250 242 244 246 247 244 249 250 250 248 244 233 234 232 235 245 245 247 248 242 245 250 247 241 248 249 242 238 238 251 249 246 243 240 245 244 248 250 248 246 241 244 245 244 238 247 250 250 250 250 251 245 242 245 245 248 246 240 237 236 235 239 235 160 150 137 134 131 149 128 118 124 119 118 113 188 219 118 98 119 135 140 156 138 130 132 142 175 200 186 151 128 173 205 208 214 243 247 245 249 248 254 253 252 250 231 198 172 194 204 211 221 218 238 253 248 245 243 239 246 242 243 247 242 249 243 201 225 251 253 254 253 251 250 251 249 246 245 248 248 249 254 254 252 252 249 242 246 246 244 249 252 251 251 251 253 252 247 249 251 250 253 253 253 249 251 250 251 251 247 249 252 254 254 253 254 254 252 253 254 255 251 250 252 253 252 252 251 248 251 254 255 252 253 252 252 252 249 245 253 254 254 254 254 255 253 252 255 253 254 254 251 252 254 254 250 247 253 250 244 246 250 254 253 252 251 252 254 252 253 253 246 246 253 252 250 248 251 251 252 245 238 249 252 251 250 251 248 253 255 253 251 253 250 252 254 255 255 254 253 252 251 248 247 251 253 254 254 255 255 253 251 251 253 255 252 247 244 251 255 254 253 253 253 253 254 254 252 247 238 236 242 240 242 244 247 247 249 193 148 134 133 132 123 162 163 201 130 208 176 208 251 243 239 244 237 241 225 167 143 127 139 130 107 143 154 177 157 177 208 245 251 252 250 249 250 248 241 244 249 246 245 248 247 246 243 243 248 251 250 247 245 250 249 248 247 249 252 251 251 251 193 130 130 139 165 159 115 97 82 70 67 114 221 247 246 247 250 248 115 58 49 48 39 36 44 68 98 118 106 92 86 90 96 99 104 107 97 88 81 72 62 59 169 169 168 170 172 188 212 225 240 238 235 238 239 242 239 241 211 152 172 189 179 192 220 225 238 234 249 243 238 195 140 159 189 198 203 211 225 235 234 237 239 240 241 243 240 235 246 250 243 242 243 240 234 235 237 238 235 238 245 246 247 245 242 243 244 249 250 250 242 245 248 242 244 241 243 243 245 247 244 246 249 252 247 243 236 242 251 247 247 248 245 242 243 251 252 244 250 252 253 248 245 244 246 240 239 244 247 251 253 250 246 249 249 248 245 243 239 238 240 235 231 235 235 244 241 236 240 251 249 244 246 248 244 235 244 245 247 248 250 250 247 247 234 244 248 247 250 245 242 240 246 242 239 247 244 244 248 252 243 243 248 251 248 246 247 246 241 237 241 242 246 241 154 149 135 134 132 155 119 118 118 120 122 114 167 212 106 95 110 123 143 159 140 133 130 145 179 205 200 163 134 161 195 219 200 233 247 241 250 251 251 252 253 250 244 205 179 184 212 214 213 221 230 250 246 241 241 240 242 241 244 248 245 237 225 216 250 251 252 251 247 248 247 245 247 251 246 249 246 251 253 253 252 250 253 252 252 252 252 253 253 252 252 253 255 254 254 253 249 251 253 253 246 248 255 255 249 250 251 252 254 253 254 255 255 254 254 252 253 252 252 254 254 252 248 253 252 251 252 252 253 255 252 252 251 253 250 248 250 248 249 250 252 251 253 255 255 254 255 255 255 255 250 250 253 253 253 252 250 250 249 249 253 251 250 254 252 252 254 255 254 250 253 250 249 243 246 246 250 247 242 247 250 251 251 246 247 252 254 255 253 251 248 250 249 250 249 245 250 253 254 253 253 253 250 252 255 255 255 254 255 254 253 253 254 253 252 250 253 254 254 254 254 253 252 250 248 246 239 234 232 235 243 239 250 250 242 183 145 134 129 122 124 161 170 195 117 198 183 203 246 241 244 238 193 154 169 163 139 124 141 130 110 143 154 170 161 183 204 242 249 251 251 252 254 250 245 248 250 251 250 252 247 247 242 247 249 251 247 245 251 251 244 250 246 246 249 248 252 251 241 189 123 127 138 160 160 137 124 101 80 69 91 167 236 249 250 242 115 67 45 40 37 42 85 94 105 126 149 165 162 139 111 100 92 94 102 104 110 114 111 102 167 168 167 166 164 164 168 177 195 213 232 238 246 236 233 232 228 178 140 184 200 200 216 218 241 238 245 239 243 234 146 141 182 192 201 209 218 230 238 238 244 245 245 246 239 240 249 247 248 241 237 239 235 241 239 237 239 241 243 235 234 238 242 247 248 251 249 244 242 243 241 241 240 247 246 245 250 248 246 243 240 242 247 249 246 249 249 245 248 245 240 240 245 250 249 242 243 248 249 243 242 240 244 242 236 242 246 249 250 247 243 247 251 251 246 238 235 236 240 240 239 240 241 243 246 243 240 250 249 245 239 238 240 238 241 240 246 243 242 245 247 244 240 245 248 241 246 244 247 241 244 245 247 250 246 238 249 253 251 246 245 247 247 244 244 247 244 244 242 243 247 235 152 148 136 134 134 158 116 123 111 118 119 116 153 212 98 89 102 118 145 163 142 136 132 146 182 208 216 173 139 150 189 218 203 222 248 245 248 246 247 248 251 248 249 219 183 174 212 212 213 221 224 242 246 239 239 241 244 245 244 247 250 233 227 245 252 252 253 248 247 252 248 243 248 251 248 249 248 248 244 245 247 249 249 244 250 248 252 253 253 254 253 251 250 250 254 254 253 252 247 249 251 252 252 254 250 252 254 254 254 253 253 252 255 254 254 250 248 251 253 254 254 253 254 253 253 255 254 254 254 254 252 250 242 245 250 251 254 251 248 250 250 248 251 252 252 251 251 254 253 253 248 251 254 255 254 253 253 253 252 252 254 254 253 254 246 250 253 255 252 251 252 253 249 249 248 248 252 252 252 251 252 249 246 248 250 253 254 252 248 250 253 253 250 251 250 247 249 249 253 253 252 253 250 250 254 255 254 253 253 252 254 254 255 254 251 249 252 254 252 254 254 253 252 251 250 253 249 247 247 249 253 249 249 251 238 175 145 134 130 116 128 159 179 184 108 179 183 200 237 234 246 245 220 167 182 159 136 123 141 131 109 146 159 167 163 187 202 240 242 248 248 248 246 244 248 253 251 251 252 252 248 249 248 251 250 247 242 247 252 253 246 246 246 249 251 248 252 248 251 244 165 120 123 136 156 168 157 142 119 88 70 77 125 186 239 224 92 63 51 45 32 90 217 220 226 231 235 239 241 235 212 190 152 123 97 90 95 100 110 113 164 166 168 169 167 166 165 167 163 161 171 189 212 222 228 235 241 197 137 164 194 206 212 216 227 241 238 239 245 245 184 140 159 181 192 204 214 225 240 240 247 244 248 244 243 247 246 247 246 240 237 239 244 249 238 241 245 239 245 237 236 237 243 245 244 242 243 240 235 245 240 244 248 245 252 247 246 247 247 242 239 236 236 242 248 243 243 243 241 248 239 241 247 253 252 249 249 251 251 251 248 249 252 251 243 244 249 248 247 246 245 242 244 248 246 241 235 241 246 250 247 246 245 249 243 241 241 249 254 251 243 232 231 245 242 237 244 246 244 245 247 245 249 245 246 246 251 251 248 244 248 246 250 251 245 238 248 249 244 245 248 243 249 251 249 244 241 244 245 246 249 232 150 149 136 134 132 150 126 125 109 111 118 117 117 135 91 92 106 112 145 158 143 132 133 151 181 212 237 188 150 140 184 211 210 209 239 248 253 250 250 244 244 245 246 238 190 169 206 210 213 218 221 231 248 241 239 246 242 244 251 246 230 210 241 250 251 252 252 253 251 251 247 244 246 252 247 242 251 251 246 242 247 251 246 245 250 252 252 252 252 253 249 246 250 252 253 252 247 251 253 253 252 251 252 253 250 250 252 248 246 247 246 246 251 254 255 255 255 255 251 249 252 254 254 255 254 254 254 255 254 255 253 252 251 251 253 254 252 247 244 251 252 248 249 252 251 250 246 248 246 243 250 252 252 253 253 253 247 252 252 250 251 248 254 252 249 252 253 254 253 253 254 252 247 247 253 251 252 254 254 253 254 253 252 254 254 254 254 252 252 252 255 254 254 255 253 249 249 248 251 253 255 254 254 252 254 255 255 253 251 246 251 253 254 254 253 251 249 254 253 251 249 252 252 246 251 253 249 252 253 252 248 246 246 245 227 169 140 130 131 116 136 156 191 165 106 153 189 189 238 225 239 252 241 236 195 152 130 124 142 135 109 148 167 154 160 187 201 241 249 248 246 244 248 246 251 251 252 251 247 247 245 250 251 252 251 248 248 251 252 248 251 251 250 253 252 251 247 250 247 251 239 178 119 120 134 143 161 171 162 138 105 86 76 75 97 119 74 60 64 46 35 97 238 241 246 249 249 249 247 246 243 245 245 247 225 190 151 128 109 102 154 160 163 164 168 170 170 169 168 164 164 163 167 179 195 219 240 227 159 150 185 199 213 216 225 249 224 228 231 245 220 154 141 174 181 199 211 218 238 238 239 242 239 237 237 245 249 245 243 248 242 241 244 250 239 241 245 239 249 240 227 226 247 245 241 248 243 243 239 245 243 246 246 242 252 249 243 241 240 243 239 237 236 238 243 242 246 241 242 247 246 244 237 243 246 251 239 246 247 248 248 252 251 249 243 240 246 248 248 245 239 235 236 232 244 251 246 240 249 253 251 249 245 245 238 240 237 241 249 252 240 237 230 233 240 242 247 244 248 249 250 245 240 240 240 238 248 251 249 249 247 246 244 243 244 240 245 245 247 251 252 244 247 250 247 244 246 247 241 246 251 233 147 147 138 132 132 153 120 123 120 113 118 117 109 90 86 94 108 113 146 156 140 135 134 151 182 218 243 200 160 139 172 204 214 199 237 244 249 244 243 240 241 245 247 248 204 175 195 210 213 219 225 225 245 242 238 249 245 247 238 225 197 214 252 253 253 252 253 250 252 254 252 249 248 253 248 242 249 252 252 250 248 252 248 244 252 252 247 248 249 249 249 249 250 251 251 245 248 254 254 254 252 248 246 251 253 252 253 253 251 248 246 246 249 250 252 254 255 253 246 247 251 253 255 254 251 253 254 254 253 253 255 255 254 252 250 251 253 249 253 254 251 247 248 251 254 254 254 253 252 250 251 247 249 251 252 253 253 251 254 253 250 250 253 252 252 250 253 254 253 254 251 250 251 252 253 252 253 254 252 251 253 254 255 255 254 254 253 251 247 246 252 253 253 255 254 254 253 252 254 254 253 254 255 255 252 252 255 255 253 253 252 254 251 250 250 249 249 253 253 249 249 251 252 247 251 254 252 254 252 250 241 247 250 250 228 163 137 126 130 112 141 153 201 155 107 137 194 184 235 228 244 252 245 245 202 154 127 119 142 136 114 147 170 150 150 188 197 240 248 245 243 239 244 251 249 250 253 252 251 248 247 250 250 251 252 250 252 249 249 248 248 248 251 253 251 251 253 252 252 253 249 238 169 119 123 132 143 153 164 169 150 124 98 85 75 68 64 56 54 48 42 62 155 190 215 234 247 247 249 249 243 245 245 248 250 236 231 223 204 189 140 144 149 152 157 161 165 167 171 170 171 171 170 165 166 166 178 192 174 143 168 196 206 214 222 247 248 242 234 243 236 186 140 157 175 190 208 217 227 240 239 239 235 236 240 248 243 248 247 242 236 240 242 240 241 243 238 242 243 226 225 232 243 241 238 240 240 246 247 249 250 246 246 244 250 243 240 244 241 240 239 236 242 236 236 234 238 237 240 245 239 240 240 245 239 240 237 239 246 243 241 243 242 245 245 245 243 243 241 241 236 234 235 237 238 242 247 247 252 253 249 250 250 246 243 242 239 246 253 251 244 240 235 234 239 242 244 242 243 242 244 243 242 241 244 244 244 246 246 246 251 252 244 246 244 242 245 244 242 248 251 243 248 251 247 247 245 247 247 254 251 231 146 146 140 131 130 153 115 136 121 114 117 115 111 93 88 95 108 117 151 155 142 135 135 155 184 224 245 222 168 143 152 193 216 196 230 242 243 237 240 240 241 245 251 253 226 192 180 208 211 219 225 220 243 247 245 249 230 201 193 194 203 242 246 252 253 251 248 244 250 253 250 250 252 244 244 246 249 248 250 252 249 249 246 248 252 249 249 249 247 249 253 252 247 249 252 251 253 253 250 252 252 253 250 251 253 254 254 252 251 253 253 252 251 249 254 254 249 249 247 250 248 250 254 253 243 242 248 252 254 253 255 254 253 254 254 254 253 251 251 250 245 248 250 249 253 255 254 254 255 254 253 253 253 249 247 250 251 250 253 255 253 251 250 252 251 248 251 253 252 253 252 250 250 250 252 253 251 253 250 251 252 253 251 251 251 252 247 249 247 251 253 253 254 255 255 254 254 253 255 255 255 255 254 254 250 252 253 254 251 252 253 252 251 251 252 247 252 252 252 250 251 252 251 251 254 253 252 249 252 250 242 249 253 252 217 160 134 121 125 106 145 148 208 142 108 128 185 178 234 233 242 249 239 235 198 160 123 112 141 133 112 142 180 138 151 194 194 235 251 250 246 248 250 250 247 247 250 253 253 251 250 247 250 248 249 252 252 251 252 252 254 253 251 253 253 251 254 254 254 252 249 249 243 192 120 114 122 128 135 148 170 179 165 136 106 91 82 74 67 63 53 53 52 63 82 99 128 146 165 179 201 221 231 240 247 247 240 237 235 242 130 133 137 140 145 149 155 158 163 166 168 170 171 172 173 173 167 162 156 146 155 173 194 205 220 243 246 243 245 240 242 221 145 138 174 188 205 215 221 243 242 238 241 244 240 241 235 246 243 242 237 239 238 234 241 249 246 250 244 230 226 241 245 247 238 234 248 247 239 240 242 243 249 241 243 243 248 245 244 242 242 237 239 236 237 234 237 234 234 238 236 237 242 238 240 244 248 243 238 237 242 248 250 249 247 245 243 244 240 240 235 244 245 244 242 243 246 248 249 250 252 252 252 245 245 243 239 249 250 246 245 245 246 245 244 246 245 240 249 252 247 243 239 238 239 242 242 248 250 244 245 251 247 251 241 243 248 243 244 250 252 246 252 250 251 254 251 251 249 252 251 227 145 145 144 132 132 153 132 153 131 117 117 116 113 97 92 96 112 113 153 150 145 133 136 159 192 232 247 239 178 151 143 180 210 205 212 244 246 247 243 243 244 245 249 251 239 202 181 205 212 218 223 225 238 242 226 215 202 182 173 188 242 253 246 250 253 247 251 253 251 250 252 248 248 247 249 247 247 249 250 254 252 250 250 248 248 249 252 250 247 250 252 252 251 253 253 252 250 252 252 251 249 252 251 250 255 255 254 249 251 254 252 248 249 250 249 253 249 247 250 248 244 250 252 251 250 245 247 250 250 250 251 254 255 255 255 254 255 253 253 252 247 247 253 253 255 253 253 254 254 251 249 249 252 253 246 243 248 252 255 255 253 253 253 250 249 252 253 253 248 249 248 251 253 251 253 253 252 251 250 250 250 249 248 253 252 249 249 248 241 251 253 253 254 254 253 250 253 255 255 254 254 255 254 255 254 253 251 251 245 246 253 252 250 246 250 244 250 250 246 246 250 250 251 252 253 253 251 251 249 249 245 249 254 253 210 159 133 125 125 107 146 153 212 140 111 132 157 166 236 234 238 242 225 231 192 155 121 105 149 132 114 142 185 131 154 197 196 234 247 249 251 250 248 245 244 247 252 254 252 250 250 248 252 251 252 252 254 255 253 253 253 253 252 251 253 252 255 254 254 254 250 247 249 245 185 130 116 113 125 134 142 149 167 176 169 151 119 95 79 74 75 71 67 63 65 68 70 74 78 84 91 106 126 141 170 190 209 222 236 243 115 117 122 124 130 134 138 142 147 149 156 159 161 164 168 170 170 169 166 161 155 152 152 158 175 215 231 225 235 239 245 242 175 127 158 176 199 210 217 232 244 243 246 243 239 246 239 237 242 248 241 236 241 236 230 232 238 246 243 249 239 245 240 243 240 234 244 244 246 248 250 248 249 246 242 240 243 242 242 246 243 237 242 236 233 235 239 246 242 237 245 247 245 243 241 243 247 249 243 246 243 242 242 249 250 250 247 243 246 237 234 238 244 245 249 246 246 246 242 247 249 247 247 239 246 248 244 246 250 249 246 247 247 243 246 252 241 238 247 252 250 245 241 244 242 245 246 246 248 248 249 249 238 242 241 243 248 242 244 245 247 244 250 251 250 251 250 250 250 248 251 224 147 143 145 132 134 144 159 142 138 120 117 118 122 117 105 107 126 122 159 146 145 133 141 164 196 235 252 249 198 161 138 169 198 212 197 231 250 252 252 250 244 248 251 246 238 208 185 195 209 216 220 224 230 226 191 189 201 174 170 223 252 251 249 252 249 251 251 250 251 248 253 251 246 251 248 247 246 246 253 252 245 247 251 250 247 244 250 253 250 251 252 251 249 251 252 246 245 253 254 254 251 245 244 247 255 255 253 253 254 254 254 251 250 252 254 253 255 253 249 248 247 245 251 251 251 250 251 253 253 251 250 253 254 255 255 255 253 252 252 252 248 247 249 250 253 255 254 254 253 252 254 249 251 253 244 242 253 254 254 254 254 255 254 253 243 243 245 246 247 251 255 254 253 254 254 254 254 255 254 250 245 249 252 252 250 247 248 251 251 252 252 251 253 255 255 255 255 255 255 253 251 253 253 254 254 252 248 250 253 251 248 244 253 252 246 243 240 245 247 247 252 250 248 247 250 249 250 248 242 248 249 252 247 250 198 153 131 124 126 110 155 161 216 148 106 127 144 152 233 236 240 246 221 230 185 151 112 99 163 126 119 145 178 126 147 192 196 231 245 244 246 247 249 248 249 247 252 248 243 247 252 252 249 249 254 252 253 255 254 251 249 253 251 251 250 252 254 250 252 251 247 242 240 251 250 220 159 137 122 126 146 141 137 138 150 171 189 186 153 139 120 103 93 86 77 71 67 64 64 64 63 63 66 68 69 71 81 89 109 125 102 104 111 113 119 122 126 131 135 140 146 148 151 154 160 160 162 168 167 168 167 168 165 163 162 170 173 174 193 207 228 238 206 139 143 172 191 204 216 221 249 246 238 237 240 246 247 241 247 251 236 229 235 237 227 225 231 231 234 244 235 240 237 239 238 238 244 246 244 248 243 246 248 252 249 249 245 247 244 239 245 240 240 239 239 245 242 250 249 240 244 243 243 245 245 246 244 245 248 249 246 244 250 247 244 249 250 251 245 240 239 240 240 242 244 244 246 247 250 249 247 250 250 245 249 248 249 248 246 241 242 247 249 245 247 247 243 241 241 250 247 241 245 244 243 248 251 247 240 242 245 248 244 242 247 251 245 244 241 242 240 244 248 251 250 248 248 246 251 251 254 221 148 141 147 131 134 143 174 138 136 126 123 127 146 158 174 139 137 131 162 145 147 129 146 169 195 237 250 252 217 171 139 155 194 211 198 221 245 249 251 246 244 245 248 244 240 219 187 187 207 213 218 226 227 226 197 189 191 178 191 244 250 252 253 253 252 249 247 251 251 247 250 253 248 252 251 248 250 252 250 252 251 252 251 250 251 250 252 253 251 247 244 247 250 249 252 249 250 251 253 252 249 248 252 253 254 254 253 252 252 253 254 254 254 255 253 253 254 250 252 252 252 250 249 252 247 248 251 253 254 251 249 253 254 254 255 255 254 254 252 250 250 249 247 247 249 254 255 255 255 254 254 249 249 252 249 249 255 254 253 254 255 253 252 250 243 244 249 252 253 254 255 254 254 253 254 254 254 255 254 254 249 253 254 253 246 238 245 250 251 249 249 251 252 254 255 254 255 255 255 254 254 255 254 253 253 252 253 254 254 251 245 243 250 253 251 244 242 246 246 245 249 248 242 245 248 252 250 252 252 252 252 251 240 248 188 149 131 125 124 116 160 164 216 158 104 123 161 165 228 238 247 246 243 241 180 148 110 95 185 127 128 154 171 119 142 186 197 233 246 241 241 242 248 248 250 251 252 249 247 244 248 252 253 251 253 252 251 253 252 249 237 244 248 248 249 253 252 249 249 250 249 244 245 249 252 251 228 179 131 134 152 153 145 141 130 132 153 174 179 180 180 170 165 166 148 136 118 100 84 76 67 63 64 64 62 62 63 63 61 64 79 82 88 95 99 102 108 113 122 125 130 132 134 138 142 146 150 151 154 160 165 167 168 171 171 172 168 164 159 161 163 169 172 153 141 171 179 193 204 211 233 237 235 232 243 247 237 237 237 242 235 240 237 239 235 231 233 231 238 236 234 239 242 246 248 244 240 250 245 243 239 249 250 248 249 246 247 245 244 240 239 236 243 239 237 252 248 241 245 246 242 239 249 247 243 243 247 250 246 245 240 233 245 250 242 241 248 248 242 240 236 240 234 239 240 241 239 237 247 240 244 249 251 249 250 247 248 251 249 243 244 254 253 253 251 249 245 242 246 247 249 247 246 248 245 241 246 244 247 249 251 251 253 251 252 251 252 249 243 243 244 249 248 241 246 249 250 247 248 249 252 215 147 139 150 132 133 142 180 160 183 188 197 218 243 246 244 230 162 122 162 145 144 127 149 174 200 241 250 248 229 188 149 145 190 203 210 207 240 250 251 243 247 245 246 242 244 242 192 179 203 210 216 222 227 233 207 186 182 193 231 251 245 245 249 252 248 250 242 246 249 247 245 245 248 253 248 249 246 245 242 245 250 250 250 252 252 250 252 253 250 247 245 245 248 243 249 252 252 251 250 250 249 252 252 251 251 250 249 251 252 247 249 254 254 254 254 255 252 246 250 248 249 251 248 253 253 252 254 255 253 252 252 251 249 247 254 255 255 250 248 245 250 249 249 252 254 255 255 255 252 252 253 251 248 251 253 253 248 248 251 252 254 254 254 254 250 246 254 254 253 255 255 254 254 253 252 254 254 253 252 249 251 254 253 252 252 249 250 251 254 253 253 254 255 252 254 253 254 254 255 255 254 252 254 254 254 252 254 255 253 253 251 248 243 245 248 248 245 248 250 250 247 251 253 252 254 253 249 253 253 251 249 253 251 248 174 148 126 126 122 124 165 172 213 162 106 123 152 161 224 238 244 249 233 230 174 149 110 101 152 106 134 154 184 110 135 186 199 232 248 250 246 245 244 245 251 251 251 250 252 249 248 251 249 248 253 252 251 253 254 250 246 248 245 245 251 252 250 247 247 246 250 252 250 250 251 249 252 251 213 159 131 129 129 131 129 138 149 145 156 158 161 157 163 162 161 162 169 172 174 144 137 137 119 102 88 83 74 68 62 60 74 74 76 78 86 85 93 98 108 110 115 118 122 126 130 135 136 140 144 149 155 157 159 163 164 166 168 169 170 170 168 163 157 151 148 153 159 169 185 200 217 227 242 239 245 250 245 243 240 232 233 237 241 242 228 230 232 228 237 236 239 239 246 248 250 242 243 249 245 249 249 246 244 249 246 244 250 245 237 238 240 245 247 243 247 252 234 236 241 239 238 239 245 245 243 237 243 250 247 246 242 234 242 246 249 244 248 246 229 230 228 221 219 230 234 236 243 236 244 239 241 249 250 248 244 242 248 253 253 249 244 248 253 248 243 246 246 247 248 248 247 249 248 252 247 240 243 240 243 247 249 249 246 248 252 251 253 253 252 247 249 249 246 241 243 249 246 244 242 243 244 202 148 139 150 132 136 143 185 211 242 238 244 242 246 244 247 246 228 156 162 147 144 128 151 179 204 245 250 248 236 201 160 139 179 196 213 198 237 248 252 243 246 246 241 242 245 251 205 181 194 206 214 221 226 230 191 195 211 230 245 252 247 251 248 250 250 247 248 248 247 240 241 244 247 252 252 250 250 251 245 250 252 253 251 250 251 248 249 249 250 248 250 244 249 248 251 251 249 247 252 247 246 250 252 248 246 249 251 253 250 245 248 253 254 252 250 254 253 251 248 251 253 252 249 251 251 249 250 255 253 250 250 250 249 250 254 255 254 250 249 252 254 253 255 254 254 255 255 255 253 253 252 252 251 249 252 254 253 253 254 255 254 254 254 254 250 250 253 253 253 252 255 255 254 254 254 255 254 253 252 252 254 255 253 250 251 248 248 247 253 250 252 251 251 251 252 252 252 255 255 255 254 254 254 254 253 248 254 253 252 253 250 246 246 243 246 249 249 249 249 248 250 251 252 253 253 253 253 252 254 253 253 254 253 244 168 146 128 126 121 129 165 182 209 170 106 126 144 147 222 242 249 246 219 222 168 151 106 109 126 96 139 158 186 108 132 190 193 228 246 247 251 249 244 244 251 252 253 249 252 253 250 253 253 253 254 253 252 254 253 248 248 253 251 247 250 250 253 252 250 249 250 249 253 254 251 251 248 251 250 239 206 175 139 127 123 123 126 129 131 133 139 144 151 146 138 136 134 138 141 143 148 163 168 168 159 161 150 134 114 97 63 63 64 64 72 73 78 85 85 86 91 97 104 109 115 118 124 128 130 134 140 140 143 145 151 152 157 159 162 166 168 169 171 168 167 164 161 156 153 153 166 181 205 211 223 236 235 242 238 234 236 236 240 239 237 242 235 241 237 242 247 244 248 244 245 246 241 241 240 245 243 244 245 248 242 243 247 243 243 244 247 239 252 243 245 251 244 242 246 241 240 235 246 249 243 236 242 250 247 245 240 238 243 248 241 238 246 239 226 221 216 212 211 214 220 219 235 239 237 236 249 249 244 248 244 245 247 246 253 247 249 252 252 250 246 247 245 244 248 248 244 245 239 246 245 234 234 233 237 242 247 250 248 248 245 245 248 251 248 246 249 247 245 239 246 245 248 248 241 240 243 195 147 137 153 129 138 140 196 238 243 245 246 245 244 242 242 240 242 173 164 150 138 129 154 181 203 241 250 247 248 221 171 145 162 189 207 194 229 250 248 247 241 243 244 246 246 245 215 186 183 204 214 218 224 229 232 225 245 244 248 250 249 248 246 244 248 251 250 252 249 250 253 250 252 252 250 247 250 253 247 250 254 248 245 247 252 252 251 249 251 251 250 246 250 249 248 245 248 246 250 251 244 246 250 249 248 251 250 252 253 251 251 252 253 248 248 250 252 251 249 253 253 251 250 250 250 250 250 250 253 252 252 254 255 254 254 253 254 252 252 255 254 255 255 254 254 254 255 255 254 255 254 255 252 249 252 252 255 255 255 255 254 254 255 255 250 248 254 255 254 252 252 250 250 250 252 254 254 254 254 254 255 253 252 250 250 251 252 253 251 246 251 252 251 246 251 255 254 255 254 253 255 255 255 255 255 253 254 253 255 254 254 252 252 247 239 244 254 248 248 248 252 248 245 248 253 254 252 245 247 247 252 253 253 235 158 142 129 127 118 136 162 190 196 173 109 131 140 157 229 234 250 238 230 229 159 148 102 119 106 91 144 158 180 105 131 188 192 222 246 243 249 245 241 250 247 245 250 252 252 253 251 251 251 254 252 252 250 253 254 253 249 251 253 251 249 252 252 254 250 251 249 243 248 252 252 251 244 246 250 253 252 248 238 230 222 217 221 227 225 194 138 119 118 125 130 130 131 136 141 140 130 132 136 135 142 149 156 165 172 179 45 47 51 54 63 63 70 76 77 76 78 82 87 92 97 100 110 115 121 124 127 128 133 134 137 139 143 148 150 155 158 162 165 164 167 169 173 173 168 168 165 165 163 162 169 177 193 211 222 231 242 241 241 244 240 242 240 246 242 241 239 243 242 244 247 245 243 246 245 246 246 242 244 249 244 246 241 239 239 247 245 245 250 243 243 247 248 246 249 246 244 241 245 248 247 243 243 246 249 249 239 246 247 248 236 235 242 233 222 224 221 215 219 220 222 227 233 245 245 242 249 248 245 243 246 245 244 240 244 241 250 249 247 248 243 242 245 244 241 237 239 245 241 248 250 242 238 239 240 242 242 245 245 245 241 242 248 253 247 242 245 249 247 241 251 245 249 250 248 244 246 193 150 138 150 128 139 142 203 242 249 246 242 242 249 247 247 241 238 168 163 145 141 131 158 186 207 236 244 249 247 236 179 155 149 187 204 202 213 245 243 243 244 246 247 249 247 249 227 192 179 198 211 213 223 229 235 227 246 247 248 252 250 248 249 248 250 251 252 248 250 252 250 248 247 250 252 247 247 252 249 250 251 249 248 252 253 252 250 249 250 250 250 250 252 252 248 249 253 253 252 246 244 247 250 253 252 253 254 254 252 249 251 252 251 250 246 244 246 249 252 252 251 250 252 252 253 251 251 251 251 253 252 253 252 254 253 252 254 254 254 254 254 251 253 255 253 250 255 255 254 254 252 250 248 252 254 252 254 254 254 253 254 255 254 255 253 252 253 254 254 248 247 249 251 251 250 250 249 252 255 255 255 253 253 252 252 252 251 251 250 251 252 251 252 251 250 252 255 254 255 254 255 254 254 254 255 254 255 254 255 253 252 252 251 251 246 247 254 253 251 240 239 239 244 246 251 251 247 245 247 250 252 252 250 226 154 141 131 126 113 143 166 196 190 160 115 130 158 134 247 232 242 220 237 231 156 145 107 120 100 85 150 160 174 104 126 187 185 220 250 243 247 244 243 248 249 248 248 249 251 253 250 250 250 252 251 253 253 249 252 254 252 254 253 253 247 244 248 252 251 247 247 246 244 249 253 252 247 246 250 249 250 249 245 247 250 246 240 241 249 251 230 185 125 110 111 111 110 115 119 125 123 127 139 136 136 137 136 135 139 143 30 32 36 38 42 45 51 57 64 67 71 75 77 79 83 82 85 90 96 100 105 110 115 118 120 122 125 129 133 138 141 159 149 151 153 158 162 163 166 169 172 172 183 175 171 169 167 166 168 170 179 188 204 214 224 234 242 243 242 240 245 241 244 241 242 240 244 244 248 249 249 245 249 248 247 245 238 239 240 240 244 246 246 244 232 235 239 243 246 248 245 244 248 247 242 236 243 244 238 247 248 244 240 244 240 235 233 226 233 230 227 225 233 235 233 234 231 240 238 234 241 246 242 245 247 241 242 246 241 245 247 246 244 240 239 243 245 239 238 236 240 246 244 250 251 245 244 240 244 243 245 247 249 248 240 239 238 243 249 242 243 246 246 248 254 252 251 249 246 247 246 185 153 138 151 131 140 143 206 238 243 243 242 242 247 248 250 252 238 164 162 142 139 135 165 190 211 238 249 253 249 251 201 163 144 179 199 208 197 234 244 243 242 239 241 246 249 250 243 208 180 194 210 212 221 229 233 245 248 245 247 250 251 251 251 248 247 252 253 250 252 253 254 251 248 248 252 252 252 253 253 250 249 251 248 243 246 252 251 253 247 246 249 252 253 251 247 254 254 253 253 252 251 252 252 254 253 255 253 252 251 247 250 251 248 247 250 247 247 246 250 252 252 251 253 250 249 246 249 252 253 254 249 251 253 254 252 248 251 253 254 255 254 253 252 248 248 252 251 253 255 254 250 253 246 250 252 253 255 255 254 254 253 254 255 255 254 253 250 254 254 252 248 250 247 240 241 247 248 248 253 253 255 255 254 253 252 251 253 252 247 253 255 254 254 253 255 254 255 255 255 255 254 252 254 254 253 253 255 255 253 252 252 255 250 249 249 252 248 245 248 238 234 238 242 241 247 250 249 248 241 247 248 246 250 221 149 141 136 123 117 151 166 199 199 183 123 119 180 91 174 218 238 229 205 196 154 144 108 121 93 89 155 169 162 103 125 195 180 213 247 239 242 243 251 248 247 247 251 249 251 252 254 255 253 252 250 252 251 252 250 252 252 253 254 254 251 249 251 252 253 252 248 245 247 251 253 252 251 250 251 250 250 250 251 248 251 253 250 246 247 252 251 252 233 198 159 139 123 118 111 107 108 111 114 115 119 119 125 132 136 136 28 28 30 31 32 35 38 44 48 52 60 62 65 70 72 75 78 78 80 84 88 91 93 96 101 105 111 114 119 126 131 135 137 141 146 148 150 154 155 160 164 168 183 175 173 174 176 175 176 173 168 167 168 168 171 178 191 201 216 223 234 237 243 246 239 231 235 246 252 247 248 251 245 245 246 246 243 238 238 231 239 246 241 239 233 234 240 243 244 249 243 242 246 247 239 240 250 247 246 245 242 243 246 246 241 241 237 234 236 236 236 239 235 239 236 238 243 242 240 241 241 246 248 248 243 238 234 237 239 244 246 244 246 245 245 250 248 244 247 245 246 244 242 246 242 241 245 245 247 248 245 248 254 251 241 245 247 242 238 245 244 244 246 245 249 253 254 253 251 246 244 180 153 135 157 127 144 145 209 238 240 245 242 243 248 252 254 254 235 159 158 148 134 136 167 192 216 250 254 251 248 251 222 170 147 169 199 207 198 224 241 241 245 243 243 244 250 246 246 224 186 187 212 211 219 226 232 243 244 246 247 247 251 251 250 248 247 251 251 251 247 249 250 249 251 251 247 250 249 250 251 246 246 250 247 245 249 250 249 253 251 248 246 252 253 254 251 250 253 252 251 253 252 251 251 253 252 253 252 251 251 248 254 252 245 243 252 250 251 251 251 253 251 250 254 253 251 248 251 249 247 251 248 247 251 253 254 254 251 252 254 255 255 253 253 252 250 251 251 252 255 255 253 254 250 253 251 252 255 255 255 255 254 253 254 253 253 249 250 251 249 249 246 242 243 247 243 246 249 251 245 249 251 249 246 251 246 246 251 253 250 252 255 254 252 252 254 255 254 254 253 255 255 253 255 255 254 254 255 254 254 254 254 254 249 250 252 252 244 236 244 239 243 249 247 250 251 247 252 252 246 247 249 251 251 211 147 144 135 123 118 159 163 202 200 192 132 117 192 92 89 114 194 237 153 174 152 141 107 123 93 90 158 176 157 103 123 190 181 212 251 247 245 248 252 252 247 245 248 252 251 250 252 255 254 253 253 252 251 254 250 254 253 252 254 254 253 252 252 252 249 248 248 251 251 252 249 246 251 249 250 252 252 248 250 253 253 253 254 254 253 252 249 248 251 251 242 230 215 204 181 164 143 127 115 109 106 106 111 113 118 119 27 26 27 28 29 30 32 34 38 41 45 48 50 53 55 56 60 62 65 69 74 76 81 81 82 83 84 85 91 96 107 113 117 120 126 127 132 133 140 144 149 151 155 158 159 161 164 167 171 172 173 174 173 175 175 171 169 167 167 167 167 174 186 195 205 210 218 224 234 243 241 237 239 248 249 241 229 232 231 233 239 231 240 243 232 232 246 248 247 243 243 243 241 245 248 243 235 233 244 244 245 248 241 241 239 241 247 248 243 245 247 246 239 238 235 238 243 240 251 244 245 246 234 236 240 237 246 245 248 248 246 247 242 244 248 237 241 241 246 243 247 248 244 239 243 251 244 246 248 252 249 249 249 247 249 245 242 241 243 245 239 238 247 247 246 252 251 253 250 251 247 179 152 135 157 126 143 148 211 242 238 242 245 245 244 247 249 249 227 155 157 149 132 138 170 194 223 248 251 253 253 253 239 184 152 157 192 204 204 208 240 245 249 246 243 245 248 238 235 229 193 182 203 208 217 222 227 237 250 249 247 248 246 244 245 247 245 248 250 252 250 249 249 250 253 253 253 252 251 245 246 248 250 249 242 247 248 252 251 251 248 243 244 249 251 252 254 253 253 250 248 252 248 248 252 254 253 251 251 251 252 250 253 252 248 244 248 252 251 252 253 250 250 253 253 251 253 254 253 252 251 253 246 248 251 254 255 252 252 253 254 255 255 254 254 254 253 253 252 254 255 253 253 253 253 254 255 255 254 254 253 253 253 251 254 254 254 254 252 250 251 249 251 247 237 239 238 244 250 247 246 246 246 243 244 249 238 242 250 252 254 254 253 251 250 252 252 254 251 252 251 254 255 255 255 253 249 251 251 244 248 254 255 253 250 245 246 247 241 249 250 250 244 240 248 249 246 247 254 252 249 249 247 247 249 199 147 146 127 120 120 171 164 208 202 192 142 116 197 103 75 75 138 210 104 172 147 143 113 123 92 94 152 183 146 104 122 183 182 210 251 250 251 249 251 252 248 247 248 249 254 253 253 254 254 254 252 252 255 255 248 249 252 252 253 251 247 247 250 252 247 242 242 249 253 253 248 245 249 250 250 247 251 251 251 250 252 249 251 254 254 251 251 251 250 252 252 250 248 250 250 249 245 237 224 205 184 164 142 131 117 113 26 24 25 27 29 29 32 34 36 37 42 43 44 46 47 47 47 50 52 55 60 63 68 70 73 75 77 78 81 80 87 90 90 90 95 101 111 115 119 126 134 137 145 146 147 150 152 154 159 163 166 169 168 169 174 174 176 176 178 176 176 171 169 169 167 168 171 174 182 201 210 215 222 232 240 240 236 237 231 236 246 237 241 249 239 241 242 243 248 242 249 249 238 243 240 239 239 245 239 241 242 243 240 240 241 246 248 249 244 243 250 246 241 241 238 243 239 243 249 246 249 247 239 228 235 244 241 238 245 246 244 249 242 245 250 242 245 244 244 248 244 246 242 239 241 246 247 250 252 252 246 251 248 248 247 242 239 234 239 243 243 243 244 247 245 243 244 247 251 252 244 174 154 138 153 128 149 152 217 242 237 247 247 248 249 246 245 246 221 153 154 149 130 142 170 193 229 248 250 249 252 252 248 202 159 152 185 198 207 201 237 245 243 242 248 250 247 243 229 227 203 186 192 206 216 219 223 230 248 249 251 251 251 251 251 252 251 246 249 251 249 245 249 252 254 255 252 250 251 250 249 248 246 251 252 249 250 253 249 251 251 250 249 245 246 250 254 254 254 252 253 255 253 254 254 253 253 252 250 251 253 255 253 252 247 250 247 249 252 251 252 252 251 253 252 251 255 255 254 253 250 252 245 250 253 253 255 252 252 253 255 254 254 254 253 254 255 252 248 251 253 252 252 253 253 253 255 254 254 253 252 253 250 252 255 255 253 251 252 249 251 251 254 248 237 236 236 243 249 247 252 251 251 250 252 252 249 252 249 250 253 253 251 251 253 254 253 254 254 252 253 254 254 255 255 254 251 252 252 244 249 253 252 254 252 250 247 240 247 250 253 250 245 241 251 250 247 249 252 251 251 247 246 247 246 192 144 152 123 120 126 173 167 212 201 193 149 120 194 109 72 73 175 186 99 172 148 145 114 121 89 102 150 188 144 103 118 180 185 209 247 248 249 251 251 248 252 248 250 251 255 254 254 254 254 254 253 254 252 252 251 250 250 248 250 250 249 250 253 254 252 247 243 252 253 253 253 252 250 249 249 248 247 251 251 251 250 248 250 253 254 254 253 253 248 252 249 244 249 251 251 253 250 244 244 243 245 240 231 222 206 196 27 25 26 25 26 27 30 32 33 34 37 40 40 42 42 43 41 41 44 45 48 52 52 54 55 58 60 63 63 65 70 72 77 80 81 80 78 80 89 93 101 109 115 124 134 140 137 136 140 144 150 155 155 158 160 164 165 166 169 171 174 174 177 178 178 176 178 176 173 169 165 163 164 173 186 195 202 206 215 231 241 227 227 228 229 238 246 251 243 246 247 245 249 245 235 241 242 244 245 242 246 247 246 249 242 242 248 247 247 242 249 243 241 244 239 243 235 245 247 250 240 231 235 231 230 246 244 242 244 245 243 249 240 243 245 244 241 246 248 249 245 244 244 241 243 247 246 248 244 245 235 238 234 230 237 242 238 240 235 234 243 238 239 248 241 242 244 247 248 244 238 166 157 139 149 124 153 153 221 241 241 242 242 244 249 248 245 252 219 156 153 161 129 144 174 194 234 251 248 244 245 238 249 219 167 153 171 196 209 196 230 247 239 238 249 247 241 232 217 208 220 189 181 201 212 220 224 224 247 253 250 248 245 244 249 248 251 251 251 249 249 246 248 253 251 249 248 251 252 254 251 251 251 254 253 250 246 242 245 250 249 252 248 252 249 251 251 253 253 251 250 251 254 255 254 253 253 252 252 253 254 254 250 252 254 253 249 250 253 250 247 251 251 252 254 253 252 253 255 253 251 253 250 248 253 253 252 254 254 254 254 254 254 255 255 255 252 253 253 254 251 250 252 249 253 255 255 255 255 255 254 253 253 254 253 245 245 249 253 252 251 254 253 250 248 252 249 251 253 252 254 252 253 254 253 252 249 248 247 248 253 252 250 252 254 255 254 254 250 248 244 249 253 254 255 254 254 253 250 249 250 253 246 243 247 249 247 245 249 253 250 248 245 243 249 245 247 244 244 243 242 243 248 252 243 186 145 143 120 116 135 177 175 212 202 188 155 125 199 119 68 82 211 182 143 179 136 181 130 117 89 107 157 194 136 105 112 179 187 205 251 250 248 252 252 251 250 250 248 251 253 251 251 249 251 252 251 251 250 250 253 252 252 250 250 251 251 250 251 253 253 252 247 251 253 251 251 253 253 248 253 252 240 246 252 253 252 252 253 254 253 254 252 251 248 251 254 253 253 254 252 254 253 248 247 245 246 249 250 248 248 248 24 23 24 25 26 27 27 29 33 32 34 38 38 39 43 42 39 39 42 41 45 47 48 48 48 50 48 49 52 52 56 58 63 64 67 69 65 69 76 77 82 85 90 93 107 122 122 114 120 123 133 140 142 145 149 149 149 151 155 157 163 164 168 172 174 171 176 179 178 179 180 179 177 178 178 176 171 170 171 176 183 179 183 194 204 212 228 238 241 245 245 245 241 226 229 241 239 237 244 245 246 244 242 247 245 243 247 243 241 239 238 240 241 242 244 246 242 248 242 238 236 235 235 232 237 245 245 246 242 248 247 248 241 241 250 245 238 245 245 249 250 248 249 248 248 249 242 241 241 239 244 249 242 237 238 241 235 236 240 242 247 247 245 249 249 251 250 250 243 241 235 161 155 138 147 125 155 157 221 244 246 246 249 250 251 251 243 250 207 154 152 164 127 148 179 195 237 250 249 238 238 236 246 237 174 155 161 189 207 198 218 245 237 238 245 247 241 240 237 232 231 198 177 196 212 218 222 224 238 253 252 251 246 247 252 254 254 252 250 252 252 250 250 250 242 243 248 249 251 253 252 248 251 252 253 252 246 243 244 250 251 250 248 252 249 252 254 254 253 252 254 254 254 254 254 253 252 251 253 253 252 253 252 251 253 247 244 252 254 252 248 248 248 252 253 250 248 250 253 254 255 253 250 249 250 251 253 253 254 253 253 254 255 255 255 255 253 254 252 252 254 253 252 252 255 255 255 255 255 254 252 248 254 254 253 252 246 244 251 246 244 245 246 249 249 250 250 252 254 254 252 246 253 254 253 252 247 252 251 252 250 247 251 253 254 255 254 255 252 245 238 242 251 250 248 247 252 251 242 247 254 253 246 249 250 249 241 248 251 251 247 239 233 228 241 241 235 230 238 245 240 240 246 252 237 178 147 138 122 114 145 173 181 220 206 198 159 132 202 141 64 109 211 155 149 181 134 156 126 115 94 113 156 196 137 105 115 177 192 204 250 252 251 251 252 252 252 250 251 251 251 250 249 249 250 251 251 248 252 250 251 252 253 252 253 252 251 252 254 254 253 254 253 250 250 246 250 252 253 251 251 248 244 246 249 251 252 252 252 254 253 253 250 252 255 251 254 253 249 252 252 250 252 252 251 251 251 252 251 251 250 246 25 24 24 25 24 24 26 27 29 30 33 35 37 38 40 41 40 40 40 40 42 44 43 43 44 46 44 44 46 45 46 48 48 48 50 52 53 55 58 61 65 68 71 75 77 84 88 86 84 86 92 97 104 109 116 122 124 126 136 142 146 149 154 164 164 158 164 166 173 171 170 171 176 181 183 182 185 185 181 181 181 178 173 170 169 170 171 176 184 196 203 209 213 211 223 236 235 236 236 242 239 240 241 243 246 243 246 247 240 238 240 238 242 241 236 237 245 247 238 242 237 233 227 224 232 231 230 228 240 247 252 252 244 241 246 245 241 239 239 246 248 246 251 253 254 253 248 246 245 241 240 245 238 235 242 244 241 241 244 243 248 251 252 249 249 249 247 244 236 238 232 156 150 136 141 129 157 158 220 236 246 250 248 245 246 247 243 249 198 155 148 167 124 150 179 198 237 239 243 243 246 245 246 250 192 162 151 173 203 213 203 234 244 244 246 243 254 243 231 235 240 213 180 181 209 215 223 226 230 251 251 250 251 252 254 253 254 247 251 249 250 253 248 250 253 251 250 252 252 252 253 252 252 251 247 250 251 241 243 247 249 252 251 250 252 252 254 251 251 251 252 252 253 253 254 253 251 249 253 255 253 253 254 254 254 254 249 252 255 254 251 250 252 253 252 250 250 251 252 253 252 252 249 250 253 253 250 252 254 252 254 254 254 254 251 251 253 255 254 254 255 255 255 255 255 254 255 255 255 255 253 252 251 253 253 251 247 251 251 246 247 250 247 247 246 252 255 255 254 254 251 247 253 253 254 253 254 254 254 252 247 249 253 254 255 253 248 248 253 252 250 250 251 250 252 254 253 247 245 253 253 252 242 236 243 240 234 238 247 252 249 242 234 229 232 236 240 239 246 247 243 248 245 246 234 171 142 134 125 116 153 166 189 228 208 199 170 136 203 162 67 167 175 114 129 178 142 144 117 116 99 117 152 199 142 106 115 179 197 206 245 250 249 249 251 250 251 250 250 252 246 246 251 251 251 253 254 249 252 251 248 249 249 249 253 253 254 254 255 253 253 253 254 253 251 248 249 249 252 253 253 252 251 248 249 250 249 250 247 248 251 251 250 249 253 253 251 251 250 247 250 253 252 254 252 249 253 252 253 252 253 252 26 23 22 23 24 24 25 28 28 29 32 35 36 37 40 41 37 39 42 41 42 43 41 42 42 42 43 43 44 43 43 44 43 44 45 47 47 47 52 53 54 57 57 60 65 67 68 70 71 74 78 80 80 83 91 98 98 102 110 116 124 131 138 143 145 145 148 152 164 160 156 156 161 164 172 175 175 177 180 184 185 185 185 185 188 191 184 185 185 181 179 179 177 177 183 187 194 198 207 217 218 224 237 241 244 240 247 246 243 240 239 244 245 235 236 241 244 243 243 243 243 241 228 231 227 223 238 236 234 236 242 248 235 241 242 238 240 243 241 248 244 246 247 247 254 253 248 245 249 251 246 241 235 235 242 240 241 246 242 245 250 249 246 246 248 243 246 243 236 240 230 155 153 134 140 129 161 162 221 239 247 252 253 251 242 239 242 251 189 153 144 162 123 153 179 199 245 245 245 245 246 248 246 252 208 172 148 160 198 218 199 227 240 245 248 248 253 242 226 228 239 229 184 175 207 213 222 225 226 246 252 250 252 254 255 254 254 250 248 245 248 252 250 245 251 252 253 254 253 251 249 248 253 250 247 248 249 250 251 251 248 250 252 248 250 251 252 248 250 250 250 252 250 250 253 253 252 251 253 255 253 254 254 254 255 254 254 253 254 254 254 254 254 254 254 251 247 249 252 251 251 252 252 252 253 251 250 252 253 247 252 254 251 251 247 250 254 255 255 254 255 254 253 253 255 253 253 255 255 252 253 253 254 255 253 252 253 254 255 255 254 253 248 250 252 254 254 253 249 250 255 253 252 245 248 251 252 252 255 253 250 252 252 254 255 253 248 244 248 252 253 255 254 254 254 253 250 245 247 253 253 251 245 243 247 249 241 239 237 244 253 250 240 241 244 247 252 252 252 253 244 244 245 244 225 165 140 132 125 114 164 163 196 239 207 198 173 141 204 161 97 201 136 91 127 171 146 137 115 117 103 127 152 201 143 110 116 179 198 204 242 246 251 250 251 251 250 252 250 248 248 248 252 250 253 252 255 255 254 253 251 250 251 251 253 251 251 248 254 251 248 252 253 252 253 252 253 251 249 251 252 251 252 251 253 253 252 251 250 250 251 252 251 250 253 253 253 251 250 251 252 253 254 252 245 248 248 247 247 250 250 249 25 25 23 23 25 24 24 26 28 28 30 35 38 38 39 39 39 38 40 41 40 39 41 42 40 41 41 43 43 42 43 42 42 43 43 44 44 43 45 46 48 48 49 51 53 54 56 59 58 59 60 59 62 63 68 74 78 80 83 85 88 91 92 97 107 110 113 116 126 131 129 131 137 147 161 167 158 159 161 165 168 170 178 175 180 182 185 188 190 193 195 196 194 189 192 192 187 185 179 175 169 169 176 178 186 193 199 206 208 218 221 226 229 228 238 238 238 237 234 244 238 247 237 241 227 233 245 248 237 231 237 246 237 242 242 245 242 248 252 249 240 237 250 251 253 253 251 248 245 241 244 247 237 244 249 244 246 247 247 242 242 250 250 242 242 246 246 249 249 247 224 153 150 134 137 131 162 163 227 247 248 250 250 251 240 240 238 243 175 158 143 161 122 154 185 200 248 252 248 246 246 245 244 250 230 187 154 149 192 211 196 212 241 244 244 249 253 241 237 232 235 246 197 173 198 216 216 222 225 238 253 251 249 253 253 254 253 253 253 252 251 253 253 254 254 254 252 252 251 250 250 249 253 252 250 253 252 253 250 251 252 252 255 254 255 253 253 249 246 252 254 255 253 252 252 254 252 253 253 253 250 250 253 252 253 253 247 252 254 253 252 253 252 251 250 249 246 251 252 251 254 254 254 252 252 254 249 247 250 252 252 253 252 253 254 252 254 253 253 255 254 253 254 254 254 254 255 255 252 251 253 253 250 253 255 255 255 254 253 254 254 253 251 255 255 254 253 254 250 249 250 252 249 245 248 249 248 245 252 254 253 252 253 254 251 252 252 250 249 249 249 252 254 252 254 254 254 253 251 252 249 247 246 252 252 249 246 237 238 246 250 248 247 246 249 250 250 249 250 251 250 250 251 252 218 162 138 126 122 116 166 164 207 240 213 204 181 146 190 152 142 211 115 102 184 169 144 138 115 115 101 136 159 200 133 112 118 179 196 200 244 249 249 250 252 252 252 253 252 248 243 245 251 248 248 249 254 254 252 253 253 251 250 254 254 253 252 248 253 254 253 253 253 252 250 250 250 252 253 253 247 246 248 250 252 253 252 245 249 249 245 242 247 249 249 251 253 253 249 245 248 251 249 251 251 248 251 250 248 247 246 246 25 23 22 24 24 23 24 26 28 27 29 33 36 36 39 40 40 37 40 40 41 39 39 41 41 41 43 43 43 42 43 40 43 43 43 43 44 44 44 44 45 44 47 48 50 50 54 54 52 53 52 53 59 61 62 62 64 65 66 68 73 74 74 78 88 87 88 90 95 100 102 103 110 115 126 133 130 135 141 145 148 154 165 166 170 172 172 175 180 181 181 184 187 184 187 187 186 187 185 184 184 183 182 182 180 179 178 178 177 176 176 181 179 184 192 194 206 209 212 222 226 232 229 237 228 232 240 242 233 239 246 251 248 242 238 245 240 247 251 252 240 243 250 252 254 253 249 249 249 237 235 244 238 238 249 238 238 243 240 244 248 252 248 240 235 241 241 241 246 249 225 148 148 137 129 134 161 163 228 248 247 245 248 252 246 248 240 244 167 158 143 155 124 158 191 203 252 253 247 247 245 245 251 252 241 195 163 150 181 203 192 200 240 246 249 249 249 244 234 240 248 252 213 180 188 213 213 222 226 231 249 250 251 253 254 253 253 254 253 253 252 254 254 254 255 253 252 253 253 253 253 253 253 252 250 253 254 254 251 253 254 255 255 255 255 255 255 255 253 254 255 255 254 254 254 254 253 254 255 254 251 251 253 252 253 254 253 254 253 251 252 252 249 250 250 247 250 252 253 255 255 255 254 254 254 253 250 249 252 253 254 255 252 253 254 252 252 252 251 254 252 248 254 255 254 254 255 255 254 254 253 253 252 254 255 255 254 253 251 254 253 250 252 255 254 253 253 255 250 245 252 252 253 252 252 249 249 249 252 250 251 248 250 252 250 251 248 252 254 252 251 248 251 253 252 252 254 254 249 250 249 251 247 250 248 247 246 241 241 245 248 247 250 253 253 247 242 240 240 240 246 252 254 253 211 164 133 125 122 119 173 162 214 240 221 211 194 172 202 191 185 196 115 134 229 165 145 132 112 112 93 145 162 201 143 110 118 178 194 201 241 247 248 249 250 252 250 250 251 250 242 243 250 249 245 248 251 252 254 254 253 254 254 253 249 253 254 252 251 255 252 250 252 252 252 251 249 252 253 253 249 246 247 252 250 252 252 248 248 248 248 243 246 249 248 248 252 253 252 247 247 248 249 247 252 248 252 250 250 251 249 245 25 23 22 22 23 24 25 24 27 28 30 33 35 36 38 40 39 39 42 43 44 41 40 39 39 41 41 41 42 43 41 42 43 43 42 40 42 43 43 43 44 44 44 46 48 49 51 48 46 46 45 49 53 54 55 56 53 54 59 60 60 60 63 62 62 64 67 66 72 75 78 78 85 89 94 96 94 98 100 104 109 114 124 132 139 146 152 154 161 162 165 168 171 174 175 175 173 175 175 177 180 180 182 184 189 192 190 190 190 190 186 197 187 188 185 182 178 176 177 175 174 174 179 182 183 185 189 194 197 208 221 221 219 219 219 220 228 232 235 238 238 242 245 249 249 246 246 245 250 245 235 241 240 243 244 238 253 250 243 247 253 248 241 241 243 248 249 242 236 242 209 143 150 140 128 134 150 168 225 238 240 243 239 242 239 236 245 250 163 161 137 144 128 159 191 206 247 245 250 251 251 252 249 250 247 220 171 153 162 196 217 198 231 247 252 237 234 233 241 247 250 252 234 189 177 208 210 217 224 226 246 245 247 252 253 250 254 255 254 253 251 250 253 254 253 249 250 253 255 253 253 253 253 255 254 254 250 250 252 254 253 252 253 254 254 255 254 253 254 255 255 254 252 249 252 254 254 253 251 253 249 245 246 250 249 249 254 254 253 254 251 246 248 251 246 252 250 251 254 254 255 255 254 254 255 255 253 252 255 255 255 255 254 254 254 254 253 249 255 253 254 254 253 250 252 252 251 250 253 253 252 254 254 254 254 254 251 249 253 255 254 251 254 255 252 253 254 253 254 252 253 253 254 254 253 254 252 250 251 254 252 247 250 254 254 254 252 249 245 247 253 250 251 252 254 254 250 251 249 246 251 252 253 251 249 250 242 247 248 241 236 238 246 251 251 248 247 244 246 248 249 251 242 244 198 157 133 120 123 123 174 163 221 253 252 252 249 240 215 214 211 193 134 185 220 157 144 127 113 111 95 145 168 200 156 113 116 176 194 203 241 247 251 249 249 250 249 250 248 245 246 250 249 247 246 246 243 249 248 248 249 249 252 253 245 245 254 253 250 251 254 251 253 253 253 253 251 252 255 255 251 249 250 250 252 248 251 252 252 252 252 245 242 245 249 250 248 248 249 248 247 246 248 249 251 252 251 244 243 244 248 251 26 24 23 22 22 23 24 24 26 27 29 31 35 36 37 40 41 39 43 45 44 43 41 40 39 40 41 42 42 41 41 43 43 41 42 41 42 44 43 43 43 44 42 46 48 50 48 46 47 45 45 46 48 50 51 52 53 54 55 58 61 62 59 61 62 63 64 62 63 64 63 68 72 67 76 79 75 80 81 81 83 83 91 96 101 104 108 114 121 126 134 145 155 165 167 165 165 165 168 172 176 174 173 173 178 177 180 183 182 184 186 191 188 187 188 187 193 190 192 190 186 186 187 184 183 183 182 180 180 181 185 185 183 181 177 179 184 185 189 191 193 197 206 210 211 212 209 215 222 221 214 218 226 228 230 232 243 235 236 240 243 236 237 235 239 242 244 241 233 240 206 148 153 147 136 141 153 171 221 233 233 234 236 237 240 235 240 243 158 155 142 139 136 159 190 206 242 242 250 248 245 247 244 246 247 233 179 160 155 188 218 205 219 246 247 217 214 212 250 252 249 249 247 203 173 201 215 214 223 226 243 252 252 252 254 254 255 255 253 253 248 247 245 247 252 254 254 252 252 252 249 251 253 252 254 255 252 251 253 253 254 251 252 255 254 254 255 255 255 255 255 254 254 253 248 250 253 253 249 254 248 244 250 253 251 249 253 254 253 255 254 252 251 252 251 254 254 254 252 253 254 254 254 254 254 252 253 255 254 255 255 255 255 255 255 253 251 249 252 254 254 254 253 251 253 254 252 247 249 252 254 255 255 253 251 252 248 249 255 255 255 254 254 255 255 254 254 254 254 253 251 248 255 255 253 250 249 252 251 251 254 254 254 254 254 254 252 248 249 250 252 253 253 252 253 250 246 248 247 248 249 249 250 251 253 254 253 252 251 248 244 247 247 250 253 251 251 250 254 254 249 239 233 235 186 155 133 120 125 129 174 173 221 249 240 229 218 208 211 204 203 181 181 217 196 161 145 126 117 110 99 143 171 204 160 117 115 169 194 200 239 248 253 250 247 248 247 249 249 253 252 251 248 247 244 249 247 249 248 244 248 248 249 250 249 250 252 254 250 248 253 250 252 253 255 255 253 251 254 255 251 249 247 248 252 248 247 250 250 248 250 246 246 247 249 248 251 250 251 251 249 245 248 249 252 252 252 244 246 243 241 248 ================================================ FILE: thirdparty/LSD/doc/annotated.html ================================================ LSD: Annotated Index

LSD Data Structures

Here are the data structures with brief descriptions:
coorlistChained list of coordinates
image_char_sChar image data type
image_double_sDouble image data type
image_int_sInt image data type
ntuple_list_s'list of n-tuple' data type
pointA point (or pixel)
rectRectangle structure: line segment with width
rect_iterRectangle points iterator

Generated on Fri Dec 3 10:18:48 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/doxygen.css ================================================ H1 { text-align: center; font-family: Arial, Helvetica, sans-serif; } H2 { font-family: Geneva, Arial, Helvetica, sans-serif; } CAPTION { font-weight: bold } DIV.qindex { width: 100%; background-color: #eeeeff; border: 4px solid #eeeeff; text-align: center; margin-bottom: 2px } A.qindex { text-decoration: none; font-weight: bold; color: #0000ee } A.qindex:visited { text-decoration: none; font-weight: bold; color: #0000ee } A.qindex:hover { text-decoration: none; background-color: #ddddff } A.qindexHL { text-decoration: none; font-weight: bold; background-color: #6666cc; color: #ffffff } A.qindexHL:hover { text-decoration: none; background-color: #6666cc; color: #ffffff } A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff } A.el { text-decoration: none; font-weight: bold } A.elRef { font-weight: bold } A.code { text-decoration: none; font-weight: normal; color: #4444ee } A.codeRef { font-weight: normal; color: #4444ee } A:hover { text-decoration: none; background-color: #f2f2ff } DL.el { margin-left: -1cm } DIV.fragment { width: 98%; border: 1px solid #CCCCCC; background-color: #f5f5f5; padding-left: 4px; margin: 4px; } DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } TD.md { background-color: #f2f2ff; font-weight: bold; } TD.mdname1 { background-color: #f2f2ff; font-weight: bold; color: #602020; } TD.mdname { background-color: #f2f2ff; font-weight: bold; color: #602020; width: 600px; } DIV.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold } DIV.groupText { margin-left: 16px; font-style: italic; font-size: smaller } BODY { background: white; color: black; margin-right: 20px; margin-left: 20px; } TD.indexkey { background-color: #eeeeff; font-weight: bold; padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px } TD.indexvalue { background-color: #eeeeff; font-style: italic; padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px } TR.memlist { background-color: #f0f0f0; } P.formulaDsp { text-align: center; } IMG.formulaDsp { } IMG.formulaInl { vertical-align: middle; } SPAN.keyword { color: #008000 } SPAN.keywordtype { color: #604020 } SPAN.keywordflow { color: #e08000 } SPAN.comment { color: #800000 } SPAN.preprocessor { color: #806020 } SPAN.stringliteral { color: #002080 } SPAN.charliteral { color: #008080 } .mdTable { border: 1px solid #868686; background-color: #f2f2ff; } .mdRow { padding: 8px 20px; } .mdescLeft { font-size: smaller; font-family: Arial, Helvetica, sans-serif; background-color: #FAFAFA; padding-left: 8px; border-top: 1px none #E0E0E0; border-right: 1px none #E0E0E0; border-bottom: 1px none #E0E0E0; border-left: 1px none #E0E0E0; margin: 0px; } .mdescRight { font-size: smaller; font-family: Arial, Helvetica, sans-serif; font-style: italic; background-color: #FAFAFA; padding-left: 4px; border-top: 1px none #E0E0E0; border-right: 1px none #E0E0E0; border-bottom: 1px none #E0E0E0; border-left: 1px none #E0E0E0; margin: 0px; padding-bottom: 0px; padding-right: 8px; } .memItemLeft { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-family: Geneva, Arial, Helvetica, sans-serif; font-size: 12px; } .memItemRight { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-family: Geneva, Arial, Helvetica, sans-serif; font-size: 13px; } .search { color: #0000ee; font-weight: bold; } FORM.search { margin-bottom: 0px; margin-top: 0px; } INPUT.search { font-size: 75%; color: #000080; font-weight: normal; background-color: #eeeeff; } TD.tiny { font-size: 75%; } ================================================ FILE: thirdparty/LSD/doc/files.html ================================================ LSD: File Index

LSD File List

Here is a list of all files with brief descriptions:
lsd.c [code]LSD module code
lsd.h [code]LSD module header

Generated on Fri Dec 3 10:18:17 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/formula.repository ================================================ \form#0:\[ G(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2+y^2}{2\sigma^2}} \] \form#1:\[ G(x,y) = G(x) * G(y) \] \form#2:\[ G(x) = \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{x^2}{2\sigma^2}}. \] \form#3:\[ \Gamma(x) = \frac{ \sum_{n=0}^{N} q_n x^n }{ \Pi_{n=0}^{N} (x+n) } (x+5.5)^{x+0.5} e^{-(x+5.5)} \] \form#4:\[ \log\Gamma(x) = \log\left( \sum_{n=0}^{N} q_n x^n \right) + (x+0.5) \log(x+5.5) - (x+5.5) - \sum_{n=0}^{N} \log(x+n) \] \form#5:\[ \Gamma(x) = \sqrt{\frac{2\pi}{x}} \left( \frac{x}{e} \sqrt{ x\sinh(1/x) + \frac{1}{810x^6} } \right)^x \] \form#6:\[ \log\Gamma(x) = 0.5\log(2\pi) + (x-0.5)\log(x) - x + 0.5x\log\left( x\sinh(1/x) + \frac{1}{810x^6} \right). \] \form#7:\[ \mathrm{NFA} = NT \cdot B(n,k,p) \] \form#8:\[ B(n,k,p) = \sum_{j=k}^n \left(\begin{array}{c}n\\j\end{array}\right) p^{j} (1-p)^{n-j} \] \form#9:\[ \left(\begin{array}{c}n\\k\end{array}\right) = \frac{ \Gamma(n+1) }{ \Gamma(k+1) \cdot \Gamma(n-k+1) }. \] \form#10:\[ A = \left(\begin{array}{cc} Ixx & Ixy \\ Ixy & Iyy \\ \end{array}\right) \] ================================================ FILE: thirdparty/LSD/doc/functions.html ================================================ LSD: Compound Member Index

Here is a list of all struct and union fields with links to the structures/unions they belong to:


Generated on Fri Dec 3 10:18:48 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/functions_vars.html ================================================ LSD: Compound Member Index


Generated on Fri Dec 3 10:18:49 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/globals.html ================================================ LSD: File Member Index
a | d | e | f | g | i | l | m | n | r | t | u

Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:

- a -

- d -

- e -

- f -

- g -

- i -

- l -

- m -

- n -

- r -

- t -

- u -


Generated on Fri Dec 3 10:18:49 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/globals_defs.html ================================================ LSD: File Member Index


Generated on Fri Dec 3 10:18:49 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/globals_func.html ================================================ LSD: File Member Index
a | d | e | f | g | i | l | n | r

- a -

- d -

- e -

- f -

- g -

- i -

- l -

- n -

- r -


Generated on Fri Dec 3 10:18:49 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/globals_type.html ================================================ LSD: File Member Index


Generated on Fri Dec 3 10:18:49 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/graph_legend.dot ================================================ digraph G { edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; node [fontname="Helvetica",fontsize=10,shape=record]; Node9 [shape="box",label="Inherited",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",style="filled" fontcolor="white"]; Node10 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="Helvetica"]; Node10 [shape="box",label="PublicBase",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classPublicBase.html"]; Node11 -> Node10 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="Helvetica"]; Node11 [shape="box",label="Truncated",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="red",URL="$classTruncated.html"]; Node13 -> Node9 [dir=back,color="darkgreen",fontsize=10,style="solid",fontname="Helvetica"]; Node13 [shape="box",label="ProtectedBase",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classProtectedBase.html"]; Node14 -> Node9 [dir=back,color="firebrick4",fontsize=10,style="solid",fontname="Helvetica"]; Node14 [shape="box",label="PrivateBase",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classPrivateBase.html"]; Node15 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="Helvetica"]; Node15 [shape="box",label="Undocumented",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="grey75"]; Node16 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="Helvetica"]; Node16 [shape="box",label="Templ< int >",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classTempl.html"]; Node17 -> Node16 [dir=back,color="orange",fontsize=10,style="dashed",label="< int >",fontname="Helvetica"]; Node17 [shape="box",label="Templ< T >",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classTempl.html"]; Node18 -> Node9 [dir=back,color="darkorchid3",fontsize=10,style="dashed",label="m_usedClass",fontname="Helvetica"]; Node18 [shape="box",label="Used",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classUsed.html"]; } ================================================ FILE: thirdparty/LSD/doc/graph_legend.html ================================================ LSD: Graph Legend

Graph Legend

This page explains how to interpret the graphs that are generated by doxygen.

Consider the following example:

/*! Invisible class because of truncation */
class Invisible { };

/*! Truncated class, inheritance relation is hidden */
class Truncated : public Invisible { };

/* Class not documented with doxygen comments */
class Undocumented { };

/*! Class that is inherited using public inheritance */
class PublicBase : public Truncated { };

/*! A template class */
template<class T> class Templ { };

/*! Class that is inherited using protected inheritance */
class ProtectedBase { };

/*! Class that is inherited using private inheritance */
class PrivateBase { };

/*! Class that is used by the Inherited class */
class Used { };

/*! Super class that inherits a number of other classes */
class Inherited : public PublicBase,
                  protected ProtectedBase,
                  private PrivateBase,
                  public Undocumented
                  public Templ<int>
{
  private:
    Used *m_usedClass;
};
If the MAX_DOT_GRAPH_HEIGHT tag in the configuration file is set to 240 this will result in the following graph:

graph_legend.png

The boxes in the above graph have the following meaning:

  • A filled black box represents the struct or class for which the graph is generated.
  • A box with a black border denotes a documented struct or class.
  • A box with a grey border denotes an undocumented struct or class.
  • A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
The arrows have the following meaning:
  • A dark blue arrow is used to visualize a public inheritance relation between two classes.
  • A dark green arrow is used for protected inheritance.
  • A dark red arrow is used for private inheritance.
  • A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
  • A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.

Generated on Fri Dec 3 10:18:49 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/index.html ================================================ LSD: LSD code documentation

LSD code documentation

This is an implementation of the Line Segment Detector described in the paper:

"LSD: A Fast Line Segment Detector with a False Detection Control" by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel, and Gregory Randall, IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 32, no. 4, pp. 722-732, April, 2010.

and in more details in the CMLA Technical Report:

"LSD: A Line Segment Detector, Technical Report", by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel, Gregory Randall, CMLA, ENS Cachan, 2010.

The version implemented here includes some further improvements described on the LSD page at www.ipol.im. That same page includes more information, including this code and an online demo version:

http://www.ipol.im/pub/algo/gjmr_line_segment_detector

The module's main function is lsd().

The source code is contained in two files: lsd.h and lsd.c.

HISTORY:

  • version 1.5 - dic 2010: Changes in 'refine', -W option added, and more comments added.
  • version 1.4 - jul 2010: lsd_scale interface added and doxygen doc.
  • version 1.3 - feb 2010: Multiple bug correction and improved code.
  • version 1.2 - dic 2009: First full Ansi C Language version.
  • version 1.1 - sep 2009: Systematic subsampling to scale 0.8 and correction to partially handle"angle problem".
  • version 1.0 - jan 2009: First complete Megawave2 and Ansi C Language version.

Author:
rafael grompone von gioi (grompone@gmail.com)

Generated on Fri Dec 3 10:18:17 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/lsd_8c-source.html ================================================ LSD: lsd.c Source File

lsd.c

Go to the documentation of this file.
00001 /*----------------------------------------------------------------------------
00002 
00003   LSD - Line Segment Detector on digital images
00004 
00005   Copyright 2007-2010 rafael grompone von gioi (grompone@gmail.com)
00006 
00007   This program is free software: you can redistribute it and/or modify
00008   it under the terms of the GNU Affero General Public License as
00009   published by the Free Software Foundation, either version 3 of the
00010   License, or (at your option) any later version.
00011 
00012   This program is distributed in the hope that it will be useful,
00013   but WITHOUT ANY WARRANTY; without even the implied warranty of
00014   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00015   GNU Affero General Public License for more details.
00016 
00017   You should have received a copy of the GNU Affero General Public License
00018   along with this program. If not, see <http://www.gnu.org/licenses/>.
00019 
00020   ----------------------------------------------------------------------------*/
00021 
00022 /*----------------------------------------------------------------------------*/
00023 /** @file lsd.c
00024     LSD module code
00025     @author rafael grompone von gioi (grompone@gmail.com)
00026  */
00027 /*----------------------------------------------------------------------------*/
00028 
00029 /*----------------------------------------------------------------------------*/
00030 /** @mainpage LSD code documentation
00031 
00032     This is an implementation of the Line Segment Detector described
00033     in the paper:
00034 
00035       "LSD: A Fast Line Segment Detector with a False Detection Control"
00036       by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel,
00037       and Gregory Randall, IEEE Transactions on Pattern Analysis and
00038       Machine Intelligence, vol. 32, no. 4, pp. 722-732, April, 2010.
00039 
00040     and in more details in the CMLA Technical Report:
00041 
00042       "LSD: A Line Segment Detector, Technical Report",
00043       by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel,
00044       Gregory Randall, CMLA, ENS Cachan, 2010.
00045 
00046     The version implemented here includes some further improvements
00047     described on the LSD page at www.ipol.im. That same page includes
00048     more information, including this code and an online demo version:
00049 
00050       http://www.ipol.im/pub/algo/gjmr_line_segment_detector
00051 
00052     The module's main function is lsd().
00053 
00054     The source code is contained in two files: lsd.h and lsd.c.
00055 
00056     HISTORY:
00057     - version 1.5 - dic 2010: Changes in 'refine', -W option added,
00058                               and more comments added.
00059     - version 1.4 - jul 2010: lsd_scale interface added and doxygen doc.
00060     - version 1.3 - feb 2010: Multiple bug correction and improved code.
00061     - version 1.2 - dic 2009: First full Ansi C Language version.
00062     - version 1.1 - sep 2009: Systematic subsampling to scale 0.8 and
00063                               correction to partially handle"angle problem".
00064     - version 1.0 - jan 2009: First complete Megawave2 and Ansi C Language
00065                               version.
00066 
00067     @author rafael grompone von gioi (grompone@gmail.com)
00068  */
00069 /*----------------------------------------------------------------------------*/
00070 
00071 #include <stdio.h>
00072 #include <stdlib.h>
00073 #include <math.h>
00074 #include <limits.h>
00075 #include <float.h>
00076 #include "lsd.h"
00077 
00078 /** ln(10) */
00079 #ifndef M_LN10
00080 #define M_LN10 2.30258509299404568402
00081 #endif /* !M_LN10 */
00082 
00083 /** PI */
00084 #ifndef M_PI
00085 #define M_PI   3.14159265358979323846
00086 #endif /* !M_PI */
00087 
00088 #ifndef FALSE
00089 #define FALSE 0
00090 #endif /* !FALSE */
00091 
00092 #ifndef TRUE
00093 #define TRUE 1
00094 #endif /* !TRUE */
00095 
00096 /** Label for pixels with undefined gradient. */
00097 #define NOTDEF -1024.0
00098 
00099 /** 3/2 pi */
00100 #define M_3_2_PI 4.71238898038
00101 
00102 /** 2 pi */
00103 #define M_2__PI  6.28318530718
00104 
00105 /** Label for pixels not used in yet. */
00106 #define NOTUSED 0
00107 
00108 /** Label for pixels already used in detection. */
00109 #define USED    1
00110 
00111 /*----------------------------------------------------------------------------*/
00112 /** Chained list of coordinates.
00113  */
00114 struct coorlist
00115 {
00116   int x,y;
00117   struct coorlist * next;
00118 };
00119 
00120 /*----------------------------------------------------------------------------*/
00121 /** A point (or pixel).
00122  */
00123 struct point {int x,y;};
00124 
00125 
00126 /*----------------------------------------------------------------------------*/
00127 /*------------------------- Miscellaneous functions --------------------------*/
00128 /*----------------------------------------------------------------------------*/
00129 
00130 /*----------------------------------------------------------------------------*/
00131 /** Fatal error, print a message to standard-error output and exit.
00132  */
00133 static void error(char * msg)
00134 {
00135   fprintf(stderr,"LSD Error: %s\n",msg);
00136   exit(EXIT_FAILURE);
00137 }
00138 
00139 /*----------------------------------------------------------------------------*/
00140 /** Doubles relative error factor
00141  */
00142 #define RELATIVE_ERROR_FACTOR 100.0
00143 
00144 /*----------------------------------------------------------------------------*/
00145 /** Compare doubles by relative error.
00146 
00147     The resulting rounding error after floating point computations
00148     depend on the specific operations done. The same number computed by
00149     different algorithms could present different rounding errors. For a
00150     useful comparison, an estimation of the relative rounding error
00151     should be considered and compared to a factor times EPS. The factor
00152     should be related to the cumulated rounding error in the chain of
00153     computation. Here, as a simplification, a fixed factor is used.
00154  */
00155 static int double_equal(double a, double b)
00156 {
00157   double abs_diff,aa,bb,abs_max;
00158 
00159   /* trivial case */
00160   if( a == b ) return TRUE;
00161 
00162   abs_diff = fabs(a-b);
00163   aa = fabs(a);
00164   bb = fabs(b);
00165   abs_max = aa > bb ? aa : bb;
00166 
00167   /* DBL_MIN is the smallest normalized number, thus, the smallest
00168      number whose relative error is bounded by DBL_EPSILON. For
00169      smaller numbers, the same quantization steps as for DBL_MIN
00170      are used. Then, for smaller numbers, a meaningful "relative"
00171      error should be computed by dividing the difference by DBL_MIN. */
00172   if( abs_max < DBL_MIN ) abs_max = DBL_MIN;
00173 
00174   /* equal if relative error <= factor x eps */
00175   return (abs_diff / abs_max) <= (RELATIVE_ERROR_FACTOR * DBL_EPSILON);
00176 }
00177 
00178 /*----------------------------------------------------------------------------*/
00179 /** Computes Euclidean distance between point (x1,y1) and point (x2,y2).
00180  */
00181 static double dist(double x1, double y1, double x2, double y2)
00182 {
00183   return sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) );
00184 }
00185 
00186 
00187 /*----------------------------------------------------------------------------*/
00188 /*----------------------- 'list of n-tuple' data type ------------------------*/
00189 /*----------------------------------------------------------------------------*/
00190 
00191 /*----------------------------------------------------------------------------*/
00192 /** Free memory used in n-tuple 'in'.
00193  */
00194 void free_ntuple_list(ntuple_list in)
00195 {
00196   if( in == NULL || in->values == NULL )
00197     error("free_ntuple_list: invalid n-tuple input.");
00198   free( (void *) in->values );
00199   free( (void *) in );
00200 }
00201 
00202 /*----------------------------------------------------------------------------*/
00203 /** Create an n-tuple list and allocate memory for one element.
00204     @param dim the dimension (n) of the n-tuple.
00205  */
00206 ntuple_list new_ntuple_list(unsigned int dim)
00207 {
00208   ntuple_list n_tuple;
00209 
00210   /* check parameters */
00211   if( dim == 0 ) error("new_ntuple_list: 'dim' must be positive.");
00212 
00213   /* get memory for list structure */
00214   n_tuple = (ntuple_list) malloc( sizeof(struct ntuple_list_s) );
00215   if( n_tuple == NULL ) error("not enough memory.");
00216 
00217   /* initialize list */
00218   n_tuple->size = 0;
00219   n_tuple->max_size = 1;
00220   n_tuple->dim = dim;
00221 
00222   /* get memory for tuples */
00223   n_tuple->values = (double *) malloc( dim*n_tuple->max_size * sizeof(double) );
00224   if( n_tuple->values == NULL ) error("not enough memory.");
00225 
00226   return n_tuple;
00227 }
00228 
00229 /*----------------------------------------------------------------------------*/
00230 /** Enlarge the allocated memory of an n-tuple list.
00231  */
00232 static void enlarge_ntuple_list(ntuple_list n_tuple)
00233 {
00234   /* check parameters */
00235   if( n_tuple == NULL || n_tuple->values == NULL || n_tuple->max_size == 0 )
00236     error("enlarge_ntuple_list: invalid n-tuple.");
00237 
00238   /* duplicate number of tuples */
00239   n_tuple->max_size *= 2;
00240 
00241   /* realloc memory */
00242   n_tuple->values = (double *) realloc( (void *) n_tuple->values,
00243                       n_tuple->dim * n_tuple->max_size * sizeof(double) );
00244   if( n_tuple->values == NULL ) error("not enough memory.");
00245 }
00246 
00247 /*----------------------------------------------------------------------------*/
00248 /** Add a 5-tuple to an n-tuple list.
00249  */
00250 static void add_5tuple( ntuple_list out, double v1, double v2,
00251                         double v3, double v4, double v5 )
00252 {
00253   /* check parameters */
00254   if( out == NULL ) error("add_5tuple: invalid n-tuple input.");
00255   if( out->dim != 5 ) error("add_5tuple: the n-tuple must be a 5-tuple.");
00256 
00257   /* if needed, alloc more tuples to 'out' */
00258   if( out->size == out->max_size ) enlarge_ntuple_list(out);
00259   if( out->values == NULL ) error("add_5tuple: invalid n-tuple input.");
00260 
00261   /* add new 5-tuple */
00262   out->values[ out->size * out->dim + 0 ] = v1;
00263   out->values[ out->size * out->dim + 1 ] = v2;
00264   out->values[ out->size * out->dim + 2 ] = v3;
00265   out->values[ out->size * out->dim + 3 ] = v4;
00266   out->values[ out->size * out->dim + 4 ] = v5;
00267 
00268   /* update number of tuples counter */
00269   out->size++;
00270 }
00271 
00272 
00273 /*----------------------------------------------------------------------------*/
00274 /*----------------------------- Image Data Types -----------------------------*/
00275 /*----------------------------------------------------------------------------*/
00276 
00277 /*----------------------------------------------------------------------------*/
00278 /** Free memory used in image_char 'i'.
00279  */
00280 void free_image_char(image_char i)
00281 {
00282   if( i == NULL || i->data == NULL )
00283     error("free_image_char: invalid input image.");
00284   free( (void *) i->data );
00285   free( (void *) i );
00286 }
00287 
00288 /*----------------------------------------------------------------------------*/
00289 /** Create a new image_char of size 'xsize' times 'ysize'.
00290  */
00291 image_char new_image_char(unsigned int xsize, unsigned int ysize)
00292 {
00293   image_char image;
00294 
00295   /* check parameters */
00296   if( xsize == 0 || ysize == 0 ) error("new_image_char: invalid image size.");
00297 
00298   /* get memory */
00299   image = (image_char) malloc( sizeof(struct image_char_s) );
00300   if( image == NULL ) error("not enough memory.");
00301   image->data = (unsigned char *) calloc( (size_t) (xsize*ysize),
00302                                           sizeof(unsigned char) );
00303   if( image->data == NULL ) error("not enough memory.");
00304 
00305   /* set image size */
00306   image->xsize = xsize;
00307   image->ysize = ysize;
00308 
00309   return image;
00310 }
00311 
00312 /*----------------------------------------------------------------------------*/
00313 /** Create a new image_char of size 'xsize' times 'ysize',
00314     initialized to the value 'fill_value'.
00315  */
00316 image_char new_image_char_ini( unsigned int xsize, unsigned int ysize,
00317                                unsigned char fill_value )
00318 {
00319   image_char image = new_image_char(xsize,ysize); /* create image */
00320   unsigned int N = xsize*ysize;
00321   unsigned int i;
00322 
00323   /* check parameters */
00324   if( image == NULL || image->data == NULL )
00325     error("new_image_char_ini: invalid image.");
00326 
00327   /* initialize */
00328   for(i=0; i<N; i++) image->data[i] = fill_value;
00329 
00330   return image;
00331 }
00332 
00333 /*----------------------------------------------------------------------------*/
00334 /** Free memory used in image_int 'i'.
00335  */
00336 void free_image_int(image_int i)
00337 {
00338   if( i == NULL || i->data == NULL )
00339     error("free_image_int: invalid input image.");
00340   free( (void *) i->data );
00341   free( (void *) i );
00342 }
00343 
00344 /*----------------------------------------------------------------------------*/
00345 /** Create a new image_int of size 'xsize' times 'ysize'.
00346  */
00347 image_int new_image_int(unsigned int xsize, unsigned int ysize)
00348 {
00349   image_int image;
00350 
00351   /* check parameters */
00352   if( xsize == 0 || ysize == 0 ) error("new_image_int: invalid image size.");
00353 
00354   /* get memory */
00355   image = (image_int) malloc( sizeof(struct image_int_s) );
00356   if( image == NULL ) error("not enough memory.");
00357   image->data = (int *) calloc( (size_t) (xsize*ysize), sizeof(int) );
00358   if( image->data == NULL ) error("not enough memory.");
00359 
00360   /* set image size */
00361   image->xsize = xsize;
00362   image->ysize = ysize;
00363 
00364   return image;
00365 }
00366 
00367 /*----------------------------------------------------------------------------*/
00368 /** Create a new image_int of size 'xsize' times 'ysize',
00369     initialized to the value 'fill_value'.
00370  */
00371 image_int new_image_int_ini( unsigned int xsize, unsigned int ysize,
00372                              int fill_value )
00373 {
00374   image_int image = new_image_int(xsize,ysize); /* create image */
00375   unsigned int N = xsize*ysize;
00376   unsigned int i;
00377 
00378   /* initialize */
00379   for(i=0; i<N; i++) image->data[i] = fill_value;
00380 
00381   return image;
00382 }
00383 
00384 /*----------------------------------------------------------------------------*/
00385 /** Free memory used in image_double 'i'.
00386  */
00387 void free_image_double(image_double i)
00388 {
00389   if( i == NULL || i->data == NULL )
00390     error("free_image_double: invalid input image.");
00391   free( (void *) i->data );
00392   free( (void *) i );
00393 }
00394 
00395 /*----------------------------------------------------------------------------*/
00396 /** Create a new image_double of size 'xsize' times 'ysize'.
00397  */
00398 image_double new_image_double(unsigned int xsize, unsigned int ysize)
00399 {
00400   image_double image;
00401 
00402   /* check parameters */
00403   if( xsize == 0 || ysize == 0 ) error("new_image_double: invalid image size.");
00404 
00405   /* get memory */
00406   image = (image_double) malloc( sizeof(struct image_double_s) );
00407   if( image == NULL ) error("not enough memory.");
00408   image->data = (double *) calloc( (size_t) (xsize*ysize), sizeof(double) );
00409   if( image->data == NULL ) error("not enough memory.");
00410 
00411   /* set image size */
00412   image->xsize = xsize;
00413   image->ysize = ysize;
00414 
00415   return image;
00416 }
00417 
00418 /*----------------------------------------------------------------------------*/
00419 /** Create a new image_double of size 'xsize' times 'ysize',
00420     initialized to the value 'fill_value'.
00421  */
00422 image_double new_image_double_ini( unsigned int xsize, unsigned int ysize,
00423                                    double fill_value )
00424 {
00425   image_double image = new_image_double(xsize,ysize); /* create image */
00426   unsigned int N = xsize*ysize;
00427   unsigned int i;
00428 
00429   /* initialize */
00430   for(i=0; i<N; i++) image->data[i] = fill_value;
00431 
00432   return image;
00433 }
00434 
00435 
00436 /*----------------------------------------------------------------------------*/
00437 /*----------------------------- Gaussian filter ------------------------------*/
00438 /*----------------------------------------------------------------------------*/
00439 
00440 /*----------------------------------------------------------------------------*/
00441 /** Compute a Gaussian kernel of length 'kernel->dim',
00442     standard deviation 'sigma', and centered at value 'mean'.
00443 
00444     For example, if mean=0.5, the Gaussian will be centered
00445     in the middle point between values 'kernel->values[0]'
00446     and 'kernel->values[1]'.
00447  */
00448 static void gaussian_kernel(ntuple_list kernel, double sigma, double mean)
00449 {
00450   double sum = 0.0;
00451   double val;
00452   unsigned int i;
00453 
00454   /* check parameters */
00455   if( kernel == NULL || kernel->values == NULL )
00456     error("gaussian_kernel: invalid n-tuple 'kernel'.");
00457   if( sigma <= 0.0 ) error("gaussian_kernel: 'sigma' must be positive.");
00458 
00459   /* compute Gaussian kernel */
00460   if( kernel->max_size < 1 ) enlarge_ntuple_list(kernel);
00461   kernel->size = 1;
00462   for(i=0;i<kernel->dim;i++)
00463     {
00464       val = ( (double) i - mean ) / sigma;
00465       kernel->values[i] = exp( -0.5 * val * val );
00466       sum += kernel->values[i];
00467     }
00468 
00469   /* normalization */
00470   if( sum >= 0.0 ) for(i=0;i<kernel->dim;i++) kernel->values[i] /= sum;
00471 }
00472 
00473 /*----------------------------------------------------------------------------*/
00474 /** Scale the input image 'in' by a factor 'scale' by Gaussian sub-sampling.
00475 
00476     For example, scale=0.8 will give a result at 80% of the original size.
00477 
00478     The image is convolved with a Gaussian kernel
00479     @f[
00480         G(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2+y^2}{2\sigma^2}}
00481     @f]
00482     before the sub-sampling to prevent aliasing.
00483 
00484     The standard deviation sigma given by:
00485     -  sigma = sigma_scale / scale,   if scale <  1.0
00486     -  sigma = sigma_scale,           if scale >= 1.0
00487 
00488     To be able to sub-sample at non-integer steps, some interpolation
00489     is needed. In this implementation, the interpolation is done by
00490     the Gaussian kernel, so both operations (filtering and sampling)
00491     are done at the same time. The Gaussian kernel is computed
00492     centered on the coordinates of the required sample. In this way,
00493     when applied, it gives directly the result of convolving the image
00494     with the kernel and interpolated to that particular position.
00495 
00496     A fast algorithm is done using the separability of the Gaussian
00497     kernel. Applying the 2D Gaussian kernel is equivalent to applying
00498     first a horizontal 1D Gaussian kernel and then a vertical 1D
00499     Gaussian kernel (or the other way round). The reason is that
00500     @f[
00501         G(x,y) = G(x) * G(y)
00502     @f]
00503     where
00504     @f[
00505         G(x) = \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{x^2}{2\sigma^2}}.
00506     @f]
00507     The algorithm first apply a combined Gaussian kernel and sampling
00508     in the x axis, and then the combined Gaussian kernel and sampling
00509     in the y axis.
00510  */
00511 static image_double gaussian_sampler( image_double in, double scale,
00512                                       double sigma_scale )
00513 {
00514   image_double aux,out;
00515   ntuple_list kernel;
00516   unsigned int N,M,h,n,x,y,i;
00517   int xc,yc,j,double_x_size,double_y_size;
00518   double sigma,xx,yy,sum,prec;
00519 
00520   /* check parameters */
00521   if( in == NULL || in->data == NULL || in->xsize == 0 || in->ysize == 0 )
00522     error("gaussian_sampler: invalid image.");
00523   if( scale <= 0.0 ) error("gaussian_sampler: 'scale' must be positive.");
00524   if( sigma_scale <= 0.0 )
00525     error("gaussian_sampler: 'sigma_scale' must be positive.");
00526 
00527   /* get memory for images */
00528   if( in->xsize * scale > (double) UINT_MAX ||
00529       in->ysize * scale > (double) UINT_MAX )
00530     error("gaussian_sampler: the output image size exceeds the handled size.");
00531   N = (unsigned int) floor( in->xsize * scale );
00532   M = (unsigned int) floor( in->ysize * scale );
00533   aux = new_image_double(N,in->ysize);
00534   out = new_image_double(N,M);
00535 
00536   /* sigma, kernel size and memory for the kernel */
00537   sigma = scale < 1.0 ? sigma_scale / scale : sigma_scale;
00538   /*
00539      The size of the kernel is selected to guarantee that the
00540      the first discarded term is at least 10^prec times smaller
00541      than the central value. For that, h should be larger than x, with
00542        e^(-x^2/2sigma^2) = 1/10^prec.
00543      Then,
00544        x = sigma * sqrt( 2 * prec * ln(10) ).
00545    */
00546   prec = 3.0;
00547   h = (unsigned int) ceil( sigma * sqrt( 2.0 * prec * log(10.0) ) );
00548   n = 1+2*h; /* kernel size */
00549   kernel = new_ntuple_list(n);
00550 
00551   /* auxiliary double image size variables */
00552   double_x_size = (int) (2 * in->xsize);
00553   double_y_size = (int) (2 * in->ysize);
00554 
00555   /* First subsampling: x axis */
00556   for(x=0;x<aux->xsize;x++)
00557     {
00558       /*
00559          x   is the coordinate in the new image.
00560          xx  is the corresponding x-value in the original size image.
00561          xc  is the integer value, the pixel coordinate of xx.
00562        */
00563       xx = (double) x / scale;
00564       /* coordinate (0.0,0.0) is in the center of pixel (0,0),
00565          so the pixel with xc=0 get the values of xx from -0.5 to 0.5 */
00566       xc = (int) floor( xx + 0.5 );
00567       gaussian_kernel( kernel, sigma, (double) h + xx - (double) xc );
00568       /* the kernel must be computed for each x because the fine
00569          offset xx-xc is different in each case */
00570 
00571       for(y=0;y<aux->ysize;y++)
00572         {
00573           sum = 0.0;
00574           for(i=0;i<kernel->dim;i++)
00575             {
00576               j = xc - h + i;
00577 
00578               /* symmetry boundary condition */
00579               while( j < 0 ) j += double_x_size;
00580               while( j >= double_x_size ) j -= double_x_size;
00581               if( j >= (int) in->xsize ) j = double_x_size-1-j;
00582 
00583               sum += in->data[ j + y * in->xsize ] * kernel->values[i];
00584             }
00585           aux->data[ x + y * aux->xsize ] = sum;
00586         }
00587     }
00588 
00589   /* Second subsampling: y axis */
00590   for(y=0;y<out->ysize;y++)
00591     {
00592       /*
00593          y   is the coordinate in the new image.
00594          yy  is the corresponding x-value in the original size image.
00595          yc  is the integer value, the pixel coordinate of xx.
00596        */
00597       yy = (double) y / scale;
00598       /* coordinate (0.0,0.0) is in the center of pixel (0,0),
00599          so the pixel with yc=0 get the values of yy from -0.5 to 0.5 */
00600       yc = (int) floor( yy + 0.5 );
00601       gaussian_kernel( kernel, sigma, (double) h + yy - (double) yc );
00602       /* the kernel must be computed for each y because the fine
00603          offset yy-yc is different in each case */
00604 
00605       for(x=0;x<out->xsize;x++)
00606         {
00607           sum = 0.0;
00608           for(i=0;i<kernel->dim;i++)
00609             {
00610               j = yc - h + i;
00611 
00612               /* symmetry boundary condition */
00613               while( j < 0 ) j += double_y_size;
00614               while( j >= double_y_size ) j -= double_y_size;
00615               if( j >= (int) in->ysize ) j = double_y_size-1-j;
00616 
00617               sum += aux->data[ x + j * aux->xsize ] * kernel->values[i];
00618             }
00619           out->data[ x + y * out->xsize ] = sum;
00620         }
00621     }
00622 
00623   /* free memory */
00624   free_ntuple_list(kernel);
00625   free_image_double(aux);
00626 
00627   return out;
00628 }
00629 
00630 
00631 /*----------------------------------------------------------------------------*/
00632 /*--------------------------------- Gradient ---------------------------------*/
00633 /*----------------------------------------------------------------------------*/
00634 
00635 /*----------------------------------------------------------------------------*/
00636 /** Computes the direction of the level line of 'in' at each point.
00637 
00638     The result is:
00639     - an image_double with the angle at each pixel, or NOTDEF if not defined.
00640     - the image_double 'modgrad' (a pointer is passed as argument)
00641       with the gradient magnitude at each point.
00642     - a list of pixels 'list_p' roughly ordered by decreasing
00643       gradient magnitude. (The order is made by classifying points
00644       into bins by gradient magnitude. The parameters 'n_bins' and
00645       'max_grad' specify the number of bins and the gradient modulus
00646       at the highest bin. The pixels in the list would be in
00647       decreasing gradient magnitude, up to a precision of the size of
00648       the bins.)
00649     - a pointer 'mem_p' to the memory used by 'list_p' to be able to
00650       free the memory when it is not used anymore.
00651  */
00652 static image_double ll_angle( image_double in, double threshold,
00653                               struct coorlist ** list_p, void ** mem_p,
00654                               image_double * modgrad, unsigned int n_bins,
00655                               double max_grad )
00656 {
00657   image_double g;
00658   unsigned int n,p,x,y,adr,i;
00659   double com1,com2,gx,gy,norm,norm2;
00660   /* the rest of the variables are used for pseudo-ordering
00661      the gradient magnitude values */
00662   int list_count = 0;
00663   struct coorlist * list;
00664   struct coorlist ** range_l_s; /* array of pointers to start of bin list */
00665   struct coorlist ** range_l_e; /* array of pointers to end of bin list */
00666   struct coorlist * start;
00667   struct coorlist * end;
00668 
00669   /* check parameters */
00670   if( in == NULL || in->data == NULL || in->xsize == 0 || in->ysize == 0 )
00671     error("ll_angle: invalid image.");
00672   if( threshold < 0.0 ) error("ll_angle: 'threshold' must be positive.");
00673   if( list_p == NULL ) error("ll_angle: NULL pointer 'list_p'.");
00674   if( mem_p == NULL ) error("ll_angle: NULL pointer 'mem_p'.");
00675   if( modgrad == NULL ) error("ll_angle: NULL pointer 'modgrad'.");
00676   if( n_bins == 0 ) error("ll_angle: 'n_bins' must be positive.");
00677   if( max_grad <= 0.0 ) error("ll_angle: 'max_grad' must be positive.");
00678 
00679   /* image size shortcuts */
00680   n = in->ysize;
00681   p = in->xsize;
00682 
00683   /* allocate output image */
00684   g = new_image_double(in->xsize,in->ysize);
00685 
00686   /* get memory for the image of gradient modulus */
00687   *modgrad = new_image_double(in->xsize,in->ysize);
00688 
00689   /* get memory for "ordered" list of pixels */
00690   list = (struct coorlist *) calloc( (size_t) (n*p), sizeof(struct coorlist) );
00691   *mem_p = (void *) list;
00692   range_l_s = (struct coorlist **) calloc( (size_t) n_bins,
00693                                            sizeof(struct coorlist *) );
00694   range_l_e = (struct coorlist **) calloc( (size_t) n_bins,
00695                                            sizeof(struct coorlist *) );
00696   if( list == NULL || range_l_s == NULL || range_l_e == NULL )
00697     error("not enough memory.");
00698   for(i=0;i<n_bins;i++) range_l_s[i] = range_l_e[i] = NULL;
00699 
00700   /* 'undefined' on the down and right boundaries */
00701   for(x=0;x<p;x++) g->data[(n-1)*p+x] = NOTDEF;
00702   for(y=0;y<n;y++) g->data[p*y+p-1]   = NOTDEF;
00703 
00704   /* compute gradient on the remaining pixels */
00705   for(x=0;x<p-1;x++)
00706     for(y=0;y<n-1;y++)
00707       {
00708         adr = y*p+x;
00709 
00710         /*
00711            Norm 2 computation using 2x2 pixel window:
00712              A B
00713              C D
00714            and
00715              com1 = D-A,  com2 = B-C.
00716            Then
00717              gx = B+D - (A+C)   horizontal difference
00718              gy = C+D - (A+B)   vertical difference
00719            com1 and com2 are just to avoid 2 additions.
00720          */
00721         com1 = in->data[adr+p+1] - in->data[adr];
00722         com2 = in->data[adr+1]   - in->data[adr+p];
00723 
00724         gx = com1+com2; /* gradient x component */
00725         gy = com1-com2; /* gradient y component */
00726         norm2 = gx*gx+gy*gy;
00727         norm = sqrt( norm2 / 4.0 ); /* gradient norm */
00728 
00729         (*modgrad)->data[adr] = norm; /* store gradient norm */
00730 
00731         if( norm <= threshold ) /* norm too small, gradient no defined */
00732           g->data[adr] = NOTDEF; /* gradient angle not defined */
00733         else
00734           {
00735             /* gradient angle computation */
00736             g->data[adr] = atan2(gx,-gy);
00737 
00738             /* store the point in the right bin according to its norm */
00739             i = (unsigned int) (norm * (double) n_bins / max_grad);
00740             if( i >= n_bins ) i = n_bins-1;
00741             if( range_l_e[i] == NULL )
00742               range_l_s[i] = range_l_e[i] = list+list_count++;
00743             else
00744               {
00745                 range_l_e[i]->next = list+list_count;
00746                 range_l_e[i] = list+list_count++;
00747               }
00748             range_l_e[i]->x = (int) x;
00749             range_l_e[i]->y = (int) y;
00750             range_l_e[i]->next = NULL;
00751           }
00752       }
00753 
00754   /* Make the list of pixels (almost) ordered by norm value.
00755      It starts by the larger bin, so the list starts by the
00756      pixels with higher gradient value. Pixels would be ordered
00757      by norm value, up to a precision given by max_grad/n_bins.
00758    */
00759   for(i=n_bins-1; i>0 && range_l_s[i]==NULL; i--);
00760   start = range_l_s[i];
00761   end = range_l_e[i];
00762   if( start != NULL )
00763     for(i--;i>0; i--)
00764       if( range_l_s[i] != NULL )
00765         {
00766           end->next = range_l_s[i];
00767           end = range_l_e[i];
00768         }
00769   *list_p = start;
00770 
00771   /* free memory */
00772   free( (void *) range_l_s );
00773   free( (void *) range_l_e );
00774 
00775   return g;
00776 }
00777 
00778 /*----------------------------------------------------------------------------*/
00779 /** Is point (x,y) aligned to angle theta, up to precision 'prec'?
00780  */
00781 static int isaligned( int x, int y, image_double angles, double theta,
00782                       double prec )
00783 {
00784   double a;
00785 
00786   /* check parameters */
00787   if( angles == NULL || angles->data == NULL )
00788     error("isaligned: invalid image 'angles'.");
00789   if( x < 0 || y < 0 || x >= (int) angles->xsize || y >= (int) angles->ysize )
00790     error("isaligned: (x,y) out of the image.");
00791   if( prec < 0.0 ) error("isaligned: 'prec' must be positive.");
00792 
00793   /* angle at pixel (x,y) */
00794   a = angles->data[ x + y * angles->xsize ];
00795 
00796   /* pixels whose level-line angle is not defined
00797      are considered as NON-aligned */
00798   if( a == NOTDEF ) return FALSE;  /* there is no need to call the function
00799                                       'double_equal' here because there is
00800                                       no risk of problems related to the
00801                                       comparison doubles, we are only
00802                                       interested in the exact NOTDEF value */
00803 
00804   /* it is assumed that 'theta' and 'a' are in the range [-pi,pi] */
00805   theta -= a;
00806   if( theta < 0.0 ) theta = -theta;
00807   if( theta > M_3_2_PI )
00808     {
00809       theta -= M_2__PI;
00810       if( theta < 0.0 ) theta = -theta;
00811     }
00812 
00813   return theta < prec;
00814 }
00815 
00816 /*----------------------------------------------------------------------------*/
00817 /** Absolute value angle difference.
00818  */
00819 static double angle_diff(double a, double b)
00820 {
00821   a -= b;
00822   while( a <= -M_PI ) a += M_2__PI;
00823   while( a >   M_PI ) a -= M_2__PI;
00824   if( a < 0.0 ) a = -a;
00825   return a;
00826 }
00827 
00828 /*----------------------------------------------------------------------------*/
00829 /** Signed angle difference.
00830  */
00831 static double angle_diff_signed(double a, double b)
00832 {
00833   a -= b;
00834   while( a <= -M_PI ) a += M_2__PI;
00835   while( a >   M_PI ) a -= M_2__PI;
00836   return a;
00837 }
00838 
00839 
00840 /*----------------------------------------------------------------------------*/
00841 /*----------------------------- NFA computation ------------------------------*/
00842 /*----------------------------------------------------------------------------*/
00843 
00844 /*----------------------------------------------------------------------------*/
00845 /** Computes the natural logarithm of the absolute value of
00846     the gamma function of x using the Lanczos approximation.
00847     See http://www.rskey.org/gamma.htm
00848 
00849     The formula used is
00850     @f[
00851       \Gamma(x) = \frac{ \sum_{n=0}^{N} q_n x^n }{ \Pi_{n=0}^{N} (x+n) }
00852                   (x+5.5)^{x+0.5} e^{-(x+5.5)}
00853     @f]
00854     so
00855     @f[
00856       \log\Gamma(x) = \log\left( \sum_{n=0}^{N} q_n x^n \right)
00857                       + (x+0.5) \log(x+5.5) - (x+5.5) - \sum_{n=0}^{N} \log(x+n)
00858     @f]
00859     and
00860       q0 = 75122.6331530,
00861       q1 = 80916.6278952,
00862       q2 = 36308.2951477,
00863       q3 = 8687.24529705,
00864       q4 = 1168.92649479,
00865       q5 = 83.8676043424,
00866       q6 = 2.50662827511.
00867  */
00868 static double log_gamma_lanczos(double x)
00869 {
00870   static double q[7] = { 75122.6331530, 80916.6278952, 36308.2951477,
00871                          8687.24529705, 1168.92649479, 83.8676043424,
00872                          2.50662827511 };
00873   double a = (x+0.5) * log(x+5.5) - (x+5.5);
00874   double b = 0.0;
00875   int n;
00876 
00877   for(n=0;n<7;n++)
00878     {
00879       a -= log( x + (double) n );
00880       b += q[n] * pow( x, (double) n );
00881     }
00882   return a + log(b);
00883 }
00884 
00885 /*----------------------------------------------------------------------------*/
00886 /** Computes the natural logarithm of the absolute value of
00887     the gamma function of x using Windschitl method.
00888     See http://www.rskey.org/gamma.htm
00889 
00890     The formula used is
00891     @f[
00892         \Gamma(x) = \sqrt{\frac{2\pi}{x}} \left( \frac{x}{e}
00893                     \sqrt{ x\sinh(1/x) + \frac{1}{810x^6} } \right)^x
00894     @f]
00895     so
00896     @f[
00897         \log\Gamma(x) = 0.5\log(2\pi) + (x-0.5)\log(x) - x
00898                       + 0.5x\log\left( x\sinh(1/x) + \frac{1}{810x^6} \right).
00899     @f]
00900     This formula is a good approximation when x > 15.
00901  */
00902 static double log_gamma_windschitl(double x)
00903 {
00904   return 0.918938533204673 + (x-0.5)*log(x) - x
00905          + 0.5*x*log( x*sinh(1/x) + 1/(810.0*pow(x,6.0)) );
00906 }
00907 
00908 /*----------------------------------------------------------------------------*/
00909 /** Computes the natural logarithm of the absolute value of
00910     the gamma function of x. When x>15 use log_gamma_windschitl(),
00911     otherwise use log_gamma_lanczos().
00912  */
00913 #define log_gamma(x) ((x)>15.0?log_gamma_windschitl(x):log_gamma_lanczos(x))
00914 
00915 /*----------------------------------------------------------------------------*/
00916 /** Size of the table to store already computed inverse values.
00917  */
00918 #define TABSIZE 100000
00919 
00920 /*----------------------------------------------------------------------------*/
00921 /** Computes -log10(NFA).
00922 
00923     NFA stands for Number of False Alarms:
00924     @f[
00925         \mathrm{NFA} = NT \cdot B(n,k,p)
00926     @f]
00927 
00928     - NT       - number of tests
00929     - B(n,k,p) - tail of binomial distribution with parameters n,k and p:
00930     @f[
00931         B(n,k,p) = \sum_{j=k}^n
00932                    \left(\begin{array}{c}n\\j\end{array}\right)
00933                    p^{j} (1-p)^{n-j}
00934     @f]
00935 
00936     The value -log10(NFA) is equivalent but more intuitive than NFA:
00937     - -1 corresponds to 10 mean false alarms
00938     -  0 corresponds to 1 mean false alarm
00939     -  1 corresponds to 0.1 mean false alarms
00940     -  2 corresponds to 0.01 mean false alarms
00941     -  ...
00942 
00943     Used this way, the bigger the value, better the detection,
00944     and a logarithmic scale is used.
00945 
00946     @param n,k,p binomial parameters.
00947     @param logNT logarithm of Number of Tests
00948 
00949     The computation is based in the gamma function by the following
00950     relation:
00951     @f[
00952         \left(\begin{array}{c}n\\k\end{array}\right)
00953         = \frac{ \Gamma(n+1) }{ \Gamma(k+1) \cdot \Gamma(n-k+1) }.
00954     @f]
00955     We use efficient algorithms to compute the logarithm of
00956     the gamma function.
00957 
00958     To make the computation faster, not all the sum is computed, part
00959     of the terms are neglected based on a bound to the error obtained
00960     (an error of 10% in the result is accepted).
00961  */
00962 static double nfa(int n, int k, double p, double logNT)
00963 {
00964   static double inv[TABSIZE];   /* table to keep computed inverse values */
00965   double tolerance = 0.1;       /* an error of 10% in the result is accepted */
00966   double log1term,term,bin_term,mult_term,bin_tail,err,p_term;
00967   int i;
00968 
00969   /* check parameters */
00970   if( n<0 || k<0 || k>n || p<=0.0 || p>=1.0 )
00971     error("nfa: wrong n, k or p values.");
00972 
00973   /* trivial cases */
00974   if( n==0 || k==0 ) return -logNT;
00975   if( n==k ) return -logNT - (double) n * log10(p);
00976 
00977   /* probability term */
00978   p_term = p / (1.0-p);
00979 
00980   /* compute the first term of the series */
00981   /*
00982      binomial_tail(n,k,p) = sum_{i=k}^n bincoef(n,i) * p^i * (1-p)^{n-i}
00983      where bincoef(n,i) are the binomial coefficients.
00984      But
00985        bincoef(n,k) = gamma(n+1) / ( gamma(k+1) * gamma(n-k+1) ).
00986      We use this to compute the first term. Actually the log of it.
00987    */
00988   log1term = log_gamma( (double) n + 1.0 ) - log_gamma( (double) k + 1.0 )
00989            - log_gamma( (double) (n-k) + 1.0 )
00990            + (double) k * log(p) + (double) (n-k) * log(1.0-p);
00991   term = exp(log1term);
00992 
00993   /* in some cases no more computations are needed */
00994   if( double_equal(term,0.0) )              /* the first term is almost zero */
00995     {
00996       if( (double) k > (double) n * p )     /* at begin or end of the tail?  */
00997         return -log1term / M_LN10 - logNT;  /* end: use just the first term  */
00998       else
00999         return -logNT;                      /* begin: the tail is roughly 1  */
01000     }
01001 
01002   /* compute more terms if needed */
01003   bin_tail = term;
01004   for(i=k+1;i<=n;i++)
01005     {
01006       /*
01007          As
01008            term_i = bincoef(n,i) * p^i * (1-p)^(n-i)
01009          and
01010            bincoef(n,i)/bincoef(n,i-1) = n-1+1 / i,
01011          then,
01012            term_i / term_i-1 = (n-i+1)/i * p/(1-p)
01013          and
01014            term_i = term_i-1 * (n-i+1)/i * p/(1-p).
01015          1/i is stored in a table as they are computed,
01016          because divisions are expensive.
01017          p/(1-p) is computed only once and stored in 'p_term'.
01018        */
01019       bin_term = (double) (n-i+1) * ( i<TABSIZE ?
01020                    ( inv[i]!=0.0 ? inv[i] : ( inv[i] = 1.0 / (double) i ) ) :
01021                    1.0 / (double) i );
01022 
01023       mult_term = bin_term * p_term;
01024       term *= mult_term;
01025       bin_tail += term;
01026       if(bin_term<1.0)
01027         {
01028           /* When bin_term<1 then mult_term_j<mult_term_i for j>i.
01029              Then, the error on the binomial tail when truncated at
01030              the i term can be bounded by a geometric series of form
01031              term_i * sum mult_term_i^j.                            */
01032           err = term * ( ( 1.0 - pow( mult_term, (double) (n-i+1) ) ) /
01033                          (1.0-mult_term) - 1.0 );
01034 
01035           /* One wants an error at most of tolerance*final_result, or:
01036              tolerance * abs(-log10(bin_tail)-logNT).
01037              Now, the error that can be accepted on bin_tail is
01038              given by tolerance*final_result divided by the derivative
01039              of -log10(x) when x=bin_tail. that is:
01040              tolerance * abs(-log10(bin_tail)-logNT) / (1/bin_tail)
01041              Finally, we truncate the tail if the error is less than:
01042              tolerance * abs(-log10(bin_tail)-logNT) * bin_tail        */
01043           if( err < tolerance * fabs(-log10(bin_tail)-logNT) * bin_tail ) break;
01044         }
01045     }
01046   return -log10(bin_tail) - logNT;
01047 }
01048 
01049 
01050 /*----------------------------------------------------------------------------*/
01051 /*--------------------------- Rectangle structure ----------------------------*/
01052 /*----------------------------------------------------------------------------*/
01053 
01054 /*----------------------------------------------------------------------------*/
01055 /** Rectangle structure: line segment with width.
01056  */
01057 struct rect
01058 {
01059   double x1,y1,x2,y2;  /* first and second point of the line segment */
01060   double width;        /* rectangle width */
01061   double x,y;          /* center of the rectangle */
01062   double theta;        /* angle */
01063   double dx,dy;        /* vector with the line segment angle */
01064   double prec;         /* tolerance angle */
01065   double p;            /* probability of a point with angle within 'prec' */
01066 };
01067 
01068 /*----------------------------------------------------------------------------*/
01069 /** Copy one rectangle structure to another.
01070  */
01071 static void rect_copy(struct rect * in, struct rect * out)
01072 {
01073   /* check parameters */
01074   if( in == NULL || out == NULL ) error("rect_copy: invalid 'in' or 'out'.");
01075 
01076   /* copy values */
01077   out->x1 = in->x1;
01078   out->y1 = in->y1;
01079   out->x2 = in->x2;
01080   out->y2 = in->y2;
01081   out->width = in->width;
01082   out->x = in->x;
01083   out->y = in->y;
01084   out->theta = in->theta;
01085   out->dx = in->dx;
01086   out->dy = in->dy;
01087   out->prec = in->prec;
01088   out->p = in->p;
01089 }
01090 
01091 /*----------------------------------------------------------------------------*/
01092 /** Rectangle points iterator.
01093 
01094     The integer coordinates of pixels inside a rectangle are
01095     iteratively explored. This structure keep track of the process and
01096     functions ri_ini(), ri_inc(), ri_end(), and ri_del() are used in
01097     the process. An example of how to use the iterator is as follows:
01098     \code
01099 
01100       struct rect * rec = XXX; // some rectangle
01101       rect_iter * i;
01102       for( i=ri_ini(rec); !ri_end(i); ri_inc(i) )
01103         {
01104           // your code, using 'i->x' and 'i->y' as coordinates
01105         }
01106       ri_del(i); // delete iterator
01107 
01108     \endcode
01109     The pixels are explored 'column' by 'column', where we call
01110     'column' a set of pixels with the same x value that are inside the
01111     rectangle. The following is an schematic representation of a
01112     rectangle, the 'column' being explored is marked by colons, and
01113     the current pixel being explored is 'x,y'.
01114     \verbatim
01115 
01116               vx[1],vy[1]
01117                  *   *
01118                 *       *
01119                *           *
01120               *               ye
01121              *                :  *
01122         vx[0],vy[0]           :     *
01123                *              :        *
01124                   *          x,y          *
01125                      *        :              *
01126                         *     :            vx[2],vy[2]
01127                            *  :                *
01128         y                     ys              *
01129         ^                        *           *
01130         |                           *       *
01131         |                              *   *
01132         +---> x                      vx[3],vy[3]
01133 
01134     \endverbatim
01135     The first 'column' to be explored is the one with the smaller x
01136     value. Each 'column' is explored starting from the pixel of the
01137     'column' (inside the rectangle) with the smaller y value.
01138 
01139     The four corners of the rectangle are stored in order that rotates
01140     around the corners at the arrays 'vx[]' and 'vy[]'. The first
01141     point is always the one with smaller x value.
01142 
01143     'x' and 'y' are the coordinates of the pixel being explored. 'ys'
01144     and 'ye' are the start and end values of the current column being
01145     explored. So, 'ys' < 'ye'.
01146  */
01147 typedef struct
01148 {
01149   double vx[4];  /* rectangle's corner X coordinates in circular order */
01150   double vy[4];  /* rectangle's corner Y coordinates in circular order */
01151   double ys,ye;  /* start and end Y values of current 'column' */
01152   int x,y;       /* coordinates of currently explored pixel */
01153 } rect_iter;
01154 
01155 /*----------------------------------------------------------------------------*/
01156 /** Interpolate y value corresponding to 'x' value given, in
01157     the line 'x1,y1' to 'x2,y2'; if 'x1=x2' return the smaller
01158     of 'y1' and 'y2'.
01159 
01160     The following restrictions are required:
01161     - x1 <= x2
01162     - x1 <= x
01163     - x  <= x2
01164  */
01165 static double inter_low(double x, double x1, double y1, double x2, double y2)
01166 {
01167   /* check parameters */
01168   if( x1 > x2 || x < x1 || x > x2 )
01169     error("inter_low: unsuitable input, 'x1>x2' or 'x<x1' or 'x>x2'.");
01170 
01171   /* interpolation */
01172   if( double_equal(x1,x2) && y1<y2 ) return y1;
01173   if( double_equal(x1,x2) && y1>y2 ) return y2;
01174   return y1 + (x-x1) * (y2-y1) / (x2-x1);
01175 }
01176 
01177 /*----------------------------------------------------------------------------*/
01178 /** Interpolate y value corresponding to 'x' value given, in
01179     the line 'x1,y1' to 'x2,y2'; if 'x1=x2' return the larger
01180     of 'y1' and 'y2'.
01181 
01182     The following restrictions are required:
01183     - x1 <= x2
01184     - x1 <= x
01185     - x  <= x2
01186  */
01187 static double inter_hi(double x, double x1, double y1, double x2, double y2)
01188 {
01189   /* check parameters */
01190   if( x1 > x2 || x < x1 || x > x2 )
01191     error("inter_hi: unsuitable input, 'x1>x2' or 'x<x1' or 'x>x2'.");
01192 
01193   /* interpolation */
01194   if( double_equal(x1,x2) && y1<y2 ) return y2;
01195   if( double_equal(x1,x2) && y1>y2 ) return y1;
01196   return y1 + (x-x1) * (y2-y1) / (x2-x1);
01197 }
01198 
01199 /*----------------------------------------------------------------------------*/
01200 /** Free memory used by a rectangle iterator.
01201  */
01202 static void ri_del(rect_iter * iter)
01203 {
01204   if( iter == NULL ) error("ri_del: NULL iterator.");
01205   free( (void *) iter );
01206 }
01207 
01208 /*----------------------------------------------------------------------------*/
01209 /** Check if the iterator finished the full iteration.
01210 
01211     See details in \ref rect_iter
01212  */
01213 static int ri_end(rect_iter * i)
01214 {
01215   /* check input */
01216   if( i == NULL ) error("ri_end: NULL iterator.");
01217 
01218   /* if the current x value is larger than the larger
01219      x value in the rectangle (vx[2]), we know the full
01220      exploration of the rectangle is finished. */
01221   return (double)(i->x) > i->vx[2];
01222 }
01223 
01224 /*----------------------------------------------------------------------------*/
01225 /** Increment a rectangle iterator.
01226 
01227     See details in \ref rect_iter
01228  */
01229 static void ri_inc(rect_iter * i)
01230 {
01231   /* check input */
01232   if( i == NULL ) error("ri_inc: NULL iterator.");
01233 
01234   /* if not at end of exploration,
01235      increase y value for next pixel in the 'column' */
01236   if( !ri_end(i) ) i->y++;
01237 
01238   /* if the end of the current 'column' is reached,
01239      and it is not the end of exploration,
01240      advance to the next 'column' */
01241   while( (double) (i->y) > i->ye && !ri_end(i) )
01242     {
01243       /* increase x, next 'column' */
01244       i->x++;
01245 
01246       /* if end of exploration, return */
01247       if( ri_end(i) ) return;
01248 
01249       /* update lower y limit (start) for the new 'column'.
01250 
01251          We need to interpolate the y value that corresponds to the
01252          lower side of the rectangle. The first thing is to decide if
01253          the corresponding side is
01254 
01255            vx[0],vy[0] to vx[3],vy[3] or
01256            vx[3],vy[3] to vx[2],vy[2]
01257 
01258          Then, the side is interpolated for the x value of the
01259          'column'. But, if the side is vertical (as it could happen if
01260          the rectangle is vertical and we are dealing with the first
01261          or last 'columns') then we pick the lower value of the side
01262          by using 'inter_low'.
01263        */
01264       if( (double) i->x < i->vx[3] )
01265         i->ys = inter_low((double)i->x,i->vx[0],i->vy[0],i->vx[3],i->vy[3]);
01266       else
01267         i->ys = inter_low((double)i->x,i->vx[3],i->vy[3],i->vx[2],i->vy[2]);
01268 
01269       /* update upper y limit (end) for the new 'column'.
01270 
01271          We need to interpolate the y value that corresponds to the
01272          upper side of the rectangle. The first thing is to decide if
01273          the corresponding side is
01274 
01275            vx[0],vy[0] to vx[1],vy[1] or
01276            vx[1],vy[1] to vx[2],vy[2]
01277 
01278          Then, the side is interpolated for the x value of the
01279          'column'. But, if the side is vertical (as it could happen if
01280          the rectangle is vertical and we are dealing with the first
01281          or last 'columns') then we pick the lower value of the side
01282          by using 'inter_low'.
01283        */
01284       if( (double)i->x < i->vx[1] )
01285         i->ye = inter_hi((double)i->x,i->vx[0],i->vy[0],i->vx[1],i->vy[1]);
01286       else
01287         i->ye = inter_hi((double)i->x,i->vx[1],i->vy[1],i->vx[2],i->vy[2]);
01288 
01289       /* new y */
01290       i->y = (int) ceil(i->ys);
01291     }
01292 }
01293 
01294 /*----------------------------------------------------------------------------*/
01295 /** Create and initialize a rectangle iterator.
01296 
01297     See details in \ref rect_iter
01298  */
01299 static rect_iter * ri_ini(struct rect * r)
01300 {
01301   double vx[4],vy[4];
01302   int n,offset;
01303   rect_iter * i;
01304 
01305   /* check parameters */
01306   if( r == NULL ) error("ri_ini: invalid rectangle.");
01307 
01308   /* get memory */
01309   i = (rect_iter *) malloc(sizeof(rect_iter));
01310   if( i == NULL ) error("ri_ini: Not enough memory.");
01311 
01312   /* build list of rectangle corners ordered
01313      in a circular way around the rectangle */
01314   vx[0] = r->x1 - r->dy * r->width / 2.0;
01315   vy[0] = r->y1 + r->dx * r->width / 2.0;
01316   vx[1] = r->x2 - r->dy * r->width / 2.0;
01317   vy[1] = r->y2 + r->dx * r->width / 2.0;
01318   vx[2] = r->x2 + r->dy * r->width / 2.0;
01319   vy[2] = r->y2 - r->dx * r->width / 2.0;
01320   vx[3] = r->x1 + r->dy * r->width / 2.0;
01321   vy[3] = r->y1 - r->dx * r->width / 2.0;
01322 
01323   /* compute rotation of index of corners needed so that the first
01324      point has the smaller x.
01325 
01326      if one side is vertical, thus two corners have the same smaller x
01327      value, the one with the largest y value is selected as the first.
01328    */
01329   if( r->x1 < r->x2 && r->y1 <= r->y2 ) offset = 0;
01330   else if( r->x1 >= r->x2 && r->y1 < r->y2 ) offset = 1;
01331   else if( r->x1 > r->x2 && r->y1 >= r->y2 ) offset = 2;
01332   else offset = 3;
01333 
01334   /* apply rotation of index. */
01335   for(n=0; n<4; n++)
01336     {
01337       i->vx[n] = vx[(offset+n)%4];
01338       i->vy[n] = vy[(offset+n)%4];
01339     }
01340 
01341   /* Set a initial condition.
01342 
01343      The values are set to values that will cause 'ri_inc' (that will
01344      be called immediately) to initialize correctly the first 'column'
01345      and compute the limits 'ys' and 'ye'.
01346 
01347      'y' is set to the integer value of vy[0], the starting corner.
01348 
01349      'ys' and 'ye' are set to very small values, so 'ri_inc' will
01350      notice that it needs to start a new 'column'.
01351 
01352      The smaller integer coordinate inside of the rectangle is
01353      'ceil(vx[0])'. The current 'x' value is set to that value minus
01354      one, so 'ri_inc' (that will increase x by one) will advance to
01355      the first 'column'.
01356    */
01357   i->x = (int) ceil(i->vx[0]) - 1;
01358   i->y = (int) ceil(i->vy[0]);
01359   i->ys = i->ye = -DBL_MAX;
01360 
01361   /* advance to the first pixel */
01362   ri_inc(i);
01363 
01364   return i;
01365 }
01366 
01367 /*----------------------------------------------------------------------------*/
01368 /** Compute a rectangle's NFA value.
01369  */
01370 static double rect_nfa(struct rect * rec, image_double angles, double logNT)
01371 {
01372   rect_iter * i;
01373   int pts = 0;
01374   int alg = 0;
01375 
01376   /* check parameters */
01377   if( rec == NULL ) error("rect_nfa: invalid rectangle.");
01378   if( angles == NULL ) error("rect_nfa: invalid 'angles'.");
01379 
01380   /* compute the total number of pixels and of aligned points in 'rec' */
01381   for(i=ri_ini(rec); !ri_end(i); ri_inc(i)) /* rectangle iterator */
01382     if( i->x >= 0 && i->y >= 0 &&
01383         i->x < (int) angles->xsize && i->y < (int) angles->ysize )
01384       {
01385         ++pts; /* total number of pixels counter */
01386         if( isaligned(i->x, i->y, angles, rec->theta, rec->prec) )
01387           ++alg; /* aligned points counter */
01388       }
01389   ri_del(i); /* delete iterator */
01390 
01391   return nfa(pts,alg,rec->p,logNT); /* compute NFA value */
01392 }
01393 
01394 
01395 /*----------------------------------------------------------------------------*/
01396 /*---------------------------------- Regions ---------------------------------*/
01397 /*----------------------------------------------------------------------------*/
01398 
01399 /*----------------------------------------------------------------------------*/
01400 /** Compute region's angle as the principal inertia axis of the region.
01401 
01402     The following is the region inertia matrix A:
01403     @f[
01404 
01405         A = \left(\begin{array}{cc}
01406                                     Ixx & Ixy \\
01407                                     Ixy & Iyy \\
01408              \end{array}\right)
01409 
01410     @f]
01411     where
01412 
01413       Ixx =   sum_i G(i).(y_i - cx)^2
01414 
01415       Iyy =   sum_i G(i).(x_i - cy)^2
01416 
01417       Ixy = - sum_i G(i).(x_i - cx).(y_i - cy)
01418 
01419     and
01420     - G(i) is the gradient norm at pixel i, used as pixel's weight.
01421     - x_i and y_i are the coordinates of pixel i.
01422     - cx and cy are the coordinates of the center of th region.
01423 
01424     lambda1 and lambda2 are the eigenvalues of matrix A,
01425     with lambda1 >= lambda2. They are found by solving the
01426     characteristic polynomial:
01427 
01428       det( lambda I - A) = 0
01429 
01430     that gives:
01431 
01432       lambda1 = ( Ixx + Iyy + sqrt( (Ixx-Iyy)^2 + 4.0*Ixy*Ixy) ) / 2
01433 
01434       lambda2 = ( Ixx + Iyy - sqrt( (Ixx-Iyy)^2 + 4.0*Ixy*Ixy) ) / 2
01435 
01436     To get the line segment direction we want to get the angle the
01437     eigenvector assotiated to the smaller eigenvalue. We have to solve
01438     a,b in:
01439 
01440       a.Ixx + b.Ixy = a.lambda2
01441 
01442       a.Ixy + b.Iyy = b.lambda2
01443 
01444     We want the angle theta = atan(b/a). It can be computed with
01445     any of the two equations:
01446 
01447       theta = atan( (lambda2-Ixx) / Ixy )
01448 
01449     or
01450 
01451       theta = atan( Ixy / (lambda2-Iyy) )
01452 
01453     When |Ixx| > |Iyy| we use the first, otherwise the second (just to
01454     get better numeric precision).
01455  */
01456 static double get_theta( struct point * reg, int reg_size, double x, double y,
01457                          image_double modgrad, double reg_angle, double prec )
01458 {
01459   double lambda,theta,weight;
01460   double Ixx = 0.0;
01461   double Iyy = 0.0;
01462   double Ixy = 0.0;
01463   int i;
01464 
01465   /* check parameters */
01466   if( reg == NULL ) error("get_theta: invalid region.");
01467   if( reg_size <= 1 ) error("get_theta: region size <= 1.");
01468   if( modgrad == NULL || modgrad->data == NULL )
01469     error("get_theta: invalid 'modgrad'.");
01470   if( prec < 0.0 ) error("get_theta: 'prec' must be positive.");
01471 
01472   /* compute inertia matrix */
01473   for(i=0; i<reg_size; i++)
01474     {
01475       weight = modgrad->data[ reg[i].x + reg[i].y * modgrad->xsize ];
01476       Ixx += ( (double) reg[i].y - y ) * ( (double) reg[i].y - y ) * weight;
01477       Iyy += ( (double) reg[i].x - x ) * ( (double) reg[i].x - x ) * weight;
01478       Ixy -= ( (double) reg[i].x - x ) * ( (double) reg[i].y - y ) * weight;
01479     }
01480   if( double_equal(Ixx,0.0) && double_equal(Iyy,0.0) && double_equal(Ixy,0.0) )
01481     error("get_theta: null inertia matrix.");
01482 
01483   /* compute smallest eigenvalue */
01484   lambda = 0.5 * ( Ixx + Iyy - sqrt( (Ixx-Iyy)*(Ixx-Iyy) + 4.0*Ixy*Ixy ) );
01485 
01486   /* compute angle */
01487   theta = fabs(Ixx)>fabs(Iyy) ? atan2(lambda-Ixx,Ixy) : atan2(Ixy,lambda-Iyy);
01488 
01489   /* The previous procedure don't cares about orientation,
01490      so it could be wrong by 180 degrees. Here is corrected if necessary. */
01491   if( angle_diff(theta,reg_angle) > prec ) theta += M_PI;
01492 
01493   return theta;
01494 }
01495 
01496 /*----------------------------------------------------------------------------*/
01497 /** Computes a rectangle that covers a region of points.
01498  */
01499 static void region2rect( struct point * reg, int reg_size,
01500                          image_double modgrad, double reg_angle,
01501                          double prec, double p, struct rect * rec )
01502 {
01503   double x,y,dx,dy,l,w,theta,weight,sum,l_min,l_max,w_min,w_max;
01504   int i;
01505 
01506   /* check parameters */
01507   if( reg == NULL ) error("region2rect: invalid region.");
01508   if( reg_size <= 1 ) error("region2rect: region size <= 1.");
01509   if( modgrad == NULL || modgrad->data == NULL )
01510     error("region2rect: invalid image 'modgrad'.");
01511   if( rec == NULL ) error("region2rect: invalid 'rec'.");
01512 
01513   /* center of the region:
01514 
01515      It is computed as the weighted sum of the coordinates
01516      of all the pixels in the region. The norm of the gradient
01517      is used as the weight of a pixel. The sum is as follows:
01518        cx = \sum_i G(i).x_i
01519        cy = \sum_i G(i).y_i
01520      where G(i) is the norm of the gradient of pixel i
01521      and x_i,y_i are its coordinates.
01522    */
01523   x = y = sum = 0.0;
01524   for(i=0; i<reg_size; i++)
01525     {
01526       weight = modgrad->data[ reg[i].x + reg[i].y * modgrad->xsize ];
01527       x += (double) reg[i].x * weight;
01528       y += (double) reg[i].y * weight;
01529       sum += weight;
01530     }
01531   if( sum <= 0.0 ) error("region2rect: weights sum equal to zero.");
01532   x /= sum;
01533   y /= sum;
01534 
01535   /* theta */
01536   theta = get_theta(reg,reg_size,x,y,modgrad,reg_angle,prec);
01537 
01538   /* length and width:
01539 
01540      'l' and 'w' are computed as the distance from the center of the
01541      region to pixel i, projected along the rectangle axis (dx,dy) and
01542      to the orthogonal axis (-dy,dx), respectively.
01543 
01544      The length of the rectangle goes from l_min to l_max, where l_min
01545      and l_max are the minimum and maximum values of l in the region.
01546      Analogously, the width is selected from w_min to w_max, where
01547      w_min and w_max are the minimum and maximum of w for the pixels
01548      in the region.
01549    */
01550   dx = cos(theta);
01551   dy = sin(theta);
01552   l_min = l_max = w_min = w_max = 0.0;
01553   for(i=0; i<reg_size; i++)
01554     {
01555       l =  ( (double) reg[i].x - x) * dx + ( (double) reg[i].y - y) * dy;
01556       w = -( (double) reg[i].x - x) * dy + ( (double) reg[i].y - y) * dx;
01557 
01558       if( l > l_max ) l_max = l;
01559       if( l < l_min ) l_min = l;
01560       if( w > w_max ) w_max = w;
01561       if( w < w_min ) w_min = w;
01562     }
01563 
01564   /* store values */
01565   rec->x1 = x + l_min * dx;
01566   rec->y1 = y + l_min * dy;
01567   rec->x2 = x + l_max * dx;
01568   rec->y2 = y + l_max * dy;
01569   rec->width = w_max - w_min;
01570   rec->x = x;
01571   rec->y = y;
01572   rec->theta = theta;
01573   rec->dx = dx;
01574   rec->dy = dy;
01575   rec->prec = prec;
01576   rec->p = p;
01577 
01578   /* we impose a minimal width of one pixel
01579 
01580      A sharp horizontal or vertical step would produce a perfectly
01581      horizontal or vertical region. The width computed would be
01582      zero. But that corresponds to a one pixels width transition in
01583      the image.
01584    */
01585   if( rec->width < 1.0 ) rec->width = 1.0;
01586 }
01587 
01588 /*----------------------------------------------------------------------------*/
01589 /** Build a region of pixels that share the same angle, up to a
01590     tolerance 'prec', starting at point (x,y).
01591  */
01592 static void region_grow( int x, int y, image_double angles, struct point * reg,
01593                          int * reg_size, double * reg_angle, image_char used,
01594                          double prec )
01595 {
01596   double sumdx,sumdy;
01597   int xx,yy,i;
01598 
01599   /* check parameters */
01600   if( x < 0 || y < 0 || x >= (int) angles->xsize || y >= (int) angles->ysize )
01601     error("region_grow: (x,y) out of the image.");
01602   if( angles == NULL || angles->data == NULL )
01603     error("region_grow: invalid image 'angles'.");
01604   if( reg == NULL ) error("region_grow: invalid 'reg'.");
01605   if( reg_size == NULL ) error("region_grow: invalid pointer 'reg_size'.");
01606   if( reg_angle == NULL ) error("region_grow: invalid pointer 'reg_angle'.");
01607   if( used == NULL || used->data == NULL )
01608     error("region_grow: invalid image 'used'.");
01609 
01610   /* first point of the region */
01611   *reg_size = 1;
01612   reg[0].x = x;
01613   reg[0].y = y;
01614   *reg_angle = angles->data[x+y*angles->xsize];  /* region's angle */
01615   sumdx = cos(*reg_angle);
01616   sumdy = sin(*reg_angle);
01617   used->data[x+y*used->xsize] = USED;
01618 
01619   /* try neighbors as new region points */
01620   for(i=0; i<*reg_size; i++)
01621     for(xx=reg[i].x-1; xx<=reg[i].x+1; xx++)
01622       for(yy=reg[i].y-1; yy<=reg[i].y+1; yy++)
01623         if( xx>=0 && yy>=0 && xx<(int)used->xsize && yy<(int)used->ysize &&
01624             used->data[xx+yy*used->xsize] != USED &&
01625             isaligned(xx,yy,angles,*reg_angle,prec) )
01626           {
01627             /* add point */
01628             used->data[xx+yy*used->xsize] = USED;
01629             reg[*reg_size].x = xx;
01630             reg[*reg_size].y = yy;
01631             ++(*reg_size);
01632 
01633             /* update region's angle */
01634             sumdx += cos( angles->data[xx+yy*angles->xsize] );
01635             sumdy += sin( angles->data[xx+yy*angles->xsize] );
01636             *reg_angle = atan2(sumdy,sumdx);
01637           }
01638 }
01639 
01640 /*----------------------------------------------------------------------------*/
01641 /** Try some rectangles variations to improve NFA value. Only if the
01642     rectangle is not meaningful (i.e., log_nfa <= eps).
01643  */
01644 static double rect_improve( struct rect * rec, image_double angles,
01645                             double logNT, double eps )
01646 {
01647   struct rect r;
01648   double log_nfa,log_nfa_new;
01649   double delta = 0.5;
01650   double delta_2 = delta / 2.0;
01651   int n;
01652 
01653   log_nfa = rect_nfa(rec,angles,logNT);
01654 
01655   if( log_nfa > eps ) return log_nfa;
01656 
01657   /* try finer precisions */
01658   rect_copy(rec,&r);
01659   for(n=0; n<5; n++)
01660     {
01661       r.p /= 2.0;
01662       r.prec = r.p * M_PI;
01663       log_nfa_new = rect_nfa(&r,angles,logNT);
01664       if( log_nfa_new > log_nfa )
01665         {
01666           log_nfa = log_nfa_new;
01667           rect_copy(&r,rec);
01668         }
01669     }
01670 
01671   if( log_nfa > eps ) return log_nfa;
01672 
01673   /* try to reduce width */
01674   rect_copy(rec,&r);
01675   for(n=0; n<5; n++)
01676     {
01677       if( (r.width - delta) >= 0.5 )
01678         {
01679           r.width -= delta;
01680           log_nfa_new = rect_nfa(&r,angles,logNT);
01681           if( log_nfa_new > log_nfa )
01682             {
01683               rect_copy(&r,rec);
01684               log_nfa = log_nfa_new;
01685             }
01686         }
01687     }
01688 
01689   if( log_nfa > eps ) return log_nfa;
01690 
01691   /* try to reduce one side of the rectangle */
01692   rect_copy(rec,&r);
01693   for(n=0; n<5; n++)
01694     {
01695       if( (r.width - delta) >= 0.5 )
01696         {
01697           r.x1 += -r.dy * delta_2;
01698           r.y1 +=  r.dx * delta_2;
01699           r.x2 += -r.dy * delta_2;
01700           r.y2 +=  r.dx * delta_2;
01701           r.width -= delta;
01702           log_nfa_new = rect_nfa(&r,angles,logNT);
01703           if( log_nfa_new > log_nfa )
01704             {
01705               rect_copy(&r,rec);
01706               log_nfa = log_nfa_new;
01707             }
01708         }
01709     }
01710 
01711   if( log_nfa > eps ) return log_nfa;
01712 
01713   /* try to reduce the other side of the rectangle */
01714   rect_copy(rec,&r);
01715   for(n=0; n<5; n++)
01716     {
01717       if( (r.width - delta) >= 0.5 )
01718         {
01719           r.x1 -= -r.dy * delta_2;
01720           r.y1 -=  r.dx * delta_2;
01721           r.x2 -= -r.dy * delta_2;
01722           r.y2 -=  r.dx * delta_2;
01723           r.width -= delta;
01724           log_nfa_new = rect_nfa(&r,angles,logNT);
01725           if( log_nfa_new > log_nfa )
01726             {
01727               rect_copy(&r,rec);
01728               log_nfa = log_nfa_new;
01729             }
01730         }
01731     }
01732 
01733   if( log_nfa > eps ) return log_nfa;
01734 
01735   /* try even finer precisions */
01736   rect_copy(rec,&r);
01737   for(n=0; n<5; n++)
01738     {
01739       r.p /= 2.0;
01740       r.prec = r.p * M_PI;
01741       log_nfa_new = rect_nfa(&r,angles,logNT);
01742       if( log_nfa_new > log_nfa )
01743         {
01744           log_nfa = log_nfa_new;
01745           rect_copy(&r,rec);
01746         }
01747     }
01748 
01749   return log_nfa;
01750 }
01751 
01752 /*----------------------------------------------------------------------------*/
01753 /** Reduce the region size, by elimination the points far from the
01754     starting point, until that leads to rectangle with the right
01755     density of region points or to discard the region if too small.
01756  */
01757 static int reduce_region_radius( struct point * reg, int * reg_size,
01758                                  image_double modgrad, double reg_angle,
01759                                  double prec, double p, struct rect * rec,
01760                                  image_char used, image_double angles,
01761                                  double density_th )
01762 {
01763   double density,rad1,rad2,rad,xc,yc;
01764   int i;
01765 
01766   /* check parameters */
01767   if( reg == NULL ) error("reduce_region_radius: invalid pointer 'reg'.");
01768   if( reg_size == NULL )
01769     error("reduce_region_radius: invalid pointer 'reg_size'.");
01770   if( prec < 0.0 ) error("reduce_region_radius: 'prec' must be positive.");
01771   if( rec == NULL ) error("reduce_region_radius: invalid pointer 'rec'.");
01772   if( used == NULL || used->data == NULL )
01773     error("reduce_region_radius: invalid image 'used'.");
01774   if( angles == NULL || angles->data == NULL )
01775     error("reduce_region_radius: invalid image 'angles'.");
01776 
01777   /* compute region points density */
01778   density = (double) *reg_size /
01779                          ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width );
01780 
01781   /* if the density criterion is satisfied there is nothing to do */
01782   if( density >= density_th ) return TRUE;
01783 
01784   /* compute region's radius */
01785   xc = (double) reg[0].x;
01786   yc = (double) reg[0].y;
01787   rad1 = dist( xc, yc, rec->x1, rec->y1 );
01788   rad2 = dist( xc, yc, rec->x2, rec->y2 );
01789   rad = rad1 > rad2 ? rad1 : rad2;
01790 
01791   /* while the density criterion is not satisfied, remove farther pixels */
01792   while( density < density_th )
01793     {
01794       rad *= 0.75; /* reduce region's radius to 75% of its value */
01795 
01796       /* remove points from the region and update 'used' map */
01797       for(i=0; i<*reg_size; i++)
01798         if( dist( xc, yc, (double) reg[i].x, (double) reg[i].y ) > rad )
01799           {
01800             /* point not kept, mark it as NOTUSED */
01801             used->data[ reg[i].x + reg[i].y * used->xsize ] = NOTUSED;
01802             /* remove point from the region */
01803             reg[i].x = reg[*reg_size-1].x; /* if i==*reg_size-1 copy itself */
01804             reg[i].y = reg[*reg_size-1].y;
01805             --(*reg_size);
01806             --i; /* to avoid skipping one point */
01807           }
01808 
01809       /* reject if the region is too small.
01810          2 is the minimal region size for 'region2rect' to work. */
01811       if( *reg_size < 2 ) return FALSE;
01812 
01813       /* re-compute rectangle */
01814       region2rect(reg,*reg_size,modgrad,reg_angle,prec,p,rec);
01815 
01816       /* re-compute region points density */
01817       density = (double) *reg_size /
01818                          ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width );
01819     }
01820 
01821   /* if this point is reached, the density criterion is satisfied */
01822   return TRUE;
01823 }
01824 
01825 /*----------------------------------------------------------------------------*/
01826 /** Refine a rectangle.
01827 
01828     For that, an estimation of the angle tolerance is performed by the
01829     standard deviation of the angle at points near the region's
01830     starting point. Then, a new region is grown starting from the same
01831     point, but using the estimated angle tolerance. If this fails to
01832     produce a rectangle with the right density of region points,
01833     'reduce_region_radius' is called to try to satisfy this condition.
01834  */
01835 static int refine( struct point * reg, int * reg_size, image_double modgrad,
01836                    double reg_angle, double prec, double p, struct rect * rec,
01837                    image_char used, image_double angles, double density_th )
01838 {
01839   double angle,ang_d,mean_angle,tau,density,xc,yc,ang_c,sum,s_sum;
01840   int i,n;
01841 
01842   /* check parameters */
01843   if( reg == NULL ) error("refine: invalid pointer 'reg'.");
01844   if( reg_size == NULL ) error("refine: invalid pointer 'reg_size'.");
01845   if( prec < 0.0 ) error("refine: 'prec' must be positive.");
01846   if( rec == NULL ) error("refine: invalid pointer 'rec'.");
01847   if( used == NULL || used->data == NULL )
01848     error("refine: invalid image 'used'.");
01849   if( angles == NULL || angles->data == NULL )
01850     error("refine: invalid image 'angles'.");
01851 
01852   /* compute region points density */
01853   density = (double) *reg_size /
01854                          ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width );
01855 
01856   /* if the density criterion is satisfied there is nothing to do */
01857   if( density >= density_th ) return TRUE;
01858 
01859   /*------ First try: reduce angle tolerance ------*/
01860 
01861   /* compute the new mean angle and tolerance */
01862   xc = (double) reg[0].x;
01863   yc = (double) reg[0].y;
01864   ang_c = angles->data[ reg[0].x + reg[0].y * angles->xsize ];
01865   sum = s_sum = 0.0;
01866   n = 0;
01867   for(i=0; i<*reg_size; i++)
01868     {
01869       used->data[ reg[i].x + reg[i].y * used->xsize ] = NOTUSED;
01870       if( dist( xc, yc, (double) reg[i].x, (double) reg[i].y ) < rec->width )
01871         {
01872           angle = angles->data[ reg[i].x + reg[i].y * angles->xsize ];
01873           ang_d = angle_diff_signed(angle,ang_c);
01874           sum += ang_d;
01875           s_sum += ang_d * ang_d;
01876           ++n;
01877         }
01878     }
01879   mean_angle = sum / (double) n;
01880   tau = 2.0 * sqrt( (s_sum - 2.0 * mean_angle * sum) / (double) n
01881                          + mean_angle*mean_angle ); /* 2 * standard deviation */
01882 
01883   /* find a new region from the same starting point and new angle tolerance */
01884   region_grow(reg[0].x,reg[0].y,angles,reg,reg_size,&reg_angle,used,tau);
01885 
01886   /* if the region is too small, reject */
01887   if( *reg_size < 2 ) return FALSE;
01888 
01889   /* re-compute rectangle */
01890   region2rect(reg,*reg_size,modgrad,reg_angle,prec,p,rec);
01891 
01892   /* re-compute region points density */
01893   density = (double) *reg_size /
01894                       ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width );
01895 
01896   /*------ Second try: reduce region radius ------*/
01897   if( density < density_th )
01898     return reduce_region_radius( reg, reg_size, modgrad, reg_angle, prec, p,
01899                                  rec, used, angles, density_th );
01900 
01901   /* if this point is reached, the density criterion is satisfied */
01902   return TRUE;
01903 }
01904 
01905 
01906 /*----------------------------------------------------------------------------*/
01907 /*-------------------------- Line Segment Detector ---------------------------*/
01908 /*----------------------------------------------------------------------------*/
01909 
01910 /*----------------------------------------------------------------------------*/
01911 /** LSD full interface.
01912  */
01913 ntuple_list LineSegmentDetection( image_double image, double scale,
01914                                   double sigma_scale, double quant,
01915                                   double ang_th, double eps, double density_th,
01916                                   int n_bins, double max_grad,
01917                                   image_int * region )
01918 {
01919   ntuple_list out = new_ntuple_list(5);
01920   image_double scaled_image,angles,modgrad;
01921   image_char used;
01922   struct coorlist * list_p;
01923   void * mem_p;
01924   struct rect rec;
01925   struct point * reg;
01926   int reg_size,min_reg_size,i;
01927   unsigned int xsize,ysize;
01928   double rho,reg_angle,prec,p,log_nfa,logNT;
01929   int ls_count = 0;                   /* line segments are numbered 1,2,3,... */
01930 
01931 
01932   /* check parameters */
01933   if( image==NULL || image->data==NULL || image->xsize==0 || image->ysize==0 )
01934     error("invalid image input.");
01935   if( scale <= 0.0 ) error("'scale' value must be positive.");
01936   if( sigma_scale <= 0.0 ) error("'sigma_scale' value must be positive.");
01937   if( quant < 0.0 ) error("'quant' value must be positive.");
01938   if( ang_th <= 0.0 || ang_th >= 180.0 )
01939     error("'ang_th' value must be in the range (0,180).");
01940   if( density_th < 0.0 || density_th > 1.0 )
01941     error("'density_th' value must be in the range [0,1].");
01942   if( n_bins <= 0 ) error("'n_bins' value must be positive.");
01943   if( max_grad <= 0.0 ) error("'max_grad' value must be positive.");
01944 
01945 
01946   /* angle tolerance */
01947   prec = M_PI * ang_th / 180.0;
01948   p = ang_th / 180.0;
01949   rho = quant / sin(prec); /* gradient magnitude threshold */
01950 
01951 
01952   /* scale image (if necessary) and compute angle at each pixel */
01953   if( scale != 1.0 )
01954     {
01955       scaled_image = gaussian_sampler( image, scale, sigma_scale );
01956       angles = ll_angle( scaled_image, rho, &list_p, &mem_p,
01957                          &modgrad, (unsigned int) n_bins, max_grad );
01958       free_image_double(scaled_image);
01959     }
01960   else
01961     angles = ll_angle( image, rho, &list_p, &mem_p, &modgrad,
01962                        (unsigned int) n_bins, max_grad );
01963   xsize = angles->xsize;
01964   ysize = angles->ysize;
01965   logNT = 5.0 * ( log10( (double) xsize ) + log10( (double) ysize ) ) / 2.0;
01966   min_reg_size = (int) (-logNT/log10(p)); /* minimal number of points in region
01967                                              that can give a meaningful event */
01968 
01969 
01970   /* initialize some structures */
01971   if( region != NULL ) /* image to output pixel region number, if asked */
01972     *region = new_image_int_ini(angles->xsize,angles->ysize,0);
01973   used = new_image_char_ini(xsize,ysize,NOTUSED);
01974   reg = (struct point *) calloc( (size_t) (xsize*ysize), sizeof(struct point) );
01975   if( reg == NULL ) error("not enough memory!");
01976 
01977 
01978   /* search for line segments */
01979   for(; list_p != NULL; list_p = list_p->next )
01980     if( used->data[ list_p->x + list_p->y * used->xsize ] == NOTUSED &&
01981         angles->data[ list_p->x + list_p->y * angles->xsize ] != NOTDEF )
01982        /* there is no risk of double comparison problems here
01983           because we are only interested in the exact NOTDEF value */
01984       {
01985         /* find the region of connected point and ~equal angle */
01986         region_grow( list_p->x, list_p->y, angles, reg, &reg_size,
01987                      &reg_angle, used, prec );
01988 
01989         /* reject small regions */
01990         if( reg_size < min_reg_size ) continue;
01991 
01992         /* construct rectangular approximation for the region */
01993         region2rect(reg,reg_size,modgrad,reg_angle,prec,p,&rec);
01994 
01995         /* Check if the rectangle exceeds the minimal density of
01996            region points. If not, try to improve the region.
01997            The rectangle will be rejected if the final one does
01998            not fulfill the minimal density condition.
01999            This is an addition to the original LSD algorithm published in
02000            "LSD: A Fast Line Segment Detector with a False Detection Control"
02001            by R. Grompone von Gioi, J. Jakubowicz, J.M. Morel, and G. Randall.
02002            The original algorithm is obtained with density_th = 0.0.
02003          */
02004         if( !refine( reg, &reg_size, modgrad, reg_angle,
02005                      prec, p, &rec, used, angles, density_th ) ) continue;
02006 
02007         /* compute NFA value */
02008         log_nfa = rect_improve(&rec,angles,logNT,eps);
02009         if( log_nfa <= eps ) continue;
02010 
02011         /* A New Line Segment was found! */
02012         ++ls_count;  /* increase line segment counter */
02013 
02014         /*
02015            The gradient was computed with a 2x2 mask, its value corresponds to
02016            points with an offset of (0.5,0.5), that should be added to output.
02017            The coordinates origin is at the center of pixel (0,0).
02018          */
02019         rec.x1 += 0.5; rec.y1 += 0.5;
02020         rec.x2 += 0.5; rec.y2 += 0.5;
02021 
02022         /* scale the result values if a subsampling was performed */
02023         if( scale != 1.0 )
02024           {
02025             rec.x1 /= scale; rec.y1 /= scale;
02026             rec.x2 /= scale; rec.y2 /= scale;
02027             rec.width /= scale;
02028           }
02029 
02030         /* add line segment found to output */
02031         add_5tuple(out, rec.x1, rec.y1, rec.x2, rec.y2, rec.width);
02032 
02033         /* add region number to 'region' image if needed */
02034         if( region != NULL )
02035           for(i=0; i<reg_size; i++)
02036             (*region)->data[reg[i].x+reg[i].y*(*region)->xsize] = ls_count;
02037       }
02038 
02039 
02040   /* free memory */
02041   free_image_double(angles);
02042   free_image_double(modgrad);
02043   free_image_char(used);
02044   free( (void *) reg );
02045   free( (void *) mem_p );
02046 
02047   return out;
02048 }
02049 
02050 /*----------------------------------------------------------------------------*/
02051 /** LSD Simple Interface with Scale.
02052  */
02053 ntuple_list lsd_scale(image_double image, double scale)
02054 {
02055   /* LSD parameters */
02056   double sigma_scale = 0.6; /* Sigma for Gaussian filter is computed as
02057                                 sigma = sigma_scale/scale.                    */
02058   double quant = 2.0;       /* Bound to the quantization error on the
02059                                 gradient norm.                                */
02060   double ang_th = 22.5;     /* Gradient angle tolerance in degrees.           */
02061   double eps = 0.0;         /* Detection threshold, -log10(NFA).              */
02062   double density_th = 0.7;  /* Minimal density of region points in rectangle. */
02063   int n_bins = 1024;        /* Number of bins in pseudo-ordering of gradient
02064                                modulus.                                       */
02065   double max_grad = 255.0;  /* Gradient modulus in the highest bin. The
02066                                default value corresponds to the highest
02067                                gradient modulus on images with gray
02068                                levels in [0,255].                             */
02069 
02070   return LineSegmentDetection( image, scale, sigma_scale, quant, ang_th, eps,
02071                                density_th, n_bins, max_grad, NULL );
02072 }
02073 
02074 /*----------------------------------------------------------------------------*/
02075 /** LSD Simple Interface.
02076  */
02077 ntuple_list lsd(image_double image)
02078 {
02079   /* LSD parameters */
02080   double scale = 0.8;       /* Scale the image by Gaussian filter to 'scale'. */
02081 
02082   return lsd_scale(image,scale);
02083 }
02084 /*----------------------------------------------------------------------------*/

Generated on Fri Dec 3 10:18:18 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/lsd_8c.html ================================================ LSD: lsd.c File Reference

lsd.c File Reference


Detailed Description

LSD module code.

Author:
rafael grompone von gioi (grompone@gmail.com)

Definition in file lsd.c.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
#include <float.h>
#include "lsd.h"

Include dependency graph for lsd.c:

Include dependency graph

Go to the source code of this file.

Data Structures

struct  coorlist
 Chained list of coordinates. More...

struct  point
 A point (or pixel). More...

struct  rect
 Rectangle structure: line segment with width. More...

struct  rect_iter
 Rectangle points iterator. More...


Defines

#define M_LN10   2.30258509299404568402
 ln(10)

#define M_PI   3.14159265358979323846
 PI.

#define FALSE   0
#define TRUE   1
#define NOTDEF   -1024.0
 Label for pixels with undefined gradient.

#define M_3_2_PI   4.71238898038
 3/2 pi

#define M_2__PI   6.28318530718
 2 pi

#define NOTUSED   0
 Label for pixels not used in yet.

#define USED   1
 Label for pixels already used in detection.

#define RELATIVE_ERROR_FACTOR   100.0
 Doubles relative error factor.

#define log_gamma(x)   ((x)>15.0?log_gamma_windschitl(x):log_gamma_lanczos(x))
 Computes the natural logarithm of the absolute value of the gamma function of x.

#define TABSIZE   100000
 Size of the table to store already computed inverse values.


Functions

void error (char *msg)
 Fatal error, print a message to standard-error output and exit.

int double_equal (double a, double b)
 Compare doubles by relative error.

double dist (double x1, double y1, double x2, double y2)
 Computes Euclidean distance between point (x1,y1) and point (x2,y2).

void free_ntuple_list (ntuple_list in)
 Free memory used in n-tuple 'in'.

ntuple_list new_ntuple_list (unsigned int dim)
 Create an n-tuple list and allocate memory for one element.

void enlarge_ntuple_list (ntuple_list n_tuple)
 Enlarge the allocated memory of an n-tuple list.

void add_5tuple (ntuple_list out, double v1, double v2, double v3, double v4, double v5)
 Add a 5-tuple to an n-tuple list.

void free_image_char (image_char i)
 Free memory used in image_char 'i'.

image_char new_image_char (unsigned int xsize, unsigned int ysize)
 Create a new image_char of size 'xsize' times 'ysize'.

image_char new_image_char_ini (unsigned int xsize, unsigned int ysize, unsigned char fill_value)
 Create a new image_char of size 'xsize' times 'ysize', initialized to the value 'fill_value'.

void free_image_int (image_int i)
 Free memory used in image_int 'i'.

image_int new_image_int (unsigned int xsize, unsigned int ysize)
 Create a new image_int of size 'xsize' times 'ysize'.

image_int new_image_int_ini (unsigned int xsize, unsigned int ysize, int fill_value)
 Create a new image_int of size 'xsize' times 'ysize', initialized to the value 'fill_value'.

void free_image_double (image_double i)
 Free memory used in image_double 'i'.

image_double new_image_double (unsigned int xsize, unsigned int ysize)
 Create a new image_double of size 'xsize' times 'ysize'.

image_double new_image_double_ini (unsigned int xsize, unsigned int ysize, double fill_value)
 Create a new image_double of size 'xsize' times 'ysize', initialized to the value 'fill_value'.

void gaussian_kernel (ntuple_list kernel, double sigma, double mean)
 Compute a Gaussian kernel of length 'kernel->dim', standard deviation 'sigma', and centered at value 'mean'.

image_double gaussian_sampler (image_double in, double scale, double sigma_scale)
 Scale the input image 'in' by a factor 'scale' by Gaussian sub-sampling.

image_double ll_angle (image_double in, double threshold, struct coorlist **list_p, void **mem_p, image_double *modgrad, unsigned int n_bins, double max_grad)
 Computes the direction of the level line of 'in' at each point.

int isaligned (int x, int y, image_double angles, double theta, double prec)
 Is point (x,y) aligned to angle theta, up to precision 'prec'?

double angle_diff (double a, double b)
 Absolute value angle difference.

double angle_diff_signed (double a, double b)
 Signed angle difference.

double log_gamma_lanczos (double x)
 Computes the natural logarithm of the absolute value of the gamma function of x using the Lanczos approximation.

double log_gamma_windschitl (double x)
 Computes the natural logarithm of the absolute value of the gamma function of x using Windschitl method.

double nfa (int n, int k, double p, double logNT)
 Computes -log10(NFA).

void rect_copy (struct rect *in, struct rect *out)
 Copy one rectangle structure to another.

double inter_low (double x, double x1, double y1, double x2, double y2)
 Interpolate y value corresponding to 'x' value given, in the line 'x1,y1' to 'x2,y2'; if 'x1=x2' return the smaller of 'y1' and 'y2'.

double inter_hi (double x, double x1, double y1, double x2, double y2)
 Interpolate y value corresponding to 'x' value given, in the line 'x1,y1' to 'x2,y2'; if 'x1=x2' return the larger of 'y1' and 'y2'.

void ri_del (rect_iter *iter)
 Free memory used by a rectangle iterator.

int ri_end (rect_iter *i)
 Check if the iterator finished the full iteration.

void ri_inc (rect_iter *i)
 Increment a rectangle iterator.

rect_iterri_ini (struct rect *r)
 Create and initialize a rectangle iterator.

double rect_nfa (struct rect *rec, image_double angles, double logNT)
 Compute a rectangle's NFA value.

double get_theta (struct point *reg, int reg_size, double x, double y, image_double modgrad, double reg_angle, double prec)
 Compute region's angle as the principal inertia axis of the region.

void region2rect (struct point *reg, int reg_size, image_double modgrad, double reg_angle, double prec, double p, struct rect *rec)
 Computes a rectangle that covers a region of points.

void region_grow (int x, int y, image_double angles, struct point *reg, int *reg_size, double *reg_angle, image_char used, double prec)
 Build a region of pixels that share the same angle, up to a tolerance 'prec', starting at point (x,y).

double rect_improve (struct rect *rec, image_double angles, double logNT, double eps)
 Try some rectangles variations to improve NFA value.

int reduce_region_radius (struct point *reg, int *reg_size, image_double modgrad, double reg_angle, double prec, double p, struct rect *rec, image_char used, image_double angles, double density_th)
 Reduce the region size, by elimination the points far from the starting point, until that leads to rectangle with the right density of region points or to discard the region if too small.

int refine (struct point *reg, int *reg_size, image_double modgrad, double reg_angle, double prec, double p, struct rect *rec, image_char used, image_double angles, double density_th)
 Refine a rectangle.

ntuple_list LineSegmentDetection (image_double image, double scale, double sigma_scale, double quant, double ang_th, double eps, double density_th, int n_bins, double max_grad, image_int *region)
 LSD Full Interface.

ntuple_list lsd_scale (image_double image, double scale)
 LSD Simple Interface with Scale.

ntuple_list lsd (image_double image)
 LSD Simple Interface.


Define Documentation

#define FALSE   0
 

Definition at line 89 of file lsd.c.

Referenced by isaligned(), reduce_region_radius(), and refine().

#define log_gamma  )     ((x)>15.0?log_gamma_windschitl(x):log_gamma_lanczos(x))
 

Computes the natural logarithm of the absolute value of the gamma function of x.

When x>15 use log_gamma_windschitl(), otherwise use log_gamma_lanczos().

Definition at line 913 of file lsd.c.

Referenced by nfa().

#define M_2__PI   6.28318530718
 

2 pi

Definition at line 103 of file lsd.c.

Referenced by angle_diff(), angle_diff_signed(), and isaligned().

#define M_3_2_PI   4.71238898038
 

3/2 pi

Definition at line 100 of file lsd.c.

Referenced by isaligned().

#define M_LN10   2.30258509299404568402
 

ln(10)

Definition at line 80 of file lsd.c.

Referenced by nfa().

#define M_PI   3.14159265358979323846
 

PI.

Definition at line 85 of file lsd.c.

Referenced by angle_diff(), angle_diff_signed(), get_theta(), LineSegmentDetection(), and rect_improve().

#define NOTDEF   -1024.0
 

Label for pixels with undefined gradient.

Definition at line 97 of file lsd.c.

Referenced by isaligned(), LineSegmentDetection(), and ll_angle().

#define NOTUSED   0
 

Label for pixels not used in yet.

Definition at line 106 of file lsd.c.

Referenced by LineSegmentDetection(), reduce_region_radius(), and refine().

#define RELATIVE_ERROR_FACTOR   100.0
 

Doubles relative error factor.

Definition at line 142 of file lsd.c.

Referenced by double_equal().

#define TABSIZE   100000
 

Size of the table to store already computed inverse values.

Definition at line 918 of file lsd.c.

Referenced by nfa().

#define TRUE   1
 

Definition at line 93 of file lsd.c.

Referenced by double_equal(), reduce_region_radius(), and refine().

#define USED   1
 

Label for pixels already used in detection.

Definition at line 109 of file lsd.c.

Referenced by region_grow().


Function Documentation

void add_5tuple ntuple_list  out,
double  v1,
double  v2,
double  v3,
double  v4,
double  v5
[static]
 

Add a 5-tuple to an n-tuple list.

Definition at line 250 of file lsd.c.

References ntuple_list_s::dim, enlarge_ntuple_list(), error(), ntuple_list_s::max_size, ntuple_list, ntuple_list_s::size, and ntuple_list_s::values.

Referenced by LineSegmentDetection().

00252 {
00253   /* check parameters */
00254   if( out == NULL ) error("add_5tuple: invalid n-tuple input.");
00255   if( out->dim != 5 ) error("add_5tuple: the n-tuple must be a 5-tuple.");
00256 
00257   /* if needed, alloc more tuples to 'out' */
00258   if( out->size == out->max_size ) enlarge_ntuple_list(out);
00259   if( out->values == NULL ) error("add_5tuple: invalid n-tuple input.");
00260 
00261   /* add new 5-tuple */
00262   out->values[ out->size * out->dim + 0 ] = v1;
00263   out->values[ out->size * out->dim + 1 ] = v2;
00264   out->values[ out->size * out->dim + 2 ] = v3;
00265   out->values[ out->size * out->dim + 3 ] = v4;
00266   out->values[ out->size * out->dim + 4 ] = v5;
00267 
00268   /* update number of tuples counter */
00269   out->size++;
00270 }

Here is the call graph for this function:

double angle_diff double  a,
double  b
[static]
 

Absolute value angle difference.

Definition at line 819 of file lsd.c.

References M_2__PI, and M_PI.

Referenced by get_theta().

00820 {
00821   a -= b;
00822   while( a <= -M_PI ) a += M_2__PI;
00823   while( a >   M_PI ) a -= M_2__PI;
00824   if( a < 0.0 ) a = -a;
00825   return a;
00826 }

double angle_diff_signed double  a,
double  b
[static]
 

Signed angle difference.

Definition at line 831 of file lsd.c.

References M_2__PI, and M_PI.

Referenced by refine().

00832 {
00833   a -= b;
00834   while( a <= -M_PI ) a += M_2__PI;
00835   while( a >   M_PI ) a -= M_2__PI;
00836   return a;
00837 }

double dist double  x1,
double  y1,
double  x2,
double  y2
[static]
 

Computes Euclidean distance between point (x1,y1) and point (x2,y2).

Definition at line 181 of file lsd.c.

Referenced by reduce_region_radius(), and refine().

00182 {
00183   return sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) );
00184 }

int double_equal double  a,
double  b
[static]
 

Compare doubles by relative error.

The resulting rounding error after floating point computations depend on the specific operations done. The same number computed by different algorithms could present different rounding errors. For a useful comparison, an estimation of the relative rounding error should be considered and compared to a factor times EPS. The factor should be related to the cumulated rounding error in the chain of computation. Here, as a simplification, a fixed factor is used.

Definition at line 155 of file lsd.c.

References RELATIVE_ERROR_FACTOR, and TRUE.

Referenced by get_theta(), inter_hi(), inter_low(), and nfa().

00156 {
00157   double abs_diff,aa,bb,abs_max;
00158 
00159   /* trivial case */
00160   if( a == b ) return TRUE;
00161 
00162   abs_diff = fabs(a-b);
00163   aa = fabs(a);
00164   bb = fabs(b);
00165   abs_max = aa > bb ? aa : bb;
00166 
00167   /* DBL_MIN is the smallest normalized number, thus, the smallest
00168      number whose relative error is bounded by DBL_EPSILON. For
00169      smaller numbers, the same quantization steps as for DBL_MIN
00170      are used. Then, for smaller numbers, a meaningful "relative"
00171      error should be computed by dividing the difference by DBL_MIN. */
00172   if( abs_max < DBL_MIN ) abs_max = DBL_MIN;
00173 
00174   /* equal if relative error <= factor x eps */
00175   return (abs_diff / abs_max) <= (RELATIVE_ERROR_FACTOR * DBL_EPSILON);
00176 }

void enlarge_ntuple_list ntuple_list  n_tuple  )  [static]
 

Enlarge the allocated memory of an n-tuple list.

Definition at line 232 of file lsd.c.

References ntuple_list_s::dim, error(), ntuple_list_s::max_size, ntuple_list, and ntuple_list_s::values.

Referenced by add_5tuple(), and gaussian_kernel().

00233 {
00234   /* check parameters */
00235   if( n_tuple == NULL || n_tuple->values == NULL || n_tuple->max_size == 0 )
00236     error("enlarge_ntuple_list: invalid n-tuple.");
00237 
00238   /* duplicate number of tuples */
00239   n_tuple->max_size *= 2;
00240 
00241   /* realloc memory */
00242   n_tuple->values = (double *) realloc( (void *) n_tuple->values,
00243                       n_tuple->dim * n_tuple->max_size * sizeof(double) );
00244   if( n_tuple->values == NULL ) error("not enough memory.");
00245 }

Here is the call graph for this function:

void error char *  msg  )  [static]
 

Fatal error, print a message to standard-error output and exit.

Definition at line 133 of file lsd.c.

Referenced by add_5tuple(), enlarge_ntuple_list(), free_image_char(), free_image_double(), free_image_int(), free_ntuple_list(), gaussian_kernel(), gaussian_sampler(), get_theta(), inter_hi(), inter_low(), isaligned(), LineSegmentDetection(), ll_angle(), new_image_char(), new_image_char_ini(), new_image_double(), new_image_int(), new_ntuple_list(), nfa(), rect_copy(), rect_nfa(), reduce_region_radius(), refine(), region2rect(), region_grow(), ri_del(), ri_end(), ri_inc(), and ri_ini().

00134 {
00135   fprintf(stderr,"LSD Error: %s\n",msg);
00136   exit(EXIT_FAILURE);
00137 }

void free_image_char image_char  i  ) 
 

Free memory used in image_char 'i'.

Definition at line 280 of file lsd.c.

References image_char_s::data, error(), and image_char.

Referenced by LineSegmentDetection().

00281 {
00282   if( i == NULL || i->data == NULL )
00283     error("free_image_char: invalid input image.");
00284   free( (void *) i->data );
00285   free( (void *) i );
00286 }

Here is the call graph for this function:

void free_image_double image_double  i  ) 
 

Free memory used in image_double 'i'.

Definition at line 387 of file lsd.c.

References image_double_s::data, error(), and image_double.

Referenced by gaussian_sampler(), and LineSegmentDetection().

00388 {
00389   if( i == NULL || i->data == NULL )
00390     error("free_image_double: invalid input image.");
00391   free( (void *) i->data );
00392   free( (void *) i );
00393 }

Here is the call graph for this function:

void free_image_int image_int  i  ) 
 

Free memory used in image_int 'i'.

Definition at line 336 of file lsd.c.

References image_int_s::data, error(), and image_int.

00337 {
00338   if( i == NULL || i->data == NULL )
00339     error("free_image_int: invalid input image.");
00340   free( (void *) i->data );
00341   free( (void *) i );
00342 }

Here is the call graph for this function:

void free_ntuple_list ntuple_list  in  ) 
 

Free memory used in n-tuple 'in'.

Definition at line 194 of file lsd.c.

References error(), ntuple_list, and ntuple_list_s::values.

Referenced by gaussian_sampler().

00195 {
00196   if( in == NULL || in->values == NULL )
00197     error("free_ntuple_list: invalid n-tuple input.");
00198   free( (void *) in->values );
00199   free( (void *) in );
00200 }

Here is the call graph for this function:

void gaussian_kernel ntuple_list  kernel,
double  sigma,
double  mean
[static]
 

Compute a Gaussian kernel of length 'kernel->dim', standard deviation 'sigma', and centered at value 'mean'.

For example, if mean=0.5, the Gaussian will be centered in the middle point between values 'kernel->values[0]' and 'kernel->values[1]'.

Definition at line 448 of file lsd.c.

References ntuple_list_s::dim, enlarge_ntuple_list(), error(), ntuple_list_s::max_size, ntuple_list, ntuple_list_s::size, and ntuple_list_s::values.

Referenced by gaussian_sampler().

00449 {
00450   double sum = 0.0;
00451   double val;
00452   unsigned int i;
00453 
00454   /* check parameters */
00455   if( kernel == NULL || kernel->values == NULL )
00456     error("gaussian_kernel: invalid n-tuple 'kernel'.");
00457   if( sigma <= 0.0 ) error("gaussian_kernel: 'sigma' must be positive.");
00458 
00459   /* compute Gaussian kernel */
00460   if( kernel->max_size < 1 ) enlarge_ntuple_list(kernel);
00461   kernel->size = 1;
00462   for(i=0;i<kernel->dim;i++)
00463     {
00464       val = ( (double) i - mean ) / sigma;
00465       kernel->values[i] = exp( -0.5 * val * val );
00466       sum += kernel->values[i];
00467     }
00468 
00469   /* normalization */
00470   if( sum >= 0.0 ) for(i=0;i<kernel->dim;i++) kernel->values[i] /= sum;
00471 }

Here is the call graph for this function:

image_double gaussian_sampler image_double  in,
double  scale,
double  sigma_scale
[static]
 

Scale the input image 'in' by a factor 'scale' by Gaussian sub-sampling.

For example, scale=0.8 will give a result at 80% of the original size.

The image is convolved with a Gaussian kernel

\[ G(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2+y^2}{2\sigma^2}} \]

before the sub-sampling to prevent aliasing.

The standard deviation sigma given by:

  • sigma = sigma_scale / scale, if scale < 1.0
  • sigma = sigma_scale, if scale >= 1.0

To be able to sub-sample at non-integer steps, some interpolation is needed. In this implementation, the interpolation is done by the Gaussian kernel, so both operations (filtering and sampling) are done at the same time. The Gaussian kernel is computed centered on the coordinates of the required sample. In this way, when applied, it gives directly the result of convolving the image with the kernel and interpolated to that particular position.

A fast algorithm is done using the separability of the Gaussian kernel. Applying the 2D Gaussian kernel is equivalent to applying first a horizontal 1D Gaussian kernel and then a vertical 1D Gaussian kernel (or the other way round). The reason is that

\[ G(x,y) = G(x) * G(y) \]

where

\[ G(x) = \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{x^2}{2\sigma^2}}. \]

The algorithm first apply a combined Gaussian kernel and sampling in the x axis, and then the combined Gaussian kernel and sampling in the y axis.

Definition at line 511 of file lsd.c.

References image_double_s::data, ntuple_list_s::dim, error(), free_image_double(), free_ntuple_list(), gaussian_kernel(), image_double, new_image_double(), new_ntuple_list(), ntuple_list, ntuple_list_s::values, image_double_s::xsize, and image_double_s::ysize.

Referenced by LineSegmentDetection().

00513 {
00514   image_double aux,out;
00515   ntuple_list kernel;
00516   unsigned int N,M,h,n,x,y,i;
00517   int xc,yc,j,double_x_size,double_y_size;
00518   double sigma,xx,yy,sum,prec;
00519 
00520   /* check parameters */
00521   if( in == NULL || in->data == NULL || in->xsize == 0 || in->ysize == 0 )
00522     error("gaussian_sampler: invalid image.");
00523   if( scale <= 0.0 ) error("gaussian_sampler: 'scale' must be positive.");
00524   if( sigma_scale <= 0.0 )
00525     error("gaussian_sampler: 'sigma_scale' must be positive.");
00526 
00527   /* get memory for images */
00528   if( in->xsize * scale > (double) UINT_MAX ||
00529       in->ysize * scale > (double) UINT_MAX )
00530     error("gaussian_sampler: the output image size exceeds the handled size.");
00531   N = (unsigned int) floor( in->xsize * scale );
00532   M = (unsigned int) floor( in->ysize * scale );
00533   aux = new_image_double(N,in->ysize);
00534   out = new_image_double(N,M);
00535 
00536   /* sigma, kernel size and memory for the kernel */
00537   sigma = scale < 1.0 ? sigma_scale / scale : sigma_scale;
00538   /*
00539      The size of the kernel is selected to guarantee that the
00540      the first discarded term is at least 10^prec times smaller
00541      than the central value. For that, h should be larger than x, with
00542        e^(-x^2/2sigma^2) = 1/10^prec.
00543      Then,
00544        x = sigma * sqrt( 2 * prec * ln(10) ).
00545    */
00546   prec = 3.0;
00547   h = (unsigned int) ceil( sigma * sqrt( 2.0 * prec * log(10.0) ) );
00548   n = 1+2*h; /* kernel size */
00549   kernel = new_ntuple_list(n);
00550 
00551   /* auxiliary double image size variables */
00552   double_x_size = (int) (2 * in->xsize);
00553   double_y_size = (int) (2 * in->ysize);
00554 
00555   /* First subsampling: x axis */
00556   for(x=0;x<aux->xsize;x++)
00557     {
00558       /*
00559          x   is the coordinate in the new image.
00560          xx  is the corresponding x-value in the original size image.
00561          xc  is the integer value, the pixel coordinate of xx.
00562        */
00563       xx = (double) x / scale;
00564       /* coordinate (0.0,0.0) is in the center of pixel (0,0),
00565          so the pixel with xc=0 get the values of xx from -0.5 to 0.5 */
00566       xc = (int) floor( xx + 0.5 );
00567       gaussian_kernel( kernel, sigma, (double) h + xx - (double) xc );
00568       /* the kernel must be computed for each x because the fine
00569          offset xx-xc is different in each case */
00570 
00571       for(y=0;y<aux->ysize;y++)
00572         {
00573           sum = 0.0;
00574           for(i=0;i<kernel->dim;i++)
00575             {
00576               j = xc - h + i;
00577 
00578               /* symmetry boundary condition */
00579               while( j < 0 ) j += double_x_size;
00580               while( j >= double_x_size ) j -= double_x_size;
00581               if( j >= (int) in->xsize ) j = double_x_size-1-j;
00582 
00583               sum += in->data[ j + y * in->xsize ] * kernel->values[i];
00584             }
00585           aux->data[ x + y * aux->xsize ] = sum;
00586         }
00587     }
00588 
00589   /* Second subsampling: y axis */
00590   for(y=0;y<out->ysize;y++)
00591     {
00592       /*
00593          y   is the coordinate in the new image.
00594          yy  is the corresponding x-value in the original size image.
00595          yc  is the integer value, the pixel coordinate of xx.
00596        */
00597       yy = (double) y / scale;
00598       /* coordinate (0.0,0.0) is in the center of pixel (0,0),
00599          so the pixel with yc=0 get the values of yy from -0.5 to 0.5 */
00600       yc = (int) floor( yy + 0.5 );
00601       gaussian_kernel( kernel, sigma, (double) h + yy - (double) yc );
00602       /* the kernel must be computed for each y because the fine
00603          offset yy-yc is different in each case */
00604 
00605       for(x=0;x<out->xsize;x++)
00606         {
00607           sum = 0.0;
00608           for(i=0;i<kernel->dim;i++)
00609             {
00610               j = yc - h + i;
00611 
00612               /* symmetry boundary condition */
00613               while( j < 0 ) j += double_y_size;
00614               while( j >= double_y_size ) j -= double_y_size;
00615               if( j >= (int) in->ysize ) j = double_y_size-1-j;
00616 
00617               sum += aux->data[ x + j * aux->xsize ] * kernel->values[i];
00618             }
00619           out->data[ x + y * out->xsize ] = sum;
00620         }
00621     }
00622 
00623   /* free memory */
00624   free_ntuple_list(kernel);
00625   free_image_double(aux);
00626 
00627   return out;
00628 }

Here is the call graph for this function:

double get_theta struct point reg,
int  reg_size,
double  x,
double  y,
image_double  modgrad,
double  reg_angle,
double  prec
[static]
 

Compute region's angle as the principal inertia axis of the region.

The following is the region inertia matrix A:

\[ A = \left(\begin{array}{cc} Ixx & Ixy \\ Ixy & Iyy \\ \end{array}\right) \]

where

Ixx = sum_i G(i).(y_i - cx)^2

Iyy = sum_i G(i).(x_i - cy)^2

Ixy = - sum_i G(i).(x_i - cx).(y_i - cy)

and

  • G(i) is the gradient norm at pixel i, used as pixel's weight.
  • x_i and y_i are the coordinates of pixel i.
  • cx and cy are the coordinates of the center of th region.

lambda1 and lambda2 are the eigenvalues of matrix A, with lambda1 >= lambda2. They are found by solving the characteristic polynomial:

det( lambda I - A) = 0

that gives:

lambda1 = ( Ixx + Iyy + sqrt( (Ixx-Iyy)^2 + 4.0*Ixy*Ixy) ) / 2

lambda2 = ( Ixx + Iyy - sqrt( (Ixx-Iyy)^2 + 4.0*Ixy*Ixy) ) / 2

To get the line segment direction we want to get the angle the eigenvector assotiated to the smaller eigenvalue. We have to solve a,b in:

a.Ixx + b.Ixy = a.lambda2

a.Ixy + b.Iyy = b.lambda2

We want the angle theta = atan(b/a). It can be computed with any of the two equations:

theta = atan( (lambda2-Ixx) / Ixy )

or

theta = atan( Ixy / (lambda2-Iyy) )

When |Ixx| > |Iyy| we use the first, otherwise the second (just to get better numeric precision).

Definition at line 1456 of file lsd.c.

References angle_diff(), image_double_s::data, double_equal(), error(), image_double, M_PI, point::x, image_double_s::xsize, and point::y.

Referenced by region2rect().

01458 {
01459   double lambda,theta,weight;
01460   double Ixx = 0.0;
01461   double Iyy = 0.0;
01462   double Ixy = 0.0;
01463   int i;
01464 
01465   /* check parameters */
01466   if( reg == NULL ) error("get_theta: invalid region.");
01467   if( reg_size <= 1 ) error("get_theta: region size <= 1.");
01468   if( modgrad == NULL || modgrad->data == NULL )
01469     error("get_theta: invalid 'modgrad'.");
01470   if( prec < 0.0 ) error("get_theta: 'prec' must be positive.");
01471 
01472   /* compute inertia matrix */
01473   for(i=0; i<reg_size; i++)
01474     {
01475       weight = modgrad->data[ reg[i].x + reg[i].y * modgrad->xsize ];
01476       Ixx += ( (double) reg[i].y - y ) * ( (double) reg[i].y - y ) * weight;
01477       Iyy += ( (double) reg[i].x - x ) * ( (double) reg[i].x - x ) * weight;
01478       Ixy -= ( (double) reg[i].x - x ) * ( (double) reg[i].y - y ) * weight;
01479     }
01480   if( double_equal(Ixx,0.0) && double_equal(Iyy,0.0) && double_equal(Ixy,0.0) )
01481     error("get_theta: null inertia matrix.");
01482 
01483   /* compute smallest eigenvalue */
01484   lambda = 0.5 * ( Ixx + Iyy - sqrt( (Ixx-Iyy)*(Ixx-Iyy) + 4.0*Ixy*Ixy ) );
01485 
01486   /* compute angle */
01487   theta = fabs(Ixx)>fabs(Iyy) ? atan2(lambda-Ixx,Ixy) : atan2(Ixy,lambda-Iyy);
01488 
01489   /* The previous procedure don't cares about orientation,
01490      so it could be wrong by 180 degrees. Here is corrected if necessary. */
01491   if( angle_diff(theta,reg_angle) > prec ) theta += M_PI;
01492 
01493   return theta;
01494 }

Here is the call graph for this function:

double inter_hi double  x,
double  x1,
double  y1,
double  x2,
double  y2
[static]
 

Interpolate y value corresponding to 'x' value given, in the line 'x1,y1' to 'x2,y2'; if 'x1=x2' return the larger of 'y1' and 'y2'.

The following restrictions are required:

  • x1 <= x2
  • x1 <= x
  • x <= x2

Definition at line 1187 of file lsd.c.

References double_equal(), and error().

Referenced by ri_inc().

01188 {
01189   /* check parameters */
01190   if( x1 > x2 || x < x1 || x > x2 )
01191     error("inter_hi: unsuitable input, 'x1>x2' or 'x<x1' or 'x>x2'.");
01192 
01193   /* interpolation */
01194   if( double_equal(x1,x2) && y1<y2 ) return y2;
01195   if( double_equal(x1,x2) && y1>y2 ) return y1;
01196   return y1 + (x-x1) * (y2-y1) / (x2-x1);
01197 }

Here is the call graph for this function:

double inter_low double  x,
double  x1,
double  y1,
double  x2,
double  y2
[static]
 

Interpolate y value corresponding to 'x' value given, in the line 'x1,y1' to 'x2,y2'; if 'x1=x2' return the smaller of 'y1' and 'y2'.

The following restrictions are required:

  • x1 <= x2
  • x1 <= x
  • x <= x2

Definition at line 1165 of file lsd.c.

References double_equal(), and error().

Referenced by ri_inc().

01166 {
01167   /* check parameters */
01168   if( x1 > x2 || x < x1 || x > x2 )
01169     error("inter_low: unsuitable input, 'x1>x2' or 'x<x1' or 'x>x2'.");
01170 
01171   /* interpolation */
01172   if( double_equal(x1,x2) && y1<y2 ) return y1;
01173   if( double_equal(x1,x2) && y1>y2 ) return y2;
01174   return y1 + (x-x1) * (y2-y1) / (x2-x1);
01175 }

Here is the call graph for this function:

int isaligned int  x,
int  y,
image_double  angles,
double  theta,
double  prec
[static]
 

Is point (x,y) aligned to angle theta, up to precision 'prec'?

Definition at line 781 of file lsd.c.

References image_double_s::data, error(), FALSE, image_double, M_2__PI, M_3_2_PI, NOTDEF, image_double_s::xsize, and image_double_s::ysize.

Referenced by rect_nfa(), and region_grow().

00783 {
00784   double a;
00785 
00786   /* check parameters */
00787   if( angles == NULL || angles->data == NULL )
00788     error("isaligned: invalid image 'angles'.");
00789   if( x < 0 || y < 0 || x >= (int) angles->xsize || y >= (int) angles->ysize )
00790     error("isaligned: (x,y) out of the image.");
00791   if( prec < 0.0 ) error("isaligned: 'prec' must be positive.");
00792 
00793   /* angle at pixel (x,y) */
00794   a = angles->data[ x + y * angles->xsize ];
00795 
00796   /* pixels whose level-line angle is not defined
00797      are considered as NON-aligned */
00798   if( a == NOTDEF ) return FALSE;  /* there is no need to call the function
00799                                       'double_equal' here because there is
00800                                       no risk of problems related to the
00801                                       comparison doubles, we are only
00802                                       interested in the exact NOTDEF value */
00803 
00804   /* it is assumed that 'theta' and 'a' are in the range [-pi,pi] */
00805   theta -= a;
00806   if( theta < 0.0 ) theta = -theta;
00807   if( theta > M_3_2_PI )
00808     {
00809       theta -= M_2__PI;
00810       if( theta < 0.0 ) theta = -theta;
00811     }
00812 
00813   return theta < prec;
00814 }

Here is the call graph for this function:

ntuple_list LineSegmentDetection image_double  image,
double  scale,
double  sigma_scale,
double  quant,
double  ang_th,
double  eps,
double  density_th,
int  n_bins,
double  max_grad,
image_int region
 

LSD Full Interface.

Parameters:
image Input image.
scale When different than 1.0, LSD will scale the image by Gaussian filtering. Example: is scale=0.8, the input image will be subsampled to 80% of its size, and then the line segment detector will be applied. Suggested value: 0.8
sigma_scale When scale!=1.0, the sigma of the Gaussian filter is: sigma = sigma_scale / scale, if scale < 1.0 sigma = sigma_scale, if scale >= 1.0 Suggested value: 0.6
quant Bound to the quantization error on the gradient norm. Example: if gray level is quantized to integer steps, the gradient (computed by finite differences) error due to quantization will be bounded by 2.0, as the worst case is when the error are 1 and -1, that gives an error of 2.0. Suggested value: 2.0
ang_th Gradient angle tolerance in the region growing algorithm, in degrees. Suggested value: 22.5
eps Detection threshold, -log10(NFA). The bigger, the more strict the detector is, and will result in less detections. (Note that the 'minus sign' makes that this behavior is opposite to the one of NFA.) The value -log10(NFA) is equivalent but more intuitive than NFA:
  • -1.0 corresponds to 10 mean false alarms
  • 0.0 corresponds to 1 mean false alarm
  • 1.0 corresponds to 0.1 mean false alarms
  • 2.0 corresponds to 0.01 mean false alarms
Suggested value: 0.0
density_th Minimal proportion of region points in a rectangle. Suggested value: 0.7
n_bins Number of bins used in the pseudo-ordering of gradient modulus. Suggested value: 1024
max_grad Gradient modulus in the highest bin. For example, for images with integer gray levels in [0,255], the maximum possible gradient value is 255.0. Suggested value: 255.0
region Optional output: an int image where the pixels used in some line support region are marked. Unused pixels have the value '0' while the used ones have the number of the line segment, numbered 1,2,3,... If desired, a non NULL pointer to an image_int should be used. The resulting image has the size of the image used for the processing, that is, the size of the input image scaled by the given factor 'scale'. Suggested value: NULL
Returns:
A 5-tuple list, where each 5-tuple corresponds to a detected line segment. The five values are:
  • x1,y1,x2,y2,width
for a line segment from (x1,y1) to (x2,y2) and a width 'width'.

Definition at line 1913 of file lsd.c.

References add_5tuple(), image_char_s::data, image_double_s::data, error(), free_image_char(), free_image_double(), gaussian_sampler(), image_char, image_double, image_int, ll_angle(), M_PI, new_image_char_ini(), new_image_int_ini(), new_ntuple_list(), NOTDEF, NOTUSED, ntuple_list, rect_improve(), refine(), region2rect(), region_grow(), rect::width, rect::x1, rect::x2, image_char_s::xsize, image_double_s::xsize, rect::y1, rect::y2, and image_double_s::ysize.

Referenced by lsd_scale().

01918 {
01919   ntuple_list out = new_ntuple_list(5);
01920   image_double scaled_image,angles,modgrad;
01921   image_char used;
01922   struct coorlist * list_p;
01923   void * mem_p;
01924   struct rect rec;
01925   struct point * reg;
01926   int reg_size,min_reg_size,i;
01927   unsigned int xsize,ysize;
01928   double rho,reg_angle,prec,p,log_nfa,logNT;
01929   int ls_count = 0;                   /* line segments are numbered 1,2,3,... */
01930 
01931 
01932   /* check parameters */
01933   if( image==NULL || image->data==NULL || image->xsize==0 || image->ysize==0 )
01934     error("invalid image input.");
01935   if( scale <= 0.0 ) error("'scale' value must be positive.");
01936   if( sigma_scale <= 0.0 ) error("'sigma_scale' value must be positive.");
01937   if( quant < 0.0 ) error("'quant' value must be positive.");
01938   if( ang_th <= 0.0 || ang_th >= 180.0 )
01939     error("'ang_th' value must be in the range (0,180).");
01940   if( density_th < 0.0 || density_th > 1.0 )
01941     error("'density_th' value must be in the range [0,1].");
01942   if( n_bins <= 0 ) error("'n_bins' value must be positive.");
01943   if( max_grad <= 0.0 ) error("'max_grad' value must be positive.");
01944 
01945 
01946   /* angle tolerance */
01947   prec = M_PI * ang_th / 180.0;
01948   p = ang_th / 180.0;
01949   rho = quant / sin(prec); /* gradient magnitude threshold */
01950 
01951 
01952   /* scale image (if necessary) and compute angle at each pixel */
01953   if( scale != 1.0 )
01954     {
01955       scaled_image = gaussian_sampler( image, scale, sigma_scale );
01956       angles = ll_angle( scaled_image, rho, &list_p, &mem_p,
01957                          &modgrad, (unsigned int) n_bins, max_grad );
01958       free_image_double(scaled_image);
01959     }
01960   else
01961     angles = ll_angle( image, rho, &list_p, &mem_p, &modgrad,
01962                        (unsigned int) n_bins, max_grad );
01963   xsize = angles->xsize;
01964   ysize = angles->ysize;
01965   logNT = 5.0 * ( log10( (double) xsize ) + log10( (double) ysize ) ) / 2.0;
01966   min_reg_size = (int) (-logNT/log10(p)); /* minimal number of points in region
01967                                              that can give a meaningful event */
01968 
01969 
01970   /* initialize some structures */
01971   if( region != NULL ) /* image to output pixel region number, if asked */
01972     *region = new_image_int_ini(angles->xsize,angles->ysize,0);
01973   used = new_image_char_ini(xsize,ysize,NOTUSED);
01974   reg = (struct point *) calloc( (size_t) (xsize*ysize), sizeof(struct point) );
01975   if( reg == NULL ) error("not enough memory!");
01976 
01977 
01978   /* search for line segments */
01979   for(; list_p != NULL; list_p = list_p->next )
01980     if( used->data[ list_p->x + list_p->y * used->xsize ] == NOTUSED &&
01981         angles->data[ list_p->x + list_p->y * angles->xsize ] != NOTDEF )
01982        /* there is no risk of double comparison problems here
01983           because we are only interested in the exact NOTDEF value */
01984       {
01985         /* find the region of connected point and ~equal angle */
01986         region_grow( list_p->x, list_p->y, angles, reg, &reg_size,
01987                      &reg_angle, used, prec );
01988 
01989         /* reject small regions */
01990         if( reg_size < min_reg_size ) continue;
01991 
01992         /* construct rectangular approximation for the region */
01993         region2rect(reg,reg_size,modgrad,reg_angle,prec,p,&rec);
01994 
01995         /* Check if the rectangle exceeds the minimal density of
01996            region points. If not, try to improve the region.
01997            The rectangle will be rejected if the final one does
01998            not fulfill the minimal density condition.
01999            This is an addition to the original LSD algorithm published in
02000            "LSD: A Fast Line Segment Detector with a False Detection Control"
02001            by R. Grompone von Gioi, J. Jakubowicz, J.M. Morel, and G. Randall.
02002            The original algorithm is obtained with density_th = 0.0.
02003          */
02004         if( !refine( reg, &reg_size, modgrad, reg_angle,
02005                      prec, p, &rec, used, angles, density_th ) ) continue;
02006 
02007         /* compute NFA value */
02008         log_nfa = rect_improve(&rec,angles,logNT,eps);
02009         if( log_nfa <= eps ) continue;
02010 
02011         /* A New Line Segment was found! */
02012         ++ls_count;  /* increase line segment counter */
02013 
02014         /*
02015            The gradient was computed with a 2x2 mask, its value corresponds to
02016            points with an offset of (0.5,0.5), that should be added to output.
02017            The coordinates origin is at the center of pixel (0,0).
02018          */
02019         rec.x1 += 0.5; rec.y1 += 0.5;
02020         rec.x2 += 0.5; rec.y2 += 0.5;
02021 
02022         /* scale the result values if a subsampling was performed */
02023         if( scale != 1.0 )
02024           {
02025             rec.x1 /= scale; rec.y1 /= scale;
02026             rec.x2 /= scale; rec.y2 /= scale;
02027             rec.width /= scale;
02028           }
02029 
02030         /* add line segment found to output */
02031         add_5tuple(out, rec.x1, rec.y1, rec.x2, rec.y2, rec.width);
02032 
02033         /* add region number to 'region' image if needed */
02034         if( region != NULL )
02035           for(i=0; i<reg_size; i++)
02036             (*region)->data[reg[i].x+reg[i].y*(*region)->xsize] = ls_count;
02037       }
02038 
02039 
02040   /* free memory */
02041   free_image_double(angles);
02042   free_image_double(modgrad);
02043   free_image_char(used);
02044   free( (void *) reg );
02045   free( (void *) mem_p );
02046 
02047   return out;
02048 }

Here is the call graph for this function:

image_double ll_angle image_double  in,
double  threshold,
struct coorlist **  list_p,
void **  mem_p,
image_double modgrad,
unsigned int  n_bins,
double  max_grad
[static]
 

Computes the direction of the level line of 'in' at each point.

The result is:

  • an image_double with the angle at each pixel, or NOTDEF if not defined.
  • the image_double 'modgrad' (a pointer is passed as argument) with the gradient magnitude at each point.
  • a list of pixels 'list_p' roughly ordered by decreasing gradient magnitude. (The order is made by classifying points into bins by gradient magnitude. The parameters 'n_bins' and 'max_grad' specify the number of bins and the gradient modulus at the highest bin. The pixels in the list would be in decreasing gradient magnitude, up to a precision of the size of the bins.)
  • a pointer 'mem_p' to the memory used by 'list_p' to be able to free the memory when it is not used anymore.

Definition at line 652 of file lsd.c.

References image_double_s::data, error(), image_double, new_image_double(), NOTDEF, image_double_s::xsize, and image_double_s::ysize.

Referenced by LineSegmentDetection().

00656 {
00657   image_double g;
00658   unsigned int n,p,x,y,adr,i;
00659   double com1,com2,gx,gy,norm,norm2;
00660   /* the rest of the variables are used for pseudo-ordering
00661      the gradient magnitude values */
00662   int list_count = 0;
00663   struct coorlist * list;
00664   struct coorlist ** range_l_s; /* array of pointers to start of bin list */
00665   struct coorlist ** range_l_e; /* array of pointers to end of bin list */
00666   struct coorlist * start;
00667   struct coorlist * end;
00668 
00669   /* check parameters */
00670   if( in == NULL || in->data == NULL || in->xsize == 0 || in->ysize == 0 )
00671     error("ll_angle: invalid image.");
00672   if( threshold < 0.0 ) error("ll_angle: 'threshold' must be positive.");
00673   if( list_p == NULL ) error("ll_angle: NULL pointer 'list_p'.");
00674   if( mem_p == NULL ) error("ll_angle: NULL pointer 'mem_p'.");
00675   if( modgrad == NULL ) error("ll_angle: NULL pointer 'modgrad'.");
00676   if( n_bins == 0 ) error("ll_angle: 'n_bins' must be positive.");
00677   if( max_grad <= 0.0 ) error("ll_angle: 'max_grad' must be positive.");
00678 
00679   /* image size shortcuts */
00680   n = in->ysize;
00681   p = in->xsize;
00682 
00683   /* allocate output image */
00684   g = new_image_double(in->xsize,in->ysize);
00685 
00686   /* get memory for the image of gradient modulus */
00687   *modgrad = new_image_double(in->xsize,in->ysize);
00688 
00689   /* get memory for "ordered" list of pixels */
00690   list = (struct coorlist *) calloc( (size_t) (n*p), sizeof(struct coorlist) );
00691   *mem_p = (void *) list;
00692   range_l_s = (struct coorlist **) calloc( (size_t) n_bins,
00693                                            sizeof(struct coorlist *) );
00694   range_l_e = (struct coorlist **) calloc( (size_t) n_bins,
00695                                            sizeof(struct coorlist *) );
00696   if( list == NULL || range_l_s == NULL || range_l_e == NULL )
00697     error("not enough memory.");
00698   for(i=0;i<n_bins;i++) range_l_s[i] = range_l_e[i] = NULL;
00699 
00700   /* 'undefined' on the down and right boundaries */
00701   for(x=0;x<p;x++) g->data[(n-1)*p+x] = NOTDEF;
00702   for(y=0;y<n;y++) g->data[p*y+p-1]   = NOTDEF;
00703 
00704   /* compute gradient on the remaining pixels */
00705   for(x=0;x<p-1;x++)
00706     for(y=0;y<n-1;y++)
00707       {
00708         adr = y*p+x;
00709 
00710         /*
00711            Norm 2 computation using 2x2 pixel window:
00712              A B
00713              C D
00714            and
00715              com1 = D-A,  com2 = B-C.
00716            Then
00717              gx = B+D - (A+C)   horizontal difference
00718              gy = C+D - (A+B)   vertical difference
00719            com1 and com2 are just to avoid 2 additions.
00720          */
00721         com1 = in->data[adr+p+1] - in->data[adr];
00722         com2 = in->data[adr+1]   - in->data[adr+p];
00723 
00724         gx = com1+com2; /* gradient x component */
00725         gy = com1-com2; /* gradient y component */
00726         norm2 = gx*gx+gy*gy;
00727         norm = sqrt( norm2 / 4.0 ); /* gradient norm */
00728 
00729         (*modgrad)->data[adr] = norm; /* store gradient norm */
00730 
00731         if( norm <= threshold ) /* norm too small, gradient no defined */
00732           g->data[adr] = NOTDEF; /* gradient angle not defined */
00733         else
00734           {
00735             /* gradient angle computation */
00736             g->data[adr] = atan2(gx,-gy);
00737 
00738             /* store the point in the right bin according to its norm */
00739             i = (unsigned int) (norm * (double) n_bins / max_grad);
00740             if( i >= n_bins ) i = n_bins-1;
00741             if( range_l_e[i] == NULL )
00742               range_l_s[i] = range_l_e[i] = list+list_count++;
00743             else
00744               {
00745                 range_l_e[i]->next = list+list_count;
00746                 range_l_e[i] = list+list_count++;
00747               }
00748             range_l_e[i]->x = (int) x;
00749             range_l_e[i]->y = (int) y;
00750             range_l_e[i]->next = NULL;
00751           }
00752       }
00753 
00754   /* Make the list of pixels (almost) ordered by norm value.
00755      It starts by the larger bin, so the list starts by the
00756      pixels with higher gradient value. Pixels would be ordered
00757      by norm value, up to a precision given by max_grad/n_bins.
00758    */
00759   for(i=n_bins-1; i>0 && range_l_s[i]==NULL; i--);
00760   start = range_l_s[i];
00761   end = range_l_e[i];
00762   if( start != NULL )
00763     for(i--;i>0; i--)
00764       if( range_l_s[i] != NULL )
00765         {
00766           end->next = range_l_s[i];
00767           end = range_l_e[i];
00768         }
00769   *list_p = start;
00770 
00771   /* free memory */
00772   free( (void *) range_l_s );
00773   free( (void *) range_l_e );
00774 
00775   return g;
00776 }

Here is the call graph for this function:

double log_gamma_lanczos double  x  )  [static]
 

Computes the natural logarithm of the absolute value of the gamma function of x using the Lanczos approximation.

See http://www.rskey.org/gamma.htm

The formula used is

\[ \Gamma(x) = \frac{ \sum_{n=0}^{N} q_n x^n }{ \Pi_{n=0}^{N} (x+n) } (x+5.5)^{x+0.5} e^{-(x+5.5)} \]

so

\[ \log\Gamma(x) = \log\left( \sum_{n=0}^{N} q_n x^n \right) + (x+0.5) \log(x+5.5) - (x+5.5) - \sum_{n=0}^{N} \log(x+n) \]

and q0 = 75122.6331530, q1 = 80916.6278952, q2 = 36308.2951477, q3 = 8687.24529705, q4 = 1168.92649479, q5 = 83.8676043424, q6 = 2.50662827511.

Definition at line 868 of file lsd.c.

00869 {
00870   static double q[7] = { 75122.6331530, 80916.6278952, 36308.2951477,
00871                          8687.24529705, 1168.92649479, 83.8676043424,
00872                          2.50662827511 };
00873   double a = (x+0.5) * log(x+5.5) - (x+5.5);
00874   double b = 0.0;
00875   int n;
00876 
00877   for(n=0;n<7;n++)
00878     {
00879       a -= log( x + (double) n );
00880       b += q[n] * pow( x, (double) n );
00881     }
00882   return a + log(b);
00883 }

double log_gamma_windschitl double  x  )  [static]
 

Computes the natural logarithm of the absolute value of the gamma function of x using Windschitl method.

See http://www.rskey.org/gamma.htm

The formula used is

\[ \Gamma(x) = \sqrt{\frac{2\pi}{x}} \left( \frac{x}{e} \sqrt{ x\sinh(1/x) + \frac{1}{810x^6} } \right)^x \]

so

\[ \log\Gamma(x) = 0.5\log(2\pi) + (x-0.5)\log(x) - x + 0.5x\log\left( x\sinh(1/x) + \frac{1}{810x^6} \right). \]

This formula is a good approximation when x > 15.

Definition at line 902 of file lsd.c.

00903 {
00904   return 0.918938533204673 + (x-0.5)*log(x) - x
00905          + 0.5*x*log( x*sinh(1/x) + 1/(810.0*pow(x,6.0)) );
00906 }

ntuple_list lsd image_double  image  ) 
 

LSD Simple Interface.

Parameters:
image Input image.
Returns:
a 5-tuple list of detected line segments.

Definition at line 2077 of file lsd.c.

References image_double, lsd_scale(), and ntuple_list.

02078 {
02079   /* LSD parameters */
02080   double scale = 0.8;       /* Scale the image by Gaussian filter to 'scale'. */
02081 
02082   return lsd_scale(image,scale);
02083 }

Here is the call graph for this function:

ntuple_list lsd_scale image_double  image,
double  scale
 

LSD Simple Interface with Scale.

Parameters:
image Input image.
scale When different than 1.0, LSD will scale the image by Gaussian filtering. Example: is scale=0.8, the input image will be subsampled to 80% of its size, and then the line segment detector will be applied. Suggested value: 0.8
Returns:
a 5-tuple list of detected line segments.

Definition at line 2053 of file lsd.c.

References image_double, LineSegmentDetection(), and ntuple_list.

Referenced by lsd().

02054 {
02055   /* LSD parameters */
02056   double sigma_scale = 0.6; /* Sigma for Gaussian filter is computed as
02057                                 sigma = sigma_scale/scale.                    */
02058   double quant = 2.0;       /* Bound to the quantization error on the
02059                                 gradient norm.                                */
02060   double ang_th = 22.5;     /* Gradient angle tolerance in degrees.           */
02061   double eps = 0.0;         /* Detection threshold, -log10(NFA).              */
02062   double density_th = 0.7;  /* Minimal density of region points in rectangle. */
02063   int n_bins = 1024;        /* Number of bins in pseudo-ordering of gradient
02064                                modulus.                                       */
02065   double max_grad = 255.0;  /* Gradient modulus in the highest bin. The
02066                                default value corresponds to the highest
02067                                gradient modulus on images with gray
02068                                levels in [0,255].                             */
02069 
02070   return LineSegmentDetection( image, scale, sigma_scale, quant, ang_th, eps,
02071                                density_th, n_bins, max_grad, NULL );
02072 }

Here is the call graph for this function:

image_char new_image_char unsigned int  xsize,
unsigned int  ysize
 

Create a new image_char of size 'xsize' times 'ysize'.

Definition at line 291 of file lsd.c.

References image_char_s::data, error(), image_char, image_char_s::xsize, and image_char_s::ysize.

Referenced by new_image_char_ini().

00292 {
00293   image_char image;
00294 
00295   /* check parameters */
00296   if( xsize == 0 || ysize == 0 ) error("new_image_char: invalid image size.");
00297 
00298   /* get memory */
00299   image = (image_char) malloc( sizeof(struct image_char_s) );
00300   if( image == NULL ) error("not enough memory.");
00301   image->data = (unsigned char *) calloc( (size_t) (xsize*ysize),
00302                                           sizeof(unsigned char) );
00303   if( image->data == NULL ) error("not enough memory.");
00304 
00305   /* set image size */
00306   image->xsize = xsize;
00307   image->ysize = ysize;
00308 
00309   return image;
00310 }

Here is the call graph for this function:

image_char new_image_char_ini unsigned int  xsize,
unsigned int  ysize,
unsigned char  fill_value
 

Create a new image_char of size 'xsize' times 'ysize', initialized to the value 'fill_value'.

Definition at line 316 of file lsd.c.

References image_char_s::data, error(), image_char, and new_image_char().

Referenced by LineSegmentDetection().

00318 {
00319   image_char image = new_image_char(xsize,ysize); /* create image */
00320   unsigned int N = xsize*ysize;
00321   unsigned int i;
00322 
00323   /* check parameters */
00324   if( image == NULL || image->data == NULL )
00325     error("new_image_char_ini: invalid image.");
00326 
00327   /* initialize */
00328   for(i=0; i<N; i++) image->data[i] = fill_value;
00329 
00330   return image;
00331 }

Here is the call graph for this function:

image_double new_image_double unsigned int  xsize,
unsigned int  ysize
 

Create a new image_double of size 'xsize' times 'ysize'.

Definition at line 398 of file lsd.c.

References image_double_s::data, error(), image_double, image_double_s::xsize, and image_double_s::ysize.

Referenced by gaussian_sampler(), ll_angle(), and new_image_double_ini().

00399 {
00400   image_double image;
00401 
00402   /* check parameters */
00403   if( xsize == 0 || ysize == 0 ) error("new_image_double: invalid image size.");
00404 
00405   /* get memory */
00406   image = (image_double) malloc( sizeof(struct image_double_s) );
00407   if( image == NULL ) error("not enough memory.");
00408   image->data = (double *) calloc( (size_t) (xsize*ysize), sizeof(double) );
00409   if( image->data == NULL ) error("not enough memory.");
00410 
00411   /* set image size */
00412   image->xsize = xsize;
00413   image->ysize = ysize;
00414 
00415   return image;
00416 }

Here is the call graph for this function:

image_double new_image_double_ini unsigned int  xsize,
unsigned int  ysize,
double  fill_value
 

Create a new image_double of size 'xsize' times 'ysize', initialized to the value 'fill_value'.

Definition at line 422 of file lsd.c.

References image_double_s::data, image_double, and new_image_double().

00424 {
00425   image_double image = new_image_double(xsize,ysize); /* create image */
00426   unsigned int N = xsize*ysize;
00427   unsigned int i;
00428 
00429   /* initialize */
00430   for(i=0; i<N; i++) image->data[i] = fill_value;
00431 
00432   return image;
00433 }

Here is the call graph for this function:

image_int new_image_int unsigned int  xsize,
unsigned int  ysize
 

Create a new image_int of size 'xsize' times 'ysize'.

Definition at line 347 of file lsd.c.

References image_int_s::data, error(), image_int, image_int_s::xsize, and image_int_s::ysize.

Referenced by new_image_int_ini().

00348 {
00349   image_int image;
00350 
00351   /* check parameters */
00352   if( xsize == 0 || ysize == 0 ) error("new_image_int: invalid image size.");
00353 
00354   /* get memory */
00355   image = (image_int) malloc( sizeof(struct image_int_s) );
00356   if( image == NULL ) error("not enough memory.");
00357   image->data = (int *) calloc( (size_t) (xsize*ysize), sizeof(int) );
00358   if( image->data == NULL ) error("not enough memory.");
00359 
00360   /* set image size */
00361   image->xsize = xsize;
00362   image->ysize = ysize;
00363 
00364   return image;
00365 }

Here is the call graph for this function:

image_int new_image_int_ini unsigned int  xsize,
unsigned int  ysize,
int  fill_value
 

Create a new image_int of size 'xsize' times 'ysize', initialized to the value 'fill_value'.

Definition at line 371 of file lsd.c.

References image_int_s::data, image_int, and new_image_int().

Referenced by LineSegmentDetection().

00373 {
00374   image_int image = new_image_int(xsize,ysize); /* create image */
00375   unsigned int N = xsize*ysize;
00376   unsigned int i;
00377 
00378   /* initialize */
00379   for(i=0; i<N; i++) image->data[i] = fill_value;
00380 
00381   return image;
00382 }

Here is the call graph for this function:

ntuple_list new_ntuple_list unsigned int  dim  ) 
 

Create an n-tuple list and allocate memory for one element.

Parameters:
dim the dimension (n) of the n-tuple.

Definition at line 206 of file lsd.c.

References ntuple_list_s::dim, error(), ntuple_list_s::max_size, ntuple_list, ntuple_list_s::size, and ntuple_list_s::values.

Referenced by gaussian_sampler(), and LineSegmentDetection().

00207 {
00208   ntuple_list n_tuple;
00209 
00210   /* check parameters */
00211   if( dim == 0 ) error("new_ntuple_list: 'dim' must be positive.");
00212 
00213   /* get memory for list structure */
00214   n_tuple = (ntuple_list) malloc( sizeof(struct ntuple_list_s) );
00215   if( n_tuple == NULL ) error("not enough memory.");
00216 
00217   /* initialize list */
00218   n_tuple->size = 0;
00219   n_tuple->max_size = 1;
00220   n_tuple->dim = dim;
00221 
00222   /* get memory for tuples */
00223   n_tuple->values = (double *) malloc( dim*n_tuple->max_size * sizeof(double) );
00224   if( n_tuple->values == NULL ) error("not enough memory.");
00225 
00226   return n_tuple;
00227 }

Here is the call graph for this function:

double nfa int  n,
int  k,
double  p,
double  logNT
[static]
 

Computes -log10(NFA).

NFA stands for Number of False Alarms:

\[ \mathrm{NFA} = NT \cdot B(n,k,p) \]

  • NT - number of tests
  • B(n,k,p) - tail of binomial distribution with parameters n,k and p:

    \[ B(n,k,p) = \sum_{j=k}^n \left(\begin{array}{c}n\\j\end{array}\right) p^{j} (1-p)^{n-j} \]

The value -log10(NFA) is equivalent but more intuitive than NFA:

  • -1 corresponds to 10 mean false alarms
  • 0 corresponds to 1 mean false alarm
  • 1 corresponds to 0.1 mean false alarms
  • 2 corresponds to 0.01 mean false alarms
  • ...

Used this way, the bigger the value, better the detection, and a logarithmic scale is used.

Parameters:
n,k,p binomial parameters.
logNT logarithm of Number of Tests
The computation is based in the gamma function by the following relation:

\[ \left(\begin{array}{c}n\\k\end{array}\right) = \frac{ \Gamma(n+1) }{ \Gamma(k+1) \cdot \Gamma(n-k+1) }. \]

We use efficient algorithms to compute the logarithm of the gamma function.

To make the computation faster, not all the sum is computed, part of the terms are neglected based on a bound to the error obtained (an error of 10% in the result is accepted).

Definition at line 962 of file lsd.c.

References double_equal(), error(), log_gamma, M_LN10, and TABSIZE.

Referenced by rect_nfa().

00963 {
00964   static double inv[TABSIZE];   /* table to keep computed inverse values */
00965   double tolerance = 0.1;       /* an error of 10% in the result is accepted */
00966   double log1term,term,bin_term,mult_term,bin_tail,err,p_term;
00967   int i;
00968 
00969   /* check parameters */
00970   if( n<0 || k<0 || k>n || p<=0.0 || p>=1.0 )
00971     error("nfa: wrong n, k or p values.");
00972 
00973   /* trivial cases */
00974   if( n==0 || k==0 ) return -logNT;
00975   if( n==k ) return -logNT - (double) n * log10(p);
00976 
00977   /* probability term */
00978   p_term = p / (1.0-p);
00979 
00980   /* compute the first term of the series */
00981   /*
00982      binomial_tail(n,k,p) = sum_{i=k}^n bincoef(n,i) * p^i * (1-p)^{n-i}
00983      where bincoef(n,i) are the binomial coefficients.
00984      But
00985        bincoef(n,k) = gamma(n+1) / ( gamma(k+1) * gamma(n-k+1) ).
00986      We use this to compute the first term. Actually the log of it.
00987    */
00988   log1term = log_gamma( (double) n + 1.0 ) - log_gamma( (double) k + 1.0 )
00989            - log_gamma( (double) (n-k) + 1.0 )
00990            + (double) k * log(p) + (double) (n-k) * log(1.0-p);
00991   term = exp(log1term);
00992 
00993   /* in some cases no more computations are needed */
00994   if( double_equal(term,0.0) )              /* the first term is almost zero */
00995     {
00996       if( (double) k > (double) n * p )     /* at begin or end of the tail?  */
00997         return -log1term / M_LN10 - logNT;  /* end: use just the first term  */
00998       else
00999         return -logNT;                      /* begin: the tail is roughly 1  */
01000     }
01001 
01002   /* compute more terms if needed */
01003   bin_tail = term;
01004   for(i=k+1;i<=n;i++)
01005     {
01006       /*
01007          As
01008            term_i = bincoef(n,i) * p^i * (1-p)^(n-i)
01009          and
01010            bincoef(n,i)/bincoef(n,i-1) = n-1+1 / i,
01011          then,
01012            term_i / term_i-1 = (n-i+1)/i * p/(1-p)
01013          and
01014            term_i = term_i-1 * (n-i+1)/i * p/(1-p).
01015          1/i is stored in a table as they are computed,
01016          because divisions are expensive.
01017          p/(1-p) is computed only once and stored in 'p_term'.
01018        */
01019       bin_term = (double) (n-i+1) * ( i<TABSIZE ?
01020                    ( inv[i]!=0.0 ? inv[i] : ( inv[i] = 1.0 / (double) i ) ) :
01021                    1.0 / (double) i );
01022 
01023       mult_term = bin_term * p_term;
01024       term *= mult_term;
01025       bin_tail += term;
01026       if(bin_term<1.0)
01027         {
01028           /* When bin_term<1 then mult_term_j<mult_term_i for j>i.
01029              Then, the error on the binomial tail when truncated at
01030              the i term can be bounded by a geometric series of form
01031              term_i * sum mult_term_i^j.                            */
01032           err = term * ( ( 1.0 - pow( mult_term, (double) (n-i+1) ) ) /
01033                          (1.0-mult_term) - 1.0 );
01034 
01035           /* One wants an error at most of tolerance*final_result, or:
01036              tolerance * abs(-log10(bin_tail)-logNT).
01037              Now, the error that can be accepted on bin_tail is
01038              given by tolerance*final_result divided by the derivative
01039              of -log10(x) when x=bin_tail. that is:
01040              tolerance * abs(-log10(bin_tail)-logNT) / (1/bin_tail)
01041              Finally, we truncate the tail if the error is less than:
01042              tolerance * abs(-log10(bin_tail)-logNT) * bin_tail        */
01043           if( err < tolerance * fabs(-log10(bin_tail)-logNT) * bin_tail ) break;
01044         }
01045     }
01046   return -log10(bin_tail) - logNT;
01047 }

Here is the call graph for this function:

void rect_copy struct rect in,
struct rect out
[static]
 

Copy one rectangle structure to another.

Definition at line 1071 of file lsd.c.

References rect::dx, rect::dy, error(), rect::p, rect::prec, rect::theta, rect::width, rect::x, rect::x1, rect::x2, rect::y, rect::y1, and rect::y2.

Referenced by rect_improve().

01072 {
01073   /* check parameters */
01074   if( in == NULL || out == NULL ) error("rect_copy: invalid 'in' or 'out'.");
01075 
01076   /* copy values */
01077   out->x1 = in->x1;
01078   out->y1 = in->y1;
01079   out->x2 = in->x2;
01080   out->y2 = in->y2;
01081   out->width = in->width;
01082   out->x = in->x;
01083   out->y = in->y;
01084   out->theta = in->theta;
01085   out->dx = in->dx;
01086   out->dy = in->dy;
01087   out->prec = in->prec;
01088   out->p = in->p;
01089 }

Here is the call graph for this function:

double rect_improve struct rect rec,
image_double  angles,
double  logNT,
double  eps
[static]
 

Try some rectangles variations to improve NFA value.

Only if the rectangle is not meaningful (i.e., log_nfa <= eps).

Definition at line 1644 of file lsd.c.

References rect::dx, rect::dy, image_double, M_PI, rect::p, rect::prec, rect_copy(), rect_nfa(), rect::width, rect::x1, rect::x2, rect::y1, and rect::y2.

Referenced by LineSegmentDetection().

01646 {
01647   struct rect r;
01648   double log_nfa,log_nfa_new;
01649   double delta = 0.5;
01650   double delta_2 = delta / 2.0;
01651   int n;
01652 
01653   log_nfa = rect_nfa(rec,angles,logNT);
01654 
01655   if( log_nfa > eps ) return log_nfa;
01656 
01657   /* try finer precisions */
01658   rect_copy(rec,&r);
01659   for(n=0; n<5; n++)
01660     {
01661       r.p /= 2.0;
01662       r.prec = r.p * M_PI;
01663       log_nfa_new = rect_nfa(&r,angles,logNT);
01664       if( log_nfa_new > log_nfa )
01665         {
01666           log_nfa = log_nfa_new;
01667           rect_copy(&r,rec);
01668         }
01669     }
01670 
01671   if( log_nfa > eps ) return log_nfa;
01672 
01673   /* try to reduce width */
01674   rect_copy(rec,&r);
01675   for(n=0; n<5; n++)
01676     {
01677       if( (r.width - delta) >= 0.5 )
01678         {
01679           r.width -= delta;
01680           log_nfa_new = rect_nfa(&r,angles,logNT);
01681           if( log_nfa_new > log_nfa )
01682             {
01683               rect_copy(&r,rec);
01684               log_nfa = log_nfa_new;
01685             }
01686         }
01687     }
01688 
01689   if( log_nfa > eps ) return log_nfa;
01690 
01691   /* try to reduce one side of the rectangle */
01692   rect_copy(rec,&r);
01693   for(n=0; n<5; n++)
01694     {
01695       if( (r.width - delta) >= 0.5 )
01696         {
01697           r.x1 += -r.dy * delta_2;
01698           r.y1 +=  r.dx * delta_2;
01699           r.x2 += -r.dy * delta_2;
01700           r.y2 +=  r.dx * delta_2;
01701           r.width -= delta;
01702           log_nfa_new = rect_nfa(&r,angles,logNT);
01703           if( log_nfa_new > log_nfa )
01704             {
01705               rect_copy(&r,rec);
01706               log_nfa = log_nfa_new;
01707             }
01708         }
01709     }
01710 
01711   if( log_nfa > eps ) return log_nfa;
01712 
01713   /* try to reduce the other side of the rectangle */
01714   rect_copy(rec,&r);
01715   for(n=0; n<5; n++)
01716     {
01717       if( (r.width - delta) >= 0.5 )
01718         {
01719           r.x1 -= -r.dy * delta_2;
01720           r.y1 -=  r.dx * delta_2;
01721           r.x2 -= -r.dy * delta_2;
01722           r.y2 -=  r.dx * delta_2;
01723           r.width -= delta;
01724           log_nfa_new = rect_nfa(&r,angles,logNT);
01725           if( log_nfa_new > log_nfa )
01726             {
01727               rect_copy(&r,rec);
01728               log_nfa = log_nfa_new;
01729             }
01730         }
01731     }
01732 
01733   if( log_nfa > eps ) return log_nfa;
01734 
01735   /* try even finer precisions */
01736   rect_copy(rec,&r);
01737   for(n=0; n<5; n++)
01738     {
01739       r.p /= 2.0;
01740       r.prec = r.p * M_PI;
01741       log_nfa_new = rect_nfa(&r,angles,logNT);
01742       if( log_nfa_new > log_nfa )
01743         {
01744           log_nfa = log_nfa_new;
01745           rect_copy(&r,rec);
01746         }
01747     }
01748 
01749   return log_nfa;
01750 }

Here is the call graph for this function:

double rect_nfa struct rect rec,
image_double  angles,
double  logNT
[static]
 

Compute a rectangle's NFA value.

Definition at line 1370 of file lsd.c.

References error(), image_double, isaligned(), nfa(), rect::p, rect::prec, ri_del(), ri_end(), ri_inc(), ri_ini(), rect::theta, rect_iter::x, image_double_s::xsize, rect_iter::y, and image_double_s::ysize.

Referenced by rect_improve().

01371 {
01372   rect_iter * i;
01373   int pts = 0;
01374   int alg = 0;
01375 
01376   /* check parameters */
01377   if( rec == NULL ) error("rect_nfa: invalid rectangle.");
01378   if( angles == NULL ) error("rect_nfa: invalid 'angles'.");
01379 
01380   /* compute the total number of pixels and of aligned points in 'rec' */
01381   for(i=ri_ini(rec); !ri_end(i); ri_inc(i)) /* rectangle iterator */
01382     if( i->x >= 0 && i->y >= 0 &&
01383         i->x < (int) angles->xsize && i->y < (int) angles->ysize )
01384       {
01385         ++pts; /* total number of pixels counter */
01386         if( isaligned(i->x, i->y, angles, rec->theta, rec->prec) )
01387           ++alg; /* aligned points counter */
01388       }
01389   ri_del(i); /* delete iterator */
01390 
01391   return nfa(pts,alg,rec->p,logNT); /* compute NFA value */
01392 }

Here is the call graph for this function:

int reduce_region_radius struct point reg,
int *  reg_size,
image_double  modgrad,
double  reg_angle,
double  prec,
double  p,
struct rect rec,
image_char  used,
image_double  angles,
double  density_th
[static]
 

Reduce the region size, by elimination the points far from the starting point, until that leads to rectangle with the right density of region points or to discard the region if too small.

Definition at line 1757 of file lsd.c.

References image_double_s::data, image_char_s::data, dist(), error(), FALSE, image_char, image_double, NOTUSED, region2rect(), TRUE, rect::width, point::x, rect::x1, rect::x2, image_char_s::xsize, point::y, rect::y1, and rect::y2.

Referenced by refine().

01762 {
01763   double density,rad1,rad2,rad,xc,yc;
01764   int i;
01765 
01766   /* check parameters */
01767   if( reg == NULL ) error("reduce_region_radius: invalid pointer 'reg'.");
01768   if( reg_size == NULL )
01769     error("reduce_region_radius: invalid pointer 'reg_size'.");
01770   if( prec < 0.0 ) error("reduce_region_radius: 'prec' must be positive.");
01771   if( rec == NULL ) error("reduce_region_radius: invalid pointer 'rec'.");
01772   if( used == NULL || used->data == NULL )
01773     error("reduce_region_radius: invalid image 'used'.");
01774   if( angles == NULL || angles->data == NULL )
01775     error("reduce_region_radius: invalid image 'angles'.");
01776 
01777   /* compute region points density */
01778   density = (double) *reg_size /
01779                          ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width );
01780 
01781   /* if the density criterion is satisfied there is nothing to do */
01782   if( density >= density_th ) return TRUE;
01783 
01784   /* compute region's radius */
01785   xc = (double) reg[0].x;
01786   yc = (double) reg[0].y;
01787   rad1 = dist( xc, yc, rec->x1, rec->y1 );
01788   rad2 = dist( xc, yc, rec->x2, rec->y2 );
01789   rad = rad1 > rad2 ? rad1 : rad2;
01790 
01791   /* while the density criterion is not satisfied, remove farther pixels */
01792   while( density < density_th )
01793     {
01794       rad *= 0.75; /* reduce region's radius to 75% of its value */
01795 
01796       /* remove points from the region and update 'used' map */
01797       for(i=0; i<*reg_size; i++)
01798         if( dist( xc, yc, (double) reg[i].x, (double) reg[i].y ) > rad )
01799           {
01800             /* point not kept, mark it as NOTUSED */
01801             used->data[ reg[i].x + reg[i].y * used->xsize ] = NOTUSED;
01802             /* remove point from the region */
01803             reg[i].x = reg[*reg_size-1].x; /* if i==*reg_size-1 copy itself */
01804             reg[i].y = reg[*reg_size-1].y;
01805             --(*reg_size);
01806             --i; /* to avoid skipping one point */
01807           }
01808 
01809       /* reject if the region is too small.
01810          2 is the minimal region size for 'region2rect' to work. */
01811       if( *reg_size < 2 ) return FALSE;
01812 
01813       /* re-compute rectangle */
01814       region2rect(reg,*reg_size,modgrad,reg_angle,prec,p,rec);
01815 
01816       /* re-compute region points density */
01817       density = (double) *reg_size /
01818                          ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width );
01819     }
01820 
01821   /* if this point is reached, the density criterion is satisfied */
01822   return TRUE;
01823 }

Here is the call graph for this function:

int refine struct point reg,
int *  reg_size,
image_double  modgrad,
double  reg_angle,
double  prec,
double  p,
struct rect rec,
image_char  used,
image_double  angles,
double  density_th
[static]
 

Refine a rectangle.

For that, an estimation of the angle tolerance is performed by the standard deviation of the angle at points near the region's starting point. Then, a new region is grown starting from the same point, but using the estimated angle tolerance. If this fails to produce a rectangle with the right density of region points, 'reduce_region_radius' is called to try to satisfy this condition.

Definition at line 1835 of file lsd.c.

References angle_diff_signed(), image_double_s::data, image_char_s::data, dist(), error(), FALSE, image_char, image_double, NOTUSED, reduce_region_radius(), region2rect(), region_grow(), TRUE, rect::width, point::x, rect::x1, rect::x2, image_char_s::xsize, image_double_s::xsize, point::y, rect::y1, and rect::y2.

Referenced by LineSegmentDetection().

01838 {
01839   double angle,ang_d,mean_angle,tau,density,xc,yc,ang_c,sum,s_sum;
01840   int i,n;
01841 
01842   /* check parameters */
01843   if( reg == NULL ) error("refine: invalid pointer 'reg'.");
01844   if( reg_size == NULL ) error("refine: invalid pointer 'reg_size'.");
01845   if( prec < 0.0 ) error("refine: 'prec' must be positive.");
01846   if( rec == NULL ) error("refine: invalid pointer 'rec'.");
01847   if( used == NULL || used->data == NULL )
01848     error("refine: invalid image 'used'.");
01849   if( angles == NULL || angles->data == NULL )
01850     error("refine: invalid image 'angles'.");
01851 
01852   /* compute region points density */
01853   density = (double) *reg_size /
01854                          ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width );
01855 
01856   /* if the density criterion is satisfied there is nothing to do */
01857   if( density >= density_th ) return TRUE;
01858 
01859   /*------ First try: reduce angle tolerance ------*/
01860 
01861   /* compute the new mean angle and tolerance */
01862   xc = (double) reg[0].x;
01863   yc = (double) reg[0].y;
01864   ang_c = angles->data[ reg[0].x + reg[0].y * angles->xsize ];
01865   sum = s_sum = 0.0;
01866   n = 0;
01867   for(i=0; i<*reg_size; i++)
01868     {
01869       used->data[ reg[i].x + reg[i].y * used->xsize ] = NOTUSED;
01870       if( dist( xc, yc, (double) reg[i].x, (double) reg[i].y ) < rec->width )
01871         {
01872           angle = angles->data[ reg[i].x + reg[i].y * angles->xsize ];
01873           ang_d = angle_diff_signed(angle,ang_c);
01874           sum += ang_d;
01875           s_sum += ang_d * ang_d;
01876           ++n;
01877         }
01878     }
01879   mean_angle = sum / (double) n;
01880   tau = 2.0 * sqrt( (s_sum - 2.0 * mean_angle * sum) / (double) n
01881                          + mean_angle*mean_angle ); /* 2 * standard deviation */
01882 
01883   /* find a new region from the same starting point and new angle tolerance */
01884   region_grow(reg[0].x,reg[0].y,angles,reg,reg_size,&reg_angle,used,tau);
01885 
01886   /* if the region is too small, reject */
01887   if( *reg_size < 2 ) return FALSE;
01888 
01889   /* re-compute rectangle */
01890   region2rect(reg,*reg_size,modgrad,reg_angle,prec,p,rec);
01891 
01892   /* re-compute region points density */
01893   density = (double) *reg_size /
01894                       ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width );
01895 
01896   /*------ Second try: reduce region radius ------*/
01897   if( density < density_th )
01898     return reduce_region_radius( reg, reg_size, modgrad, reg_angle, prec, p,
01899                                  rec, used, angles, density_th );
01900 
01901   /* if this point is reached, the density criterion is satisfied */
01902   return TRUE;
01903 }

Here is the call graph for this function:

void region2rect struct point reg,
int  reg_size,
image_double  modgrad,
double  reg_angle,
double  prec,
double  p,
struct rect rec
[static]
 

Computes a rectangle that covers a region of points.

Definition at line 1499 of file lsd.c.

References image_double_s::data, rect::dx, rect::dy, error(), get_theta(), image_double, rect::p, rect::prec, rect::theta, rect::width, rect::x, point::x, rect::x1, rect::x2, image_double_s::xsize, rect::y, point::y, rect::y1, and rect::y2.

Referenced by LineSegmentDetection(), reduce_region_radius(), and refine().

01502 {
01503   double x,y,dx,dy,l,w,theta,weight,sum,l_min,l_max,w_min,w_max;
01504   int i;
01505 
01506   /* check parameters */
01507   if( reg == NULL ) error("region2rect: invalid region.");
01508   if( reg_size <= 1 ) error("region2rect: region size <= 1.");
01509   if( modgrad == NULL || modgrad->data == NULL )
01510     error("region2rect: invalid image 'modgrad'.");
01511   if( rec == NULL ) error("region2rect: invalid 'rec'.");
01512 
01513   /* center of the region:
01514 
01515      It is computed as the weighted sum of the coordinates
01516      of all the pixels in the region. The norm of the gradient
01517      is used as the weight of a pixel. The sum is as follows:
01518        cx = \sum_i G(i).x_i
01519        cy = \sum_i G(i).y_i
01520      where G(i) is the norm of the gradient of pixel i
01521      and x_i,y_i are its coordinates.
01522    */
01523   x = y = sum = 0.0;
01524   for(i=0; i<reg_size; i++)
01525     {
01526       weight = modgrad->data[ reg[i].x + reg[i].y * modgrad->xsize ];
01527       x += (double) reg[i].x * weight;
01528       y += (double) reg[i].y * weight;
01529       sum += weight;
01530     }
01531   if( sum <= 0.0 ) error("region2rect: weights sum equal to zero.");
01532   x /= sum;
01533   y /= sum;
01534 
01535   /* theta */
01536   theta = get_theta(reg,reg_size,x,y,modgrad,reg_angle,prec);
01537 
01538   /* length and width:
01539 
01540      'l' and 'w' are computed as the distance from the center of the
01541      region to pixel i, projected along the rectangle axis (dx,dy) and
01542      to the orthogonal axis (-dy,dx), respectively.
01543 
01544      The length of the rectangle goes from l_min to l_max, where l_min
01545      and l_max are the minimum and maximum values of l in the region.
01546      Analogously, the width is selected from w_min to w_max, where
01547      w_min and w_max are the minimum and maximum of w for the pixels
01548      in the region.
01549    */
01550   dx = cos(theta);
01551   dy = sin(theta);
01552   l_min = l_max = w_min = w_max = 0.0;
01553   for(i=0; i<reg_size; i++)
01554     {
01555       l =  ( (double) reg[i].x - x) * dx + ( (double) reg[i].y - y) * dy;
01556       w = -( (double) reg[i].x - x) * dy + ( (double) reg[i].y - y) * dx;
01557 
01558       if( l > l_max ) l_max = l;
01559       if( l < l_min ) l_min = l;
01560       if( w > w_max ) w_max = w;
01561       if( w < w_min ) w_min = w;
01562     }
01563 
01564   /* store values */
01565   rec->x1 = x + l_min * dx;
01566   rec->y1 = y + l_min * dy;
01567   rec->x2 = x + l_max * dx;
01568   rec->y2 = y + l_max * dy;
01569   rec->width = w_max - w_min;
01570   rec->x = x;
01571   rec->y = y;
01572   rec->theta = theta;
01573   rec->dx = dx;
01574   rec->dy = dy;
01575   rec->prec = prec;
01576   rec->p = p;
01577 
01578   /* we impose a minimal width of one pixel
01579 
01580      A sharp horizontal or vertical step would produce a perfectly
01581      horizontal or vertical region. The width computed would be
01582      zero. But that corresponds to a one pixels width transition in
01583      the image.
01584    */
01585   if( rec->width < 1.0 ) rec->width = 1.0;
01586 }

Here is the call graph for this function:

void region_grow int  x,
int  y,
image_double  angles,
struct point reg,
int *  reg_size,
double *  reg_angle,
image_char  used,
double  prec
[static]
 

Build a region of pixels that share the same angle, up to a tolerance 'prec', starting at point (x,y).

Definition at line 1592 of file lsd.c.

References image_char_s::data, image_double_s::data, error(), image_char, image_double, isaligned(), USED, point::x, image_char_s::xsize, image_double_s::xsize, point::y, image_char_s::ysize, and image_double_s::ysize.

Referenced by LineSegmentDetection(), and refine().

01595 {
01596   double sumdx,sumdy;
01597   int xx,yy,i;
01598 
01599   /* check parameters */
01600   if( x < 0 || y < 0 || x >= (int) angles->xsize || y >= (int) angles->ysize )
01601     error("region_grow: (x,y) out of the image.");
01602   if( angles == NULL || angles->data == NULL )
01603     error("region_grow: invalid image 'angles'.");
01604   if( reg == NULL ) error("region_grow: invalid 'reg'.");
01605   if( reg_size == NULL ) error("region_grow: invalid pointer 'reg_size'.");
01606   if( reg_angle == NULL ) error("region_grow: invalid pointer 'reg_angle'.");
01607   if( used == NULL || used->data == NULL )
01608     error("region_grow: invalid image 'used'.");
01609 
01610   /* first point of the region */
01611   *reg_size = 1;
01612   reg[0].x = x;
01613   reg[0].y = y;
01614   *reg_angle = angles->data[x+y*angles->xsize];  /* region's angle */
01615   sumdx = cos(*reg_angle);
01616   sumdy = sin(*reg_angle);
01617   used->data[x+y*used->xsize] = USED;
01618 
01619   /* try neighbors as new region points */
01620   for(i=0; i<*reg_size; i++)
01621     for(xx=reg[i].x-1; xx<=reg[i].x+1; xx++)
01622       for(yy=reg[i].y-1; yy<=reg[i].y+1; yy++)
01623         if( xx>=0 && yy>=0 && xx<(int)used->xsize && yy<(int)used->ysize &&
01624             used->data[xx+yy*used->xsize] != USED &&
01625             isaligned(xx,yy,angles,*reg_angle,prec) )
01626           {
01627             /* add point */
01628             used->data[xx+yy*used->xsize] = USED;
01629             reg[*reg_size].x = xx;
01630             reg[*reg_size].y = yy;
01631             ++(*reg_size);
01632 
01633             /* update region's angle */
01634             sumdx += cos( angles->data[xx+yy*angles->xsize] );
01635             sumdy += sin( angles->data[xx+yy*angles->xsize] );
01636             *reg_angle = atan2(sumdy,sumdx);
01637           }
01638 }

Here is the call graph for this function:

void ri_del rect_iter iter  )  [static]
 

Free memory used by a rectangle iterator.

Definition at line 1202 of file lsd.c.

References error().

Referenced by rect_nfa().

01203 {
01204   if( iter == NULL ) error("ri_del: NULL iterator.");
01205   free( (void *) iter );
01206 }

Here is the call graph for this function:

int ri_end rect_iter i  )  [static]
 

Check if the iterator finished the full iteration.

See details in rect_iter

Definition at line 1213 of file lsd.c.

References error(), rect_iter::vx, and rect_iter::x.

Referenced by rect_nfa(), and ri_inc().

01214 {
01215   /* check input */
01216   if( i == NULL ) error("ri_end: NULL iterator.");
01217 
01218   /* if the current x value is larger than the larger
01219      x value in the rectangle (vx[2]), we know the full
01220      exploration of the rectangle is finished. */
01221   return (double)(i->x) > i->vx[2];
01222 }

Here is the call graph for this function:

void ri_inc rect_iter i  )  [static]
 

Increment a rectangle iterator.

See details in rect_iter

Definition at line 1229 of file lsd.c.

References error(), inter_hi(), inter_low(), ri_end(), rect_iter::vx, rect_iter::vy, rect_iter::x, rect_iter::y, rect_iter::ye, and rect_iter::ys.

Referenced by rect_nfa(), and ri_ini().

01230 {
01231   /* check input */
01232   if( i == NULL ) error("ri_inc: NULL iterator.");
01233 
01234   /* if not at end of exploration,
01235      increase y value for next pixel in the 'column' */
01236   if( !ri_end(i) ) i->y++;
01237 
01238   /* if the end of the current 'column' is reached,
01239      and it is not the end of exploration,
01240      advance to the next 'column' */
01241   while( (double) (i->y) > i->ye && !ri_end(i) )
01242     {
01243       /* increase x, next 'column' */
01244       i->x++;
01245 
01246       /* if end of exploration, return */
01247       if( ri_end(i) ) return;
01248 
01249       /* update lower y limit (start) for the new 'column'.
01250 
01251          We need to interpolate the y value that corresponds to the
01252          lower side of the rectangle. The first thing is to decide if
01253          the corresponding side is
01254 
01255            vx[0],vy[0] to vx[3],vy[3] or
01256            vx[3],vy[3] to vx[2],vy[2]
01257 
01258          Then, the side is interpolated for the x value of the
01259          'column'. But, if the side is vertical (as it could happen if
01260          the rectangle is vertical and we are dealing with the first
01261          or last 'columns') then we pick the lower value of the side
01262          by using 'inter_low'.
01263        */
01264       if( (double) i->x < i->vx[3] )
01265         i->ys = inter_low((double)i->x,i->vx[0],i->vy[0],i->vx[3],i->vy[3]);
01266       else
01267         i->ys = inter_low((double)i->x,i->vx[3],i->vy[3],i->vx[2],i->vy[2]);
01268 
01269       /* update upper y limit (end) for the new 'column'.
01270 
01271          We need to interpolate the y value that corresponds to the
01272          upper side of the rectangle. The first thing is to decide if
01273          the corresponding side is
01274 
01275            vx[0],vy[0] to vx[1],vy[1] or
01276            vx[1],vy[1] to vx[2],vy[2]
01277 
01278          Then, the side is interpolated for the x value of the
01279          'column'. But, if the side is vertical (as it could happen if
01280          the rectangle is vertical and we are dealing with the first
01281          or last 'columns') then we pick the lower value of the side
01282          by using 'inter_low'.
01283        */
01284       if( (double)i->x < i->vx[1] )
01285         i->ye = inter_hi((double)i->x,i->vx[0],i->vy[0],i->vx[1],i->vy[1]);
01286       else
01287         i->ye = inter_hi((double)i->x,i->vx[1],i->vy[1],i->vx[2],i->vy[2]);
01288 
01289       /* new y */
01290       i->y = (int) ceil(i->ys);
01291     }
01292 }

Here is the call graph for this function:

rect_iter* ri_ini struct rect r  )  [static]
 

Create and initialize a rectangle iterator.

See details in rect_iter

Definition at line 1299 of file lsd.c.

References rect::dx, rect::dy, error(), ri_inc(), rect_iter::vx, rect_iter::vy, rect::width, rect_iter::x, rect::x1, rect::x2, rect_iter::y, rect::y1, rect::y2, rect_iter::ye, and rect_iter::ys.

Referenced by rect_nfa().

01300 {
01301   double vx[4],vy[4];
01302   int n,offset;
01303   rect_iter * i;
01304 
01305   /* check parameters */
01306   if( r == NULL ) error("ri_ini: invalid rectangle.");
01307 
01308   /* get memory */
01309   i = (rect_iter *) malloc(sizeof(rect_iter));
01310   if( i == NULL ) error("ri_ini: Not enough memory.");
01311 
01312   /* build list of rectangle corners ordered
01313      in a circular way around the rectangle */
01314   vx[0] = r->x1 - r->dy * r->width / 2.0;
01315   vy[0] = r->y1 + r->dx * r->width / 2.0;
01316   vx[1] = r->x2 - r->dy * r->width / 2.0;
01317   vy[1] = r->y2 + r->dx * r->width / 2.0;
01318   vx[2] = r->x2 + r->dy * r->width / 2.0;
01319   vy[2] = r->y2 - r->dx * r->width / 2.0;
01320   vx[3] = r->x1 + r->dy * r->width / 2.0;
01321   vy[3] = r->y1 - r->dx * r->width / 2.0;
01322 
01323   /* compute rotation of index of corners needed so that the first
01324      point has the smaller x.
01325 
01326      if one side is vertical, thus two corners have the same smaller x
01327      value, the one with the largest y value is selected as the first.
01328    */
01329   if( r->x1 < r->x2 && r->y1 <= r->y2 ) offset = 0;
01330   else if( r->x1 >= r->x2 && r->y1 < r->y2 ) offset = 1;
01331   else if( r->x1 > r->x2 && r->y1 >= r->y2 ) offset = 2;
01332   else offset = 3;
01333 
01334   /* apply rotation of index. */
01335   for(n=0; n<4; n++)
01336     {
01337       i->vx[n] = vx[(offset+n)%4];
01338       i->vy[n] = vy[(offset+n)%4];
01339     }
01340 
01341   /* Set a initial condition.
01342 
01343      The values are set to values that will cause 'ri_inc' (that will
01344      be called immediately) to initialize correctly the first 'column'
01345      and compute the limits 'ys' and 'ye'.
01346 
01347      'y' is set to the integer value of vy[0], the starting corner.
01348 
01349      'ys' and 'ye' are set to very small values, so 'ri_inc' will
01350      notice that it needs to start a new 'column'.
01351 
01352      The smaller integer coordinate inside of the rectangle is
01353      'ceil(vx[0])'. The current 'x' value is set to that value minus
01354      one, so 'ri_inc' (that will increase x by one) will advance to
01355      the first 'column'.
01356    */
01357   i->x = (int) ceil(i->vx[0]) - 1;
01358   i->y = (int) ceil(i->vy[0]);
01359   i->ys = i->ye = -DBL_MAX;
01360 
01361   /* advance to the first pixel */
01362   ri_inc(i);
01363 
01364   return i;
01365 }

Here is the call graph for this function:


Generated on Fri Dec 3 10:18:38 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/lsd_8h-source.html ================================================ LSD: lsd.h Source File

lsd.h

Go to the documentation of this file.
00001 /*----------------------------------------------------------------------------
00002 
00003   LSD - Line Segment Detector on digital images
00004 
00005   Copyright 2007-2010 rafael grompone von gioi (grompone@gmail.com)
00006 
00007   This program is free software: you can redistribute it and/or modify
00008   it under the terms of the GNU Affero General Public License as
00009   published by the Free Software Foundation, either version 3 of the
00010   License, or (at your option) any later version.
00011 
00012   This program is distributed in the hope that it will be useful,
00013   but WITHOUT ANY WARRANTY; without even the implied warranty of
00014   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00015   GNU Affero General Public License for more details.
00016 
00017   You should have received a copy of the GNU Affero General Public License
00018   along with this program. If not, see <http://www.gnu.org/licenses/>.
00019 
00020   ----------------------------------------------------------------------------*/
00021 
00022 /*----------------------------------------------------------------------------*/
00023 /** @file lsd.h
00024     LSD module header
00025     @author rafael grompone von gioi (grompone@gmail.com)
00026  */
00027 /*----------------------------------------------------------------------------*/
00028 #ifndef LSD_HEADER
00029 #define LSD_HEADER
00030 
00031 
00032 /*----------------------------------------------------------------------------*/
00033 /*----------------------- 'list of n-tuple' data type ------------------------*/
00034 /*----------------------------------------------------------------------------*/
00035 /** 'list of n-tuple' data type
00036 
00037     The i component, of the n-tuple number j, of an n-tuple list 'ntl'
00038     is accessed with:
00039 
00040       ntl->values[ i + j * ntl->dim ]
00041 
00042     The dimension of the n-tuple (n) is:
00043 
00044       ntl->dim
00045 
00046     The number of number of n-tuples in the list is:
00047 
00048       ntl->size
00049 
00050     The maximum number of n-tuples that can be stored in the
00051     list with the allocated memory at a given time is given by:
00052 
00053       ntl->max_size
00054  */
00055 typedef struct ntuple_list_s
00056 {
00057   unsigned int size;
00058   unsigned int max_size;
00059   unsigned int dim;
00060   double * values;
00061 } * ntuple_list;
00062 
00063 void free_ntuple_list(ntuple_list in);
00064 ntuple_list new_ntuple_list(unsigned int dim);
00065 
00066 
00067 /*----------------------------------------------------------------------------*/
00068 /*----------------------------- Image Data Types -----------------------------*/
00069 /*----------------------------------------------------------------------------*/
00070 
00071 /*----------------------------------------------------------------------------*/
00072 /** char image data type
00073 
00074     The pixel value at (x,y) is accessed by:
00075 
00076       image->data[ x + y * image->xsize ]
00077 
00078     with x and y integer.
00079  */
00080 typedef struct image_char_s
00081 {
00082   unsigned char * data;
00083   unsigned int xsize,ysize;
00084 } * image_char;
00085 
00086 void free_image_char(image_char i);
00087 image_char new_image_char(unsigned int xsize, unsigned int ysize);
00088 image_char new_image_char_ini( unsigned int xsize, unsigned int ysize,
00089                                unsigned char fill_value );
00090 
00091 /*----------------------------------------------------------------------------*/
00092 /** int image data type
00093 
00094     The pixel value at (x,y) is accessed by:
00095 
00096       image->data[ x + y * image->xsize ]
00097 
00098     with x and y integer.
00099  */
00100 typedef struct image_int_s
00101 {
00102   int * data;
00103   unsigned int xsize,ysize;
00104 } * image_int;
00105 
00106 void free_image_int(image_int i);
00107 image_int new_image_int(unsigned int xsize, unsigned int ysize);
00108 image_int new_image_int_ini( unsigned int xsize, unsigned int ysize,
00109                              int fill_value );
00110 
00111 /*----------------------------------------------------------------------------*/
00112 /** double image data type
00113 
00114     The pixel value at (x,y) is accessed by:
00115 
00116       image->data[ x + y * image->xsize ]
00117 
00118     with x and y integer.
00119  */
00120 typedef struct image_double_s
00121 {
00122   double * data;
00123   unsigned int xsize,ysize;
00124 } * image_double;
00125 
00126 void free_image_double(image_double i);
00127 image_double new_image_double(unsigned int xsize, unsigned int ysize);
00128 image_double new_image_double_ini( unsigned int xsize, unsigned int ysize,
00129                                    double fill_value );
00130 
00131 
00132 /*----------------------------------------------------------------------------*/
00133 /*-------------------------- Line Segment Detector ---------------------------*/
00134 /*----------------------------------------------------------------------------*/
00135 
00136 /*----------------------------------------------------------------------------*/
00137 /* LSD Full Interface                                                         */
00138 /*----------------------------------------------------------------------------*/
00139 /** LSD Full Interface
00140 
00141     @param image       Input image.
00142 
00143     @param scale       When different than 1.0, LSD will scale the image by
00144                        Gaussian filtering.
00145                        Example: is scale=0.8, the input image will be subsampled
00146                        to 80% of its size, and then the line segment detector
00147                        will be applied.
00148                        Suggested value: 0.8
00149 
00150     @param sigma_scale When scale!=1.0, the sigma of the Gaussian filter is:
00151                        sigma = sigma_scale / scale,   if scale <  1.0
00152                        sigma = sigma_scale,           if scale >= 1.0
00153                        Suggested value: 0.6
00154 
00155     @param quant       Bound to the quantization error on the gradient norm.
00156                        Example: if gray level is quantized to integer steps,
00157                        the gradient (computed by finite differences) error
00158                        due to quantization will be bounded by 2.0, as the
00159                        worst case is when the error are 1 and -1, that
00160                        gives an error of 2.0.
00161                        Suggested value: 2.0
00162 
00163     @param ang_th      Gradient angle tolerance in the region growing
00164                        algorithm, in degrees.
00165                        Suggested value: 22.5
00166 
00167     @param eps         Detection threshold, -log10(NFA).
00168                        The bigger, the more strict the detector is,
00169                        and will result in less detections.
00170                        (Note that the 'minus sign' makes that this
00171                        behavior is opposite to the one of NFA.)
00172                        The value -log10(NFA) is equivalent but more
00173                        intuitive than NFA:
00174                        - -1.0 corresponds to 10 mean false alarms
00175                        -  0.0 corresponds to 1 mean false alarm
00176                        -  1.0 corresponds to 0.1 mean false alarms
00177                        -  2.0 corresponds to 0.01 mean false alarms
00178                        .
00179                        Suggested value: 0.0
00180 
00181     @param density_th  Minimal proportion of region points in a rectangle.
00182                        Suggested value: 0.7
00183 
00184     @param n_bins      Number of bins used in the pseudo-ordering of gradient
00185                        modulus.
00186                        Suggested value: 1024
00187 
00188     @param max_grad    Gradient modulus in the highest bin. For example,
00189                        for images with integer gray levels in [0,255],
00190                        the maximum possible gradient value is 255.0.
00191                        Suggested value: 255.0
00192 
00193     @param region      Optional output: an int image where the pixels used
00194                        in some line support region are marked. Unused pixels
00195                        have the value '0' while the used ones have the
00196                        number of the line segment, numbered 1,2,3,...
00197                        If desired, a non NULL pointer to an image_int should
00198                        be used. The resulting image has the size of the image
00199                        used for the processing, that is, the size of the input
00200                        image scaled by the given factor 'scale'.
00201                        Suggested value: NULL
00202 
00203     @return            A 5-tuple list, where each 5-tuple corresponds to a
00204                        detected line segment. The five values are:
00205                        - x1,y1,x2,y2,width
00206                        .
00207                        for a line segment from (x1,y1) to (x2,y2) and
00208                        a width 'width'.
00209  */
00210 ntuple_list LineSegmentDetection( image_double image, double scale,
00211                                   double sigma_scale, double quant,
00212                                   double ang_th, double eps, double density_th,
00213                                   int n_bins, double max_grad,
00214                                   image_int * region );
00215 
00216 /*----------------------------------------------------------------------------*/
00217 /* LSD Simple Interface with Scale                                            */
00218 /*----------------------------------------------------------------------------*/
00219 /** LSD Simple Interface with Scale
00220 
00221     @param image Input image.
00222 
00223     @param scale When different than 1.0, LSD will scale the image by
00224                  Gaussian filtering.
00225                  Example: is scale=0.8, the input image will be subsampled
00226                  to 80% of its size, and then the line segment detector
00227                  will be applied.
00228                  Suggested value: 0.8
00229 
00230     @return a 5-tuple list of detected line segments.
00231  */
00232 ntuple_list lsd_scale(image_double image, double scale);
00233 
00234 /*----------------------------------------------------------------------------*/
00235 /* LSD Simple Interface                                                       */
00236 /*----------------------------------------------------------------------------*/
00237 /** LSD Simple Interface
00238 
00239     @param image Input image.
00240 
00241     @return a 5-tuple list of detected line segments.
00242  */
00243 ntuple_list lsd(image_double image);
00244 
00245 #endif /* !LSD_HEADER */
00246 /*----------------------------------------------------------------------------*/

Generated on Fri Dec 3 10:18:18 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/lsd_8h.html ================================================ LSD: lsd.h File Reference

lsd.h File Reference


Detailed Description

LSD module header.

Author:
rafael grompone von gioi (grompone@gmail.com)

Definition in file lsd.h.

This graph shows which files directly or indirectly include this file:

Included by dependency graph

Go to the source code of this file.

Data Structures

struct  image_char_s
 char image data type More...

struct  image_double_s
 double image data type More...

struct  image_int_s
 int image data type More...

struct  ntuple_list_s
 'list of n-tuple' data type More...


Typedefs

typedef ntuple_list_sntuple_list
 'list of n-tuple' data type

typedef image_char_simage_char
 char image data type

typedef image_int_simage_int
 int image data type

typedef image_double_simage_double
 double image data type


Functions

void free_ntuple_list (ntuple_list in)
 Free memory used in n-tuple 'in'.

ntuple_list new_ntuple_list (unsigned int dim)
 Create an n-tuple list and allocate memory for one element.

void free_image_char (image_char i)
 Free memory used in image_char 'i'.

image_char new_image_char (unsigned int xsize, unsigned int ysize)
 Create a new image_char of size 'xsize' times 'ysize'.

image_char new_image_char_ini (unsigned int xsize, unsigned int ysize, unsigned char fill_value)
 Create a new image_char of size 'xsize' times 'ysize', initialized to the value 'fill_value'.

void free_image_int (image_int i)
 Free memory used in image_int 'i'.

image_int new_image_int (unsigned int xsize, unsigned int ysize)
 Create a new image_int of size 'xsize' times 'ysize'.

image_int new_image_int_ini (unsigned int xsize, unsigned int ysize, int fill_value)
 Create a new image_int of size 'xsize' times 'ysize', initialized to the value 'fill_value'.

void free_image_double (image_double i)
 Free memory used in image_double 'i'.

image_double new_image_double (unsigned int xsize, unsigned int ysize)
 Create a new image_double of size 'xsize' times 'ysize'.

image_double new_image_double_ini (unsigned int xsize, unsigned int ysize, double fill_value)
 Create a new image_double of size 'xsize' times 'ysize', initialized to the value 'fill_value'.

ntuple_list LineSegmentDetection (image_double image, double scale, double sigma_scale, double quant, double ang_th, double eps, double density_th, int n_bins, double max_grad, image_int *region)
 LSD Full Interface.

ntuple_list lsd_scale (image_double image, double scale)
 LSD Simple Interface with Scale.

ntuple_list lsd (image_double image)
 LSD Simple Interface.


Typedef Documentation

typedef struct image_char_s * image_char
 

char image data type

The pixel value at (x,y) is accessed by:

image->data[ x + y * image->xsize ]

with x and y integer.

Referenced by free_image_char(), LineSegmentDetection(), new_image_char(), new_image_char_ini(), reduce_region_radius(), refine(), and region_grow().

typedef struct image_double_s * image_double
 

double image data type

The pixel value at (x,y) is accessed by:

image->data[ x + y * image->xsize ]

with x and y integer.

Referenced by free_image_double(), gaussian_sampler(), get_theta(), isaligned(), LineSegmentDetection(), ll_angle(), lsd(), lsd_scale(), new_image_double(), new_image_double_ini(), rect_improve(), rect_nfa(), reduce_region_radius(), refine(), region2rect(), and region_grow().

typedef struct image_int_s * image_int
 

int image data type

The pixel value at (x,y) is accessed by:

image->data[ x + y * image->xsize ]

with x and y integer.

Referenced by free_image_int(), LineSegmentDetection(), new_image_int(), and new_image_int_ini().

typedef struct ntuple_list_s * ntuple_list
 

'list of n-tuple' data type

The i component, of the n-tuple number j, of an n-tuple list 'ntl' is accessed with:

ntl->values[ i + j * ntl->dim ]

The dimension of the n-tuple (n) is:

ntl->dim

The number of number of n-tuples in the list is:

ntl->size

The maximum number of n-tuples that can be stored in the list with the allocated memory at a given time is given by:

ntl->max_size

Referenced by add_5tuple(), enlarge_ntuple_list(), free_ntuple_list(), gaussian_kernel(), gaussian_sampler(), LineSegmentDetection(), lsd(), lsd_scale(), and new_ntuple_list().


Function Documentation

void free_image_char image_char  i  ) 
 

Free memory used in image_char 'i'.

Definition at line 280 of file lsd.c.

References image_char_s::data, error(), and image_char.

Referenced by LineSegmentDetection().

00281 {
00282   if( i == NULL || i->data == NULL )
00283     error("free_image_char: invalid input image.");
00284   free( (void *) i->data );
00285   free( (void *) i );
00286 }

Here is the call graph for this function:

void free_image_double image_double  i  ) 
 

Free memory used in image_double 'i'.

Definition at line 387 of file lsd.c.

References image_double_s::data, error(), and image_double.

Referenced by gaussian_sampler(), and LineSegmentDetection().

00388 {
00389   if( i == NULL || i->data == NULL )
00390     error("free_image_double: invalid input image.");
00391   free( (void *) i->data );
00392   free( (void *) i );
00393 }

Here is the call graph for this function:

void free_image_int image_int  i  ) 
 

Free memory used in image_int 'i'.

Definition at line 336 of file lsd.c.

References image_int_s::data, error(), and image_int.

00337 {
00338   if( i == NULL || i->data == NULL )
00339     error("free_image_int: invalid input image.");
00340   free( (void *) i->data );
00341   free( (void *) i );
00342 }

Here is the call graph for this function:

void free_ntuple_list ntuple_list  in  ) 
 

Free memory used in n-tuple 'in'.

Definition at line 194 of file lsd.c.

References error(), ntuple_list, and ntuple_list_s::values.

Referenced by gaussian_sampler().

00195 {
00196   if( in == NULL || in->values == NULL )
00197     error("free_ntuple_list: invalid n-tuple input.");
00198   free( (void *) in->values );
00199   free( (void *) in );
00200 }

Here is the call graph for this function:

ntuple_list LineSegmentDetection image_double  image,
double  scale,
double  sigma_scale,
double  quant,
double  ang_th,
double  eps,
double  density_th,
int  n_bins,
double  max_grad,
image_int region
 

LSD Full Interface.

Parameters:
image Input image.
scale When different than 1.0, LSD will scale the image by Gaussian filtering. Example: is scale=0.8, the input image will be subsampled to 80% of its size, and then the line segment detector will be applied. Suggested value: 0.8
sigma_scale When scale!=1.0, the sigma of the Gaussian filter is: sigma = sigma_scale / scale, if scale < 1.0 sigma = sigma_scale, if scale >= 1.0 Suggested value: 0.6
quant Bound to the quantization error on the gradient norm. Example: if gray level is quantized to integer steps, the gradient (computed by finite differences) error due to quantization will be bounded by 2.0, as the worst case is when the error are 1 and -1, that gives an error of 2.0. Suggested value: 2.0
ang_th Gradient angle tolerance in the region growing algorithm, in degrees. Suggested value: 22.5
eps Detection threshold, -log10(NFA). The bigger, the more strict the detector is, and will result in less detections. (Note that the 'minus sign' makes that this behavior is opposite to the one of NFA.) The value -log10(NFA) is equivalent but more intuitive than NFA:
  • -1.0 corresponds to 10 mean false alarms
  • 0.0 corresponds to 1 mean false alarm
  • 1.0 corresponds to 0.1 mean false alarms
  • 2.0 corresponds to 0.01 mean false alarms
Suggested value: 0.0
density_th Minimal proportion of region points in a rectangle. Suggested value: 0.7
n_bins Number of bins used in the pseudo-ordering of gradient modulus. Suggested value: 1024
max_grad Gradient modulus in the highest bin. For example, for images with integer gray levels in [0,255], the maximum possible gradient value is 255.0. Suggested value: 255.0
region Optional output: an int image where the pixels used in some line support region are marked. Unused pixels have the value '0' while the used ones have the number of the line segment, numbered 1,2,3,... If desired, a non NULL pointer to an image_int should be used. The resulting image has the size of the image used for the processing, that is, the size of the input image scaled by the given factor 'scale'. Suggested value: NULL
Returns:
A 5-tuple list, where each 5-tuple corresponds to a detected line segment. The five values are:
  • x1,y1,x2,y2,width
for a line segment from (x1,y1) to (x2,y2) and a width 'width'.

Definition at line 1913 of file lsd.c.

References add_5tuple(), image_double_s::data, image_char_s::data, error(), free_image_char(), free_image_double(), gaussian_sampler(), image_char, image_double, image_int, ll_angle(), M_PI, new_image_char_ini(), new_image_int_ini(), new_ntuple_list(), NOTDEF, NOTUSED, ntuple_list, rect_improve(), refine(), region2rect(), region_grow(), rect::width, rect::x1, rect::x2, image_double_s::xsize, image_char_s::xsize, rect::y1, rect::y2, and image_double_s::ysize.

Referenced by lsd_scale().

01918 {
01919   ntuple_list out = new_ntuple_list(5);
01920   image_double scaled_image,angles,modgrad;
01921   image_char used;
01922   struct coorlist * list_p;
01923   void * mem_p;
01924   struct rect rec;
01925   struct point * reg;
01926   int reg_size,min_reg_size,i;
01927   unsigned int xsize,ysize;
01928   double rho,reg_angle,prec,p,log_nfa,logNT;
01929   int ls_count = 0;                   /* line segments are numbered 1,2,3,... */
01930 
01931 
01932   /* check parameters */
01933   if( image==NULL || image->data==NULL || image->xsize==0 || image->ysize==0 )
01934     error("invalid image input.");
01935   if( scale <= 0.0 ) error("'scale' value must be positive.");
01936   if( sigma_scale <= 0.0 ) error("'sigma_scale' value must be positive.");
01937   if( quant < 0.0 ) error("'quant' value must be positive.");
01938   if( ang_th <= 0.0 || ang_th >= 180.0 )
01939     error("'ang_th' value must be in the range (0,180).");
01940   if( density_th < 0.0 || density_th > 1.0 )
01941     error("'density_th' value must be in the range [0,1].");
01942   if( n_bins <= 0 ) error("'n_bins' value must be positive.");
01943   if( max_grad <= 0.0 ) error("'max_grad' value must be positive.");
01944 
01945 
01946   /* angle tolerance */
01947   prec = M_PI * ang_th / 180.0;
01948   p = ang_th / 180.0;
01949   rho = quant / sin(prec); /* gradient magnitude threshold */
01950 
01951 
01952   /* scale image (if necessary) and compute angle at each pixel */
01953   if( scale != 1.0 )
01954     {
01955       scaled_image = gaussian_sampler( image, scale, sigma_scale );
01956       angles = ll_angle( scaled_image, rho, &list_p, &mem_p,
01957                          &modgrad, (unsigned int) n_bins, max_grad );
01958       free_image_double(scaled_image);
01959     }
01960   else
01961     angles = ll_angle( image, rho, &list_p, &mem_p, &modgrad,
01962                        (unsigned int) n_bins, max_grad );
01963   xsize = angles->xsize;
01964   ysize = angles->ysize;
01965   logNT = 5.0 * ( log10( (double) xsize ) + log10( (double) ysize ) ) / 2.0;
01966   min_reg_size = (int) (-logNT/log10(p)); /* minimal number of points in region
01967                                              that can give a meaningful event */
01968 
01969 
01970   /* initialize some structures */
01971   if( region != NULL ) /* image to output pixel region number, if asked */
01972     *region = new_image_int_ini(angles->xsize,angles->ysize,0);
01973   used = new_image_char_ini(xsize,ysize,NOTUSED);
01974   reg = (struct point *) calloc( (size_t) (xsize*ysize), sizeof(struct point) );
01975   if( reg == NULL ) error("not enough memory!");
01976 
01977 
01978   /* search for line segments */
01979   for(; list_p != NULL; list_p = list_p->next )
01980     if( used->data[ list_p->x + list_p->y * used->xsize ] == NOTUSED &&
01981         angles->data[ list_p->x + list_p->y * angles->xsize ] != NOTDEF )
01982        /* there is no risk of double comparison problems here
01983           because we are only interested in the exact NOTDEF value */
01984       {
01985         /* find the region of connected point and ~equal angle */
01986         region_grow( list_p->x, list_p->y, angles, reg, &reg_size,
01987                      &reg_angle, used, prec );
01988 
01989         /* reject small regions */
01990         if( reg_size < min_reg_size ) continue;
01991 
01992         /* construct rectangular approximation for the region */
01993         region2rect(reg,reg_size,modgrad,reg_angle,prec,p,&rec);
01994 
01995         /* Check if the rectangle exceeds the minimal density of
01996            region points. If not, try to improve the region.
01997            The rectangle will be rejected if the final one does
01998            not fulfill the minimal density condition.
01999            This is an addition to the original LSD algorithm published in
02000            "LSD: A Fast Line Segment Detector with a False Detection Control"
02001            by R. Grompone von Gioi, J. Jakubowicz, J.M. Morel, and G. Randall.
02002            The original algorithm is obtained with density_th = 0.0.
02003          */
02004         if( !refine( reg, &reg_size, modgrad, reg_angle,
02005                      prec, p, &rec, used, angles, density_th ) ) continue;
02006 
02007         /* compute NFA value */
02008         log_nfa = rect_improve(&rec,angles,logNT,eps);
02009         if( log_nfa <= eps ) continue;
02010 
02011         /* A New Line Segment was found! */
02012         ++ls_count;  /* increase line segment counter */
02013 
02014         /*
02015            The gradient was computed with a 2x2 mask, its value corresponds to
02016            points with an offset of (0.5,0.5), that should be added to output.
02017            The coordinates origin is at the center of pixel (0,0).
02018          */
02019         rec.x1 += 0.5; rec.y1 += 0.5;
02020         rec.x2 += 0.5; rec.y2 += 0.5;
02021 
02022         /* scale the result values if a subsampling was performed */
02023         if( scale != 1.0 )
02024           {
02025             rec.x1 /= scale; rec.y1 /= scale;
02026             rec.x2 /= scale; rec.y2 /= scale;
02027             rec.width /= scale;
02028           }
02029 
02030         /* add line segment found to output */
02031         add_5tuple(out, rec.x1, rec.y1, rec.x2, rec.y2, rec.width);
02032 
02033         /* add region number to 'region' image if needed */
02034         if( region != NULL )
02035           for(i=0; i<reg_size; i++)
02036             (*region)->data[reg[i].x+reg[i].y*(*region)->xsize] = ls_count;
02037       }
02038 
02039 
02040   /* free memory */
02041   free_image_double(angles);
02042   free_image_double(modgrad);
02043   free_image_char(used);
02044   free( (void *) reg );
02045   free( (void *) mem_p );
02046 
02047   return out;
02048 }

Here is the call graph for this function:

ntuple_list lsd image_double  image  ) 
 

LSD Simple Interface.

Parameters:
image Input image.
Returns:
a 5-tuple list of detected line segments.

Definition at line 2077 of file lsd.c.

References image_double, lsd_scale(), and ntuple_list.

02078 {
02079   /* LSD parameters */
02080   double scale = 0.8;       /* Scale the image by Gaussian filter to 'scale'. */
02081 
02082   return lsd_scale(image,scale);
02083 }

Here is the call graph for this function:

ntuple_list lsd_scale image_double  image,
double  scale
 

LSD Simple Interface with Scale.

Parameters:
image Input image.
scale When different than 1.0, LSD will scale the image by Gaussian filtering. Example: is scale=0.8, the input image will be subsampled to 80% of its size, and then the line segment detector will be applied. Suggested value: 0.8
Returns:
a 5-tuple list of detected line segments.

Definition at line 2053 of file lsd.c.

References image_double, LineSegmentDetection(), and ntuple_list.

Referenced by lsd().

02054 {
02055   /* LSD parameters */
02056   double sigma_scale = 0.6; /* Sigma for Gaussian filter is computed as
02057                                 sigma = sigma_scale/scale.                    */
02058   double quant = 2.0;       /* Bound to the quantization error on the
02059                                 gradient norm.                                */
02060   double ang_th = 22.5;     /* Gradient angle tolerance in degrees.           */
02061   double eps = 0.0;         /* Detection threshold, -log10(NFA).              */
02062   double density_th = 0.7;  /* Minimal density of region points in rectangle. */
02063   int n_bins = 1024;        /* Number of bins in pseudo-ordering of gradient
02064                                modulus.                                       */
02065   double max_grad = 255.0;  /* Gradient modulus in the highest bin. The
02066                                default value corresponds to the highest
02067                                gradient modulus on images with gray
02068                                levels in [0,255].                             */
02069 
02070   return LineSegmentDetection( image, scale, sigma_scale, quant, ang_th, eps,
02071                                density_th, n_bins, max_grad, NULL );
02072 }

Here is the call graph for this function:

image_char new_image_char unsigned int  xsize,
unsigned int  ysize
 

Create a new image_char of size 'xsize' times 'ysize'.

Definition at line 291 of file lsd.c.

References image_char_s::data, error(), image_char, image_char_s::xsize, and image_char_s::ysize.

Referenced by new_image_char_ini().

00292 {
00293   image_char image;
00294 
00295   /* check parameters */
00296   if( xsize == 0 || ysize == 0 ) error("new_image_char: invalid image size.");
00297 
00298   /* get memory */
00299   image = (image_char) malloc( sizeof(struct image_char_s) );
00300   if( image == NULL ) error("not enough memory.");
00301   image->data = (unsigned char *) calloc( (size_t) (xsize*ysize),
00302                                           sizeof(unsigned char) );
00303   if( image->data == NULL ) error("not enough memory.");
00304 
00305   /* set image size */
00306   image->xsize = xsize;
00307   image->ysize = ysize;
00308 
00309   return image;
00310 }

Here is the call graph for this function:

image_char new_image_char_ini unsigned int  xsize,
unsigned int  ysize,
unsigned char  fill_value
 

Create a new image_char of size 'xsize' times 'ysize', initialized to the value 'fill_value'.

Definition at line 316 of file lsd.c.

References image_char_s::data, error(), image_char, and new_image_char().

Referenced by LineSegmentDetection().

00318 {
00319   image_char image = new_image_char(xsize,ysize); /* create image */
00320   unsigned int N = xsize*ysize;
00321   unsigned int i;
00322 
00323   /* check parameters */
00324   if( image == NULL || image->data == NULL )
00325     error("new_image_char_ini: invalid image.");
00326 
00327   /* initialize */
00328   for(i=0; i<N; i++) image->data[i] = fill_value;
00329 
00330   return image;
00331 }

Here is the call graph for this function:

image_double new_image_double unsigned int  xsize,
unsigned int  ysize
 

Create a new image_double of size 'xsize' times 'ysize'.

Definition at line 398 of file lsd.c.

References image_double_s::data, error(), image_double, image_double_s::xsize, and image_double_s::ysize.

Referenced by gaussian_sampler(), ll_angle(), and new_image_double_ini().

00399 {
00400   image_double image;
00401 
00402   /* check parameters */
00403   if( xsize == 0 || ysize == 0 ) error("new_image_double: invalid image size.");
00404 
00405   /* get memory */
00406   image = (image_double) malloc( sizeof(struct image_double_s) );
00407   if( image == NULL ) error("not enough memory.");
00408   image->data = (double *) calloc( (size_t) (xsize*ysize), sizeof(double) );
00409   if( image->data == NULL ) error("not enough memory.");
00410 
00411   /* set image size */
00412   image->xsize = xsize;
00413   image->ysize = ysize;
00414 
00415   return image;
00416 }

Here is the call graph for this function:

image_double new_image_double_ini unsigned int  xsize,
unsigned int  ysize,
double  fill_value
 

Create a new image_double of size 'xsize' times 'ysize', initialized to the value 'fill_value'.

Definition at line 422 of file lsd.c.

References image_double_s::data, image_double, and new_image_double().

00424 {
00425   image_double image = new_image_double(xsize,ysize); /* create image */
00426   unsigned int N = xsize*ysize;
00427   unsigned int i;
00428 
00429   /* initialize */
00430   for(i=0; i<N; i++) image->data[i] = fill_value;
00431 
00432   return image;
00433 }

Here is the call graph for this function:

image_int new_image_int unsigned int  xsize,
unsigned int  ysize
 

Create a new image_int of size 'xsize' times 'ysize'.

Definition at line 347 of file lsd.c.

References image_int_s::data, error(), image_int, image_int_s::xsize, and image_int_s::ysize.

Referenced by new_image_int_ini().

00348 {
00349   image_int image;
00350 
00351   /* check parameters */
00352   if( xsize == 0 || ysize == 0 ) error("new_image_int: invalid image size.");
00353 
00354   /* get memory */
00355   image = (image_int) malloc( sizeof(struct image_int_s) );
00356   if( image == NULL ) error("not enough memory.");
00357   image->data = (int *) calloc( (size_t) (xsize*ysize), sizeof(int) );
00358   if( image->data == NULL ) error("not enough memory.");
00359 
00360   /* set image size */
00361   image->xsize = xsize;
00362   image->ysize = ysize;
00363 
00364   return image;
00365 }

Here is the call graph for this function:

image_int new_image_int_ini unsigned int  xsize,
unsigned int  ysize,
int  fill_value
 

Create a new image_int of size 'xsize' times 'ysize', initialized to the value 'fill_value'.

Definition at line 371 of file lsd.c.

References image_int_s::data, image_int, and new_image_int().

Referenced by LineSegmentDetection().

00373 {
00374   image_int image = new_image_int(xsize,ysize); /* create image */
00375   unsigned int N = xsize*ysize;
00376   unsigned int i;
00377 
00378   /* initialize */
00379   for(i=0; i<N; i++) image->data[i] = fill_value;
00380 
00381   return image;
00382 }

Here is the call graph for this function:

ntuple_list new_ntuple_list unsigned int  dim  ) 
 

Create an n-tuple list and allocate memory for one element.

Parameters:
dim the dimension (n) of the n-tuple.

Definition at line 206 of file lsd.c.

References ntuple_list_s::dim, error(), ntuple_list_s::max_size, ntuple_list, ntuple_list_s::size, and ntuple_list_s::values.

Referenced by gaussian_sampler(), and LineSegmentDetection().

00207 {
00208   ntuple_list n_tuple;
00209 
00210   /* check parameters */
00211   if( dim == 0 ) error("new_ntuple_list: 'dim' must be positive.");
00212 
00213   /* get memory for list structure */
00214   n_tuple = (ntuple_list) malloc( sizeof(struct ntuple_list_s) );
00215   if( n_tuple == NULL ) error("not enough memory.");
00216 
00217   /* initialize list */
00218   n_tuple->size = 0;
00219   n_tuple->max_size = 1;
00220   n_tuple->dim = dim;
00221 
00222   /* get memory for tuples */
00223   n_tuple->values = (double *) malloc( dim*n_tuple->max_size * sizeof(double) );
00224   if( n_tuple->values == NULL ) error("not enough memory.");
00225 
00226   return n_tuple;
00227 }

Here is the call graph for this function:


Generated on Fri Dec 3 10:18:48 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/structcoorlist.html ================================================ LSD: coorlist struct Reference

coorlist Struct Reference

Collaboration diagram for coorlist:

Collaboration graph
[legend]

Detailed Description

Chained list of coordinates.

Definition at line 114 of file lsd.c.

Data Fields

int x
int y
coorlistnext


Field Documentation

struct coorlist* coorlist::next
 

Definition at line 117 of file lsd.c.

int coorlist::x
 

Definition at line 116 of file lsd.c.

int coorlist::y
 

Definition at line 116 of file lsd.c.


The documentation for this struct was generated from the following file:
Generated on Fri Dec 3 10:18:49 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/structimage__char__s.html ================================================ LSD: image_char_s struct Reference

image_char_s Struct Reference

#include <lsd.h>


Detailed Description

char image data type

The pixel value at (x,y) is accessed by:

image->data[ x + y * image->xsize ]

with x and y integer.

Definition at line 80 of file lsd.h.

Data Fields

unsigned char * data
unsigned int xsize
unsigned int ysize


Field Documentation

unsigned char* image_char_s::data
 

Definition at line 82 of file lsd.h.

Referenced by free_image_char(), LineSegmentDetection(), new_image_char(), new_image_char_ini(), reduce_region_radius(), refine(), and region_grow().

unsigned int image_char_s::xsize
 

Definition at line 83 of file lsd.h.

Referenced by LineSegmentDetection(), new_image_char(), reduce_region_radius(), refine(), and region_grow().

unsigned int image_char_s::ysize
 

Definition at line 83 of file lsd.h.

Referenced by new_image_char(), and region_grow().


The documentation for this struct was generated from the following file:
Generated on Fri Dec 3 10:18:49 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/structimage__double__s.html ================================================ LSD: image_double_s struct Reference

image_double_s Struct Reference

#include <lsd.h>


Detailed Description

double image data type

The pixel value at (x,y) is accessed by:

image->data[ x + y * image->xsize ]

with x and y integer.

Definition at line 120 of file lsd.h.

Data Fields

double * data
unsigned int xsize
unsigned int ysize


Field Documentation

double* image_double_s::data
 

Definition at line 122 of file lsd.h.

Referenced by free_image_double(), gaussian_sampler(), get_theta(), isaligned(), LineSegmentDetection(), ll_angle(), new_image_double(), new_image_double_ini(), reduce_region_radius(), refine(), region2rect(), and region_grow().

unsigned int image_double_s::xsize
 

Definition at line 123 of file lsd.h.

Referenced by gaussian_sampler(), get_theta(), isaligned(), LineSegmentDetection(), ll_angle(), new_image_double(), rect_nfa(), refine(), region2rect(), and region_grow().

unsigned int image_double_s::ysize
 

Definition at line 123 of file lsd.h.

Referenced by gaussian_sampler(), isaligned(), LineSegmentDetection(), ll_angle(), new_image_double(), rect_nfa(), and region_grow().


The documentation for this struct was generated from the following file:
Generated on Fri Dec 3 10:18:49 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/structimage__int__s.html ================================================ LSD: image_int_s struct Reference

image_int_s Struct Reference

#include <lsd.h>


Detailed Description

int image data type

The pixel value at (x,y) is accessed by:

image->data[ x + y * image->xsize ]

with x and y integer.

Definition at line 100 of file lsd.h.

Data Fields

int * data
unsigned int xsize
unsigned int ysize


Field Documentation

int* image_int_s::data
 

Definition at line 102 of file lsd.h.

Referenced by free_image_int(), new_image_int(), and new_image_int_ini().

unsigned int image_int_s::xsize
 

Definition at line 103 of file lsd.h.

Referenced by new_image_int().

unsigned int image_int_s::ysize
 

Definition at line 103 of file lsd.h.

Referenced by new_image_int().


The documentation for this struct was generated from the following file:
Generated on Fri Dec 3 10:18:49 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/structntuple__list__s.html ================================================ LSD: ntuple_list_s struct Reference

ntuple_list_s Struct Reference

#include <lsd.h>


Detailed Description

'list of n-tuple' data type

The i component, of the n-tuple number j, of an n-tuple list 'ntl' is accessed with:

ntl->values[ i + j * ntl->dim ]

The dimension of the n-tuple (n) is:

ntl->dim

The number of number of n-tuples in the list is:

ntl->size

The maximum number of n-tuples that can be stored in the list with the allocated memory at a given time is given by:

ntl->max_size

Definition at line 55 of file lsd.h.

Data Fields

unsigned int size
unsigned int max_size
unsigned int dim
double * values


Field Documentation

unsigned int ntuple_list_s::dim
 

Definition at line 59 of file lsd.h.

Referenced by add_5tuple(), enlarge_ntuple_list(), gaussian_kernel(), gaussian_sampler(), and new_ntuple_list().

unsigned int ntuple_list_s::max_size
 

Definition at line 58 of file lsd.h.

Referenced by add_5tuple(), enlarge_ntuple_list(), gaussian_kernel(), and new_ntuple_list().

unsigned int ntuple_list_s::size
 

Definition at line 57 of file lsd.h.

Referenced by add_5tuple(), gaussian_kernel(), and new_ntuple_list().

double* ntuple_list_s::values
 

Definition at line 60 of file lsd.h.

Referenced by add_5tuple(), enlarge_ntuple_list(), free_ntuple_list(), gaussian_kernel(), gaussian_sampler(), and new_ntuple_list().


The documentation for this struct was generated from the following file:
Generated on Fri Dec 3 10:18:49 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/structpoint.html ================================================ LSD: point struct Reference

point Struct Reference


Detailed Description

A point (or pixel).

Definition at line 123 of file lsd.c.

Data Fields

int x
int y


Field Documentation

int point::x
 

Definition at line 123 of file lsd.c.

Referenced by get_theta(), reduce_region_radius(), refine(), region2rect(), and region_grow().

int point::y
 

Definition at line 123 of file lsd.c.

Referenced by get_theta(), reduce_region_radius(), refine(), region2rect(), and region_grow().


The documentation for this struct was generated from the following file:
Generated on Fri Dec 3 10:18:49 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/structrect.html ================================================ LSD: rect struct Reference

rect Struct Reference


Detailed Description

Rectangle structure: line segment with width.

Definition at line 1057 of file lsd.c.

Data Fields

double x1
double y1
double x2
double y2
double width
double x
double y
double theta
double dx
double dy
double prec
double p


Field Documentation

double rect::dx
 

Definition at line 1063 of file lsd.c.

Referenced by rect_copy(), rect_improve(), region2rect(), and ri_ini().

double rect::dy
 

Definition at line 1063 of file lsd.c.

Referenced by rect_copy(), rect_improve(), region2rect(), and ri_ini().

double rect::p
 

Definition at line 1065 of file lsd.c.

Referenced by rect_copy(), rect_improve(), rect_nfa(), and region2rect().

double rect::prec
 

Definition at line 1064 of file lsd.c.

Referenced by rect_copy(), rect_improve(), rect_nfa(), and region2rect().

double rect::theta
 

Definition at line 1062 of file lsd.c.

Referenced by rect_copy(), rect_nfa(), and region2rect().

double rect::width
 

Definition at line 1060 of file lsd.c.

Referenced by LineSegmentDetection(), rect_copy(), rect_improve(), reduce_region_radius(), refine(), region2rect(), and ri_ini().

double rect::x
 

Definition at line 1061 of file lsd.c.

Referenced by rect_copy(), and region2rect().

double rect::x1
 

Definition at line 1059 of file lsd.c.

Referenced by LineSegmentDetection(), rect_copy(), rect_improve(), reduce_region_radius(), refine(), region2rect(), and ri_ini().

double rect::x2
 

Definition at line 1059 of file lsd.c.

Referenced by LineSegmentDetection(), rect_copy(), rect_improve(), reduce_region_radius(), refine(), region2rect(), and ri_ini().

double rect::y
 

Definition at line 1061 of file lsd.c.

Referenced by rect_copy(), and region2rect().

double rect::y1
 

Definition at line 1059 of file lsd.c.

Referenced by LineSegmentDetection(), rect_copy(), rect_improve(), reduce_region_radius(), refine(), region2rect(), and ri_ini().

double rect::y2
 

Definition at line 1059 of file lsd.c.

Referenced by LineSegmentDetection(), rect_copy(), rect_improve(), reduce_region_radius(), refine(), region2rect(), and ri_ini().


The documentation for this struct was generated from the following file:
Generated on Fri Dec 3 10:18:49 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doc/structrect__iter.html ================================================ LSD: rect_iter struct Reference

rect_iter Struct Reference


Detailed Description

Rectangle points iterator.

The integer coordinates of pixels inside a rectangle are iteratively explored. This structure keep track of the process and functions ri_ini(), ri_inc(), ri_end(), and ri_del() are used in the process. An example of how to use the iterator is as follows:

      struct rect * rec = XXX; // some rectangle
      rect_iter * i;
      for( i=ri_ini(rec); !ri_end(i); ri_inc(i) )
        {
          // your code, using 'i->x' and 'i->y' as coordinates
        }
      ri_del(i); // delete iterator
The pixels are explored 'column' by 'column', where we call 'column' a set of pixels with the same x value that are inside the rectangle. The following is an schematic representation of a rectangle, the 'column' being explored is marked by colons, and the current pixel being explored is 'x,y'.

              vx[1],vy[1]
                 *   *
                *       *
               *           *
              *               ye
             *                :  *
        vx[0],vy[0]           :     *
               *              :        *
                  *          x,y          *
                     *        :              *
                        *     :            vx[2],vy[2]
                           *  :                *
        y                     ys              *
        ^                        *           *
        |                           *       *
        |                              *   *
        +---> x                      vx[3],vy[3]

    
The first 'column' to be explored is the one with the smaller x value. Each 'column' is explored starting from the pixel of the 'column' (inside the rectangle) with the smaller y value.

The four corners of the rectangle are stored in order that rotates around the corners at the arrays 'vx[]' and 'vy[]'. The first point is always the one with smaller x value.

'x' and 'y' are the coordinates of the pixel being explored. 'ys' and 'ye' are the start and end values of the current column being explored. So, 'ys' < 'ye'.

Definition at line 1147 of file lsd.c.

Data Fields

double vx [4]
double vy [4]
double ys
double ye
int x
int y


Field Documentation

double rect_iter::vx[4]
 

Definition at line 1149 of file lsd.c.

Referenced by ri_end(), ri_inc(), and ri_ini().

double rect_iter::vy[4]
 

Definition at line 1150 of file lsd.c.

Referenced by ri_inc(), and ri_ini().

int rect_iter::x
 

Definition at line 1152 of file lsd.c.

Referenced by rect_nfa(), ri_end(), ri_inc(), and ri_ini().

int rect_iter::y
 

Definition at line 1152 of file lsd.c.

Referenced by rect_nfa(), ri_inc(), and ri_ini().

double rect_iter::ye
 

Definition at line 1151 of file lsd.c.

Referenced by ri_inc(), and ri_ini().

double rect_iter::ys
 

Definition at line 1151 of file lsd.c.

Referenced by ri_inc(), and ri_ini().


The documentation for this struct was generated from the following file:
Generated on Fri Dec 3 10:18:49 2010 for LSD by doxygen 1.3.4
================================================ FILE: thirdparty/LSD/doxygen.config ================================================ # Doxyfile 1.3.4 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = LSD # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, # Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en # (Japanese with English messages), Korean, Norwegian, Polish, Portuguese, # Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited # members of a class in the documentation of that class as if those members were # ordinary class members. Constructors, destructors and assignment operators of # the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. It is allowed to use relative paths in the argument list. STRIP_FROM_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explict @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # reimplements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = lsd.h lsd.c # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp # *.h++ *.idl *.odl *.cs *.php *.php3 *.inc FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories # that are symbolic links (a Unix filesystem feature) are excluded from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. INPUT_FILTER = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = YES # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = NO # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = doc # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output dir. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 180 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimised for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assigments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse the # parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::addtions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. Note that this # option is superceded by the HAVE_DOT option below. This is only a fallback. It is # recommended to install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similiar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes that # lay further from the root node will be omitted. Note that setting this option to # 1 or 2 may greatly reduce the computation time needed for large code bases. Also # note that a graph may be further truncated if the graph's image dimensions are # not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). # If 0 is used for the depth value (the default), the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::addtions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO ================================================ FILE: thirdparty/LSD/lsd.c ================================================ /*---------------------------------------------------------------------------- LSD - Line Segment Detector on digital images Copyright 2007-2010 rafael grompone von gioi (grompone@gmail.com) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** @file lsd.c LSD module code @author rafael grompone von gioi (grompone@gmail.com) */ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** @mainpage LSD code documentation This is an implementation of the Line Segment Detector described in the paper: "LSD: A Fast Line Segment Detector with a False Detection Control" by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel, and Gregory Randall, IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 32, no. 4, pp. 722-732, April, 2010. and in more details in the CMLA Technical Report: "LSD: A Line Segment Detector, Technical Report", by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel, Gregory Randall, CMLA, ENS Cachan, 2010. The version implemented here includes some further improvements described on the LSD page at www.ipol.im. That same page includes more information, including this code and an online demo version: http://www.ipol.im/pub/algo/gjmr_line_segment_detector The module's main function is lsd(). The source code is contained in two files: lsd.h and lsd.c. HISTORY: - version 1.5 - dic 2010: Changes in 'refine', -W option added, and more comments added. - version 1.4 - jul 2010: lsd_scale interface added and doxygen doc. - version 1.3 - feb 2010: Multiple bug correction and improved code. - version 1.2 - dic 2009: First full Ansi C Language version. - version 1.1 - sep 2009: Systematic subsampling to scale 0.8 and correction to partially handle"angle problem". - version 1.0 - jan 2009: First complete Megawave2 and Ansi C Language version. @author rafael grompone von gioi (grompone@gmail.com) */ /*----------------------------------------------------------------------------*/ #include #include #include #include #include #include "lsd.h" /** ln(10) */ #ifndef M_LN10 #define M_LN10 2.30258509299404568402 #endif /* !M_LN10 */ /** PI */ #ifndef M_PI #define M_PI 3.14159265358979323846 #endif /* !M_PI */ #ifndef FALSE #define FALSE 0 #endif /* !FALSE */ #ifndef TRUE #define TRUE 1 #endif /* !TRUE */ /** Label for pixels with undefined gradient. */ #define NOTDEF -1024.0 /** 3/2 pi */ #define M_3_2_PI 4.71238898038 /** 2 pi */ #define M_2__PI 6.28318530718 /** Label for pixels not used in yet. */ #define NOTUSED 0 /** Label for pixels already used in detection. */ #define USED 1 /*----------------------------------------------------------------------------*/ /** Chained list of coordinates. */ struct coorlist { int x,y; struct coorlist * next; }; /*----------------------------------------------------------------------------*/ /** A point (or pixel). */ struct point {int x,y;}; /*----------------------------------------------------------------------------*/ /*------------------------- Miscellaneous functions --------------------------*/ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** Fatal error, print a message to standard-error output and exit. */ static void error(char * msg) { fprintf(stderr,"LSD Error: %s\n",msg); exit(EXIT_FAILURE); } /*----------------------------------------------------------------------------*/ /** Doubles relative error factor */ #define RELATIVE_ERROR_FACTOR 100.0 /*----------------------------------------------------------------------------*/ /** Compare doubles by relative error. The resulting rounding error after floating point computations depend on the specific operations done. The same number computed by different algorithms could present different rounding errors. For a useful comparison, an estimation of the relative rounding error should be considered and compared to a factor times EPS. The factor should be related to the cumulated rounding error in the chain of computation. Here, as a simplification, a fixed factor is used. */ static int double_equal(double a, double b) { double abs_diff,aa,bb,abs_max; /* trivial case */ if( a == b ) return TRUE; abs_diff = fabs(a-b); aa = fabs(a); bb = fabs(b); abs_max = aa > bb ? aa : bb; /* DBL_MIN is the smallest normalized number, thus, the smallest number whose relative error is bounded by DBL_EPSILON. For smaller numbers, the same quantization steps as for DBL_MIN are used. Then, for smaller numbers, a meaningful "relative" error should be computed by dividing the difference by DBL_MIN. */ if( abs_max < DBL_MIN ) abs_max = DBL_MIN; /* equal if relative error <= factor x eps */ return (abs_diff / abs_max) <= (RELATIVE_ERROR_FACTOR * DBL_EPSILON); } /*----------------------------------------------------------------------------*/ /** Computes Euclidean distance between point (x1,y1) and point (x2,y2). */ static double dist(double x1, double y1, double x2, double y2) { return sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ); } /*----------------------------------------------------------------------------*/ /*----------------------- 'list of n-tuple' data type ------------------------*/ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** Free memory used in n-tuple 'in'. */ void free_ntuple_list(ntuple_list in) { if( in == NULL || in->values == NULL ) error("free_ntuple_list: invalid n-tuple input."); free( (void *) in->values ); free( (void *) in ); } /*----------------------------------------------------------------------------*/ /** Create an n-tuple list and allocate memory for one element. @param dim the dimension (n) of the n-tuple. */ ntuple_list new_ntuple_list(unsigned int dim) { ntuple_list n_tuple; /* check parameters */ if( dim == 0 ) error("new_ntuple_list: 'dim' must be positive."); /* get memory for list structure */ n_tuple = (ntuple_list) malloc( sizeof(struct ntuple_list_s) ); if( n_tuple == NULL ) error("not enough memory."); /* initialize list */ n_tuple->size = 0; n_tuple->max_size = 1; n_tuple->dim = dim; /* get memory for tuples */ n_tuple->values = (double *) malloc( dim*n_tuple->max_size * sizeof(double) ); if( n_tuple->values == NULL ) error("not enough memory."); return n_tuple; } /*----------------------------------------------------------------------------*/ /** Enlarge the allocated memory of an n-tuple list. */ static void enlarge_ntuple_list(ntuple_list n_tuple) { /* check parameters */ if( n_tuple == NULL || n_tuple->values == NULL || n_tuple->max_size == 0 ) error("enlarge_ntuple_list: invalid n-tuple."); /* duplicate number of tuples */ n_tuple->max_size *= 2; /* realloc memory */ n_tuple->values = (double *) realloc( (void *) n_tuple->values, n_tuple->dim * n_tuple->max_size * sizeof(double) ); if( n_tuple->values == NULL ) error("not enough memory."); } /*----------------------------------------------------------------------------*/ /** Add a 5-tuple to an n-tuple list. */ static void add_5tuple( ntuple_list out, double v1, double v2, double v3, double v4, double v5 ) { /* check parameters */ if( out == NULL ) error("add_5tuple: invalid n-tuple input."); if( out->dim != 5 ) error("add_5tuple: the n-tuple must be a 5-tuple."); /* if needed, alloc more tuples to 'out' */ if( out->size == out->max_size ) enlarge_ntuple_list(out); if( out->values == NULL ) error("add_5tuple: invalid n-tuple input."); /* add new 5-tuple */ out->values[ out->size * out->dim + 0 ] = v1; out->values[ out->size * out->dim + 1 ] = v2; out->values[ out->size * out->dim + 2 ] = v3; out->values[ out->size * out->dim + 3 ] = v4; out->values[ out->size * out->dim + 4 ] = v5; /* update number of tuples counter */ out->size++; } /*----------------------------------------------------------------------------*/ /*----------------------------- Image Data Types -----------------------------*/ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** Free memory used in image_char 'i'. */ void free_image_char(image_char i) { if( i == NULL || i->data == NULL ) error("free_image_char: invalid input image."); free( (void *) i->data ); free( (void *) i ); } /*----------------------------------------------------------------------------*/ /** Create a new image_char of size 'xsize' times 'ysize'. */ image_char new_image_char(unsigned int xsize, unsigned int ysize) { image_char image; /* check parameters */ if( xsize == 0 || ysize == 0 ) error("new_image_char: invalid image size."); /* get memory */ image = (image_char) malloc( sizeof(struct image_char_s) ); if( image == NULL ) error("not enough memory."); image->data = (unsigned char *) calloc( (size_t) (xsize*ysize), sizeof(unsigned char) ); if( image->data == NULL ) error("not enough memory."); /* set image size */ image->xsize = xsize; image->ysize = ysize; return image; } /*----------------------------------------------------------------------------*/ /** Create a new image_char of size 'xsize' times 'ysize', initialized to the value 'fill_value'. */ image_char new_image_char_ini( unsigned int xsize, unsigned int ysize, unsigned char fill_value ) { image_char image = new_image_char(xsize,ysize); /* create image */ unsigned int N = xsize*ysize; unsigned int i; /* check parameters */ if( image == NULL || image->data == NULL ) error("new_image_char_ini: invalid image."); /* initialize */ for(i=0; idata[i] = fill_value; return image; } /*----------------------------------------------------------------------------*/ /** Free memory used in image_int 'i'. */ void free_image_int(image_int i) { if( i == NULL || i->data == NULL ) error("free_image_int: invalid input image."); free( (void *) i->data ); free( (void *) i ); } /*----------------------------------------------------------------------------*/ /** Create a new image_int of size 'xsize' times 'ysize'. */ image_int new_image_int(unsigned int xsize, unsigned int ysize) { image_int image; /* check parameters */ if( xsize == 0 || ysize == 0 ) error("new_image_int: invalid image size."); /* get memory */ image = (image_int) malloc( sizeof(struct image_int_s) ); if( image == NULL ) error("not enough memory."); image->data = (int *) calloc( (size_t) (xsize*ysize), sizeof(int) ); if( image->data == NULL ) error("not enough memory."); /* set image size */ image->xsize = xsize; image->ysize = ysize; return image; } /*----------------------------------------------------------------------------*/ /** Create a new image_int of size 'xsize' times 'ysize', initialized to the value 'fill_value'. */ image_int new_image_int_ini( unsigned int xsize, unsigned int ysize, int fill_value ) { image_int image = new_image_int(xsize,ysize); /* create image */ unsigned int N = xsize*ysize; unsigned int i; /* initialize */ for(i=0; idata[i] = fill_value; return image; } /*----------------------------------------------------------------------------*/ /** Free memory used in image_double 'i'. */ void free_image_double(image_double i) { if( i == NULL || i->data == NULL ) error("free_image_double: invalid input image."); free( (void *) i->data ); free( (void *) i ); } /*----------------------------------------------------------------------------*/ /** Create a new image_double of size 'xsize' times 'ysize'. */ image_double new_image_double(unsigned int xsize, unsigned int ysize) { image_double image; /* check parameters */ if( xsize == 0 || ysize == 0 ) error("new_image_double: invalid image size."); /* get memory */ image = (image_double) malloc( sizeof(struct image_double_s) ); if( image == NULL ) error("not enough memory."); image->data = (double *) calloc( (size_t) (xsize*ysize), sizeof(double) ); if( image->data == NULL ) error("not enough memory."); /* set image size */ image->xsize = xsize; image->ysize = ysize; return image; } /*----------------------------------------------------------------------------*/ /** Create a new image_double of size 'xsize' times 'ysize', initialized to the value 'fill_value'. */ image_double new_image_double_ini( unsigned int xsize, unsigned int ysize, double fill_value ) { image_double image = new_image_double(xsize,ysize); /* create image */ unsigned int N = xsize*ysize; unsigned int i; /* initialize */ for(i=0; idata[i] = fill_value; return image; } /*----------------------------------------------------------------------------*/ /*----------------------------- Gaussian filter ------------------------------*/ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** Compute a Gaussian kernel of length 'kernel->dim', standard deviation 'sigma', and centered at value 'mean'. For example, if mean=0.5, the Gaussian will be centered in the middle point between values 'kernel->values[0]' and 'kernel->values[1]'. */ static void gaussian_kernel(ntuple_list kernel, double sigma, double mean) { double sum = 0.0; double val; unsigned int i; /* check parameters */ if( kernel == NULL || kernel->values == NULL ) error("gaussian_kernel: invalid n-tuple 'kernel'."); if( sigma <= 0.0 ) error("gaussian_kernel: 'sigma' must be positive."); /* compute Gaussian kernel */ if( kernel->max_size < 1 ) enlarge_ntuple_list(kernel); kernel->size = 1; for(i=0;idim;i++) { val = ( (double) i - mean ) / sigma; kernel->values[i] = exp( -0.5 * val * val ); sum += kernel->values[i]; } /* normalization */ if( sum >= 0.0 ) for(i=0;idim;i++) kernel->values[i] /= sum; } /*----------------------------------------------------------------------------*/ /** Scale the input image 'in' by a factor 'scale' by Gaussian sub-sampling. For example, scale=0.8 will give a result at 80% of the original size. The image is convolved with a Gaussian kernel @f[ G(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2+y^2}{2\sigma^2}} @f] before the sub-sampling to prevent aliasing. The standard deviation sigma given by: - sigma = sigma_scale / scale, if scale < 1.0 - sigma = sigma_scale, if scale >= 1.0 To be able to sub-sample at non-integer steps, some interpolation is needed. In this implementation, the interpolation is done by the Gaussian kernel, so both operations (filtering and sampling) are done at the same time. The Gaussian kernel is computed centered on the coordinates of the required sample. In this way, when applied, it gives directly the result of convolving the image with the kernel and interpolated to that particular position. A fast algorithm is done using the separability of the Gaussian kernel. Applying the 2D Gaussian kernel is equivalent to applying first a horizontal 1D Gaussian kernel and then a vertical 1D Gaussian kernel (or the other way round). The reason is that @f[ G(x,y) = G(x) * G(y) @f] where @f[ G(x) = \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{x^2}{2\sigma^2}}. @f] The algorithm first apply a combined Gaussian kernel and sampling in the x axis, and then the combined Gaussian kernel and sampling in the y axis. */ static image_double gaussian_sampler( image_double in, double scale, double sigma_scale ) { image_double aux,out; ntuple_list kernel; unsigned int N,M,h,n,x,y,i; int xc,yc,j,double_x_size,double_y_size; double sigma,xx,yy,sum,prec; /* check parameters */ if( in == NULL || in->data == NULL || in->xsize == 0 || in->ysize == 0 ) error("gaussian_sampler: invalid image."); if( scale <= 0.0 ) error("gaussian_sampler: 'scale' must be positive."); if( sigma_scale <= 0.0 ) error("gaussian_sampler: 'sigma_scale' must be positive."); /* get memory for images */ if( in->xsize * scale > (double) UINT_MAX || in->ysize * scale > (double) UINT_MAX ) error("gaussian_sampler: the output image size exceeds the handled size."); N = (unsigned int) floor( in->xsize * scale ); M = (unsigned int) floor( in->ysize * scale ); aux = new_image_double(N,in->ysize); out = new_image_double(N,M); /* sigma, kernel size and memory for the kernel */ sigma = scale < 1.0 ? sigma_scale / scale : sigma_scale; /* The size of the kernel is selected to guarantee that the the first discarded term is at least 10^prec times smaller than the central value. For that, h should be larger than x, with e^(-x^2/2sigma^2) = 1/10^prec. Then, x = sigma * sqrt( 2 * prec * ln(10) ). */ prec = 3.0; h = (unsigned int) ceil( sigma * sqrt( 2.0 * prec * log(10.0) ) ); n = 1+2*h; /* kernel size */ kernel = new_ntuple_list(n); /* auxiliary double image size variables */ double_x_size = (int) (2 * in->xsize); double_y_size = (int) (2 * in->ysize); /* First subsampling: x axis */ for(x=0;xxsize;x++) { /* x is the coordinate in the new image. xx is the corresponding x-value in the original size image. xc is the integer value, the pixel coordinate of xx. */ xx = (double) x / scale; /* coordinate (0.0,0.0) is in the center of pixel (0,0), so the pixel with xc=0 get the values of xx from -0.5 to 0.5 */ xc = (int) floor( xx + 0.5 ); gaussian_kernel( kernel, sigma, (double) h + xx - (double) xc ); /* the kernel must be computed for each x because the fine offset xx-xc is different in each case */ for(y=0;yysize;y++) { sum = 0.0; for(i=0;idim;i++) { j = xc - h + i; /* symmetry boundary condition */ while( j < 0 ) j += double_x_size; while( j >= double_x_size ) j -= double_x_size; if( j >= (int) in->xsize ) j = double_x_size-1-j; sum += in->data[ j + y * in->xsize ] * kernel->values[i]; } aux->data[ x + y * aux->xsize ] = sum; } } /* Second subsampling: y axis */ for(y=0;yysize;y++) { /* y is the coordinate in the new image. yy is the corresponding x-value in the original size image. yc is the integer value, the pixel coordinate of xx. */ yy = (double) y / scale; /* coordinate (0.0,0.0) is in the center of pixel (0,0), so the pixel with yc=0 get the values of yy from -0.5 to 0.5 */ yc = (int) floor( yy + 0.5 ); gaussian_kernel( kernel, sigma, (double) h + yy - (double) yc ); /* the kernel must be computed for each y because the fine offset yy-yc is different in each case */ for(x=0;xxsize;x++) { sum = 0.0; for(i=0;idim;i++) { j = yc - h + i; /* symmetry boundary condition */ while( j < 0 ) j += double_y_size; while( j >= double_y_size ) j -= double_y_size; if( j >= (int) in->ysize ) j = double_y_size-1-j; sum += aux->data[ x + j * aux->xsize ] * kernel->values[i]; } out->data[ x + y * out->xsize ] = sum; } } /* free memory */ free_ntuple_list(kernel); free_image_double(aux); return out; } /*----------------------------------------------------------------------------*/ /*--------------------------------- Gradient ---------------------------------*/ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** Computes the direction of the level line of 'in' at each point. The result is: - an image_double with the angle at each pixel, or NOTDEF if not defined. - the image_double 'modgrad' (a pointer is passed as argument) with the gradient magnitude at each point. - a list of pixels 'list_p' roughly ordered by decreasing gradient magnitude. (The order is made by classifying points into bins by gradient magnitude. The parameters 'n_bins' and 'max_grad' specify the number of bins and the gradient modulus at the highest bin. The pixels in the list would be in decreasing gradient magnitude, up to a precision of the size of the bins.) - a pointer 'mem_p' to the memory used by 'list_p' to be able to free the memory when it is not used anymore. */ static image_double ll_angle( image_double in, double threshold, struct coorlist ** list_p, void ** mem_p, image_double * modgrad, unsigned int n_bins, double max_grad ) { image_double g; unsigned int n,p,x,y,adr,i; double com1,com2,gx,gy,norm,norm2; /* the rest of the variables are used for pseudo-ordering the gradient magnitude values */ int list_count = 0; struct coorlist * list; struct coorlist ** range_l_s; /* array of pointers to start of bin list */ struct coorlist ** range_l_e; /* array of pointers to end of bin list */ struct coorlist * start; struct coorlist * end; /* check parameters */ if( in == NULL || in->data == NULL || in->xsize == 0 || in->ysize == 0 ) error("ll_angle: invalid image."); if( threshold < 0.0 ) error("ll_angle: 'threshold' must be positive."); if( list_p == NULL ) error("ll_angle: NULL pointer 'list_p'."); if( mem_p == NULL ) error("ll_angle: NULL pointer 'mem_p'."); if( modgrad == NULL ) error("ll_angle: NULL pointer 'modgrad'."); if( n_bins == 0 ) error("ll_angle: 'n_bins' must be positive."); if( max_grad <= 0.0 ) error("ll_angle: 'max_grad' must be positive."); /* image size shortcuts */ n = in->ysize; p = in->xsize; /* allocate output image */ g = new_image_double(in->xsize,in->ysize); /* get memory for the image of gradient modulus */ *modgrad = new_image_double(in->xsize,in->ysize); /* get memory for "ordered" list of pixels */ list = (struct coorlist *) calloc( (size_t) (n*p), sizeof(struct coorlist) ); *mem_p = (void *) list; range_l_s = (struct coorlist **) calloc( (size_t) n_bins, sizeof(struct coorlist *) ); range_l_e = (struct coorlist **) calloc( (size_t) n_bins, sizeof(struct coorlist *) ); if( list == NULL || range_l_s == NULL || range_l_e == NULL ) error("not enough memory."); for(i=0;idata[(n-1)*p+x] = NOTDEF; for(y=0;ydata[p*y+p-1] = NOTDEF; /* compute gradient on the remaining pixels */ for(x=0;xdata[adr+p+1] - in->data[adr]; com2 = in->data[adr+1] - in->data[adr+p]; gx = com1+com2; /* gradient x component */ gy = com1-com2; /* gradient y component */ norm2 = gx*gx+gy*gy; norm = sqrt( norm2 / 4.0 ); /* gradient norm */ (*modgrad)->data[adr] = norm; /* store gradient norm */ if( norm <= threshold ) /* norm too small, gradient no defined */ g->data[adr] = NOTDEF; /* gradient angle not defined */ else { /* gradient angle computation */ g->data[adr] = atan2(gx,-gy); /* store the point in the right bin according to its norm */ i = (unsigned int) (norm * (double) n_bins / max_grad); if( i >= n_bins ) i = n_bins-1; if( range_l_e[i] == NULL ) range_l_s[i] = range_l_e[i] = list+list_count++; else { range_l_e[i]->next = list+list_count; range_l_e[i] = list+list_count++; } range_l_e[i]->x = (int) x; range_l_e[i]->y = (int) y; range_l_e[i]->next = NULL; } } /* Make the list of pixels (almost) ordered by norm value. It starts by the larger bin, so the list starts by the pixels with higher gradient value. Pixels would be ordered by norm value, up to a precision given by max_grad/n_bins. */ for(i=n_bins-1; i>0 && range_l_s[i]==NULL; i--); start = range_l_s[i]; end = range_l_e[i]; if( start != NULL ) for(i--;i>0; i--) if( range_l_s[i] != NULL ) { end->next = range_l_s[i]; end = range_l_e[i]; } *list_p = start; /* free memory */ free( (void *) range_l_s ); free( (void *) range_l_e ); return g; } /*----------------------------------------------------------------------------*/ /** Is point (x,y) aligned to angle theta, up to precision 'prec'? */ static int isaligned( int x, int y, image_double angles, double theta, double prec ) { double a; /* check parameters */ if( angles == NULL || angles->data == NULL ) error("isaligned: invalid image 'angles'."); if( x < 0 || y < 0 || x >= (int) angles->xsize || y >= (int) angles->ysize ) error("isaligned: (x,y) out of the image."); if( prec < 0.0 ) error("isaligned: 'prec' must be positive."); /* angle at pixel (x,y) */ a = angles->data[ x + y * angles->xsize ]; /* pixels whose level-line angle is not defined are considered as NON-aligned */ if( a == NOTDEF ) return FALSE; /* there is no need to call the function 'double_equal' here because there is no risk of problems related to the comparison doubles, we are only interested in the exact NOTDEF value */ /* it is assumed that 'theta' and 'a' are in the range [-pi,pi] */ theta -= a; if( theta < 0.0 ) theta = -theta; if( theta > M_3_2_PI ) { theta -= M_2__PI; if( theta < 0.0 ) theta = -theta; } return theta < prec; } /*----------------------------------------------------------------------------*/ /** Absolute value angle difference. */ static double angle_diff(double a, double b) { a -= b; while( a <= -M_PI ) a += M_2__PI; while( a > M_PI ) a -= M_2__PI; if( a < 0.0 ) a = -a; return a; } /*----------------------------------------------------------------------------*/ /** Signed angle difference. */ static double angle_diff_signed(double a, double b) { a -= b; while( a <= -M_PI ) a += M_2__PI; while( a > M_PI ) a -= M_2__PI; return a; } /*----------------------------------------------------------------------------*/ /*----------------------------- NFA computation ------------------------------*/ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** Computes the natural logarithm of the absolute value of the gamma function of x using the Lanczos approximation. See http://www.rskey.org/gamma.htm The formula used is @f[ \Gamma(x) = \frac{ \sum_{n=0}^{N} q_n x^n }{ \Pi_{n=0}^{N} (x+n) } (x+5.5)^{x+0.5} e^{-(x+5.5)} @f] so @f[ \log\Gamma(x) = \log\left( \sum_{n=0}^{N} q_n x^n \right) + (x+0.5) \log(x+5.5) - (x+5.5) - \sum_{n=0}^{N} \log(x+n) @f] and q0 = 75122.6331530, q1 = 80916.6278952, q2 = 36308.2951477, q3 = 8687.24529705, q4 = 1168.92649479, q5 = 83.8676043424, q6 = 2.50662827511. */ static double log_gamma_lanczos(double x) { static double q[7] = { 75122.6331530, 80916.6278952, 36308.2951477, 8687.24529705, 1168.92649479, 83.8676043424, 2.50662827511 }; double a = (x+0.5) * log(x+5.5) - (x+5.5); double b = 0.0; int n; for(n=0;n<7;n++) { a -= log( x + (double) n ); b += q[n] * pow( x, (double) n ); } return a + log(b); } /*----------------------------------------------------------------------------*/ /** Computes the natural logarithm of the absolute value of the gamma function of x using Windschitl method. See http://www.rskey.org/gamma.htm The formula used is @f[ \Gamma(x) = \sqrt{\frac{2\pi}{x}} \left( \frac{x}{e} \sqrt{ x\sinh(1/x) + \frac{1}{810x^6} } \right)^x @f] so @f[ \log\Gamma(x) = 0.5\log(2\pi) + (x-0.5)\log(x) - x + 0.5x\log\left( x\sinh(1/x) + \frac{1}{810x^6} \right). @f] This formula is a good approximation when x > 15. */ static double log_gamma_windschitl(double x) { return 0.918938533204673 + (x-0.5)*log(x) - x + 0.5*x*log( x*sinh(1/x) + 1/(810.0*pow(x,6.0)) ); } /*----------------------------------------------------------------------------*/ /** Computes the natural logarithm of the absolute value of the gamma function of x. When x>15 use log_gamma_windschitl(), otherwise use log_gamma_lanczos(). */ #define log_gamma(x) ((x)>15.0?log_gamma_windschitl(x):log_gamma_lanczos(x)) /*----------------------------------------------------------------------------*/ /** Size of the table to store already computed inverse values. */ #define TABSIZE 100000 /*----------------------------------------------------------------------------*/ /** Computes -log10(NFA). NFA stands for Number of False Alarms: @f[ \mathrm{NFA} = NT \cdot B(n,k,p) @f] - NT - number of tests - B(n,k,p) - tail of binomial distribution with parameters n,k and p: @f[ B(n,k,p) = \sum_{j=k}^n \left(\begin{array}{c}n\\j\end{array}\right) p^{j} (1-p)^{n-j} @f] The value -log10(NFA) is equivalent but more intuitive than NFA: - -1 corresponds to 10 mean false alarms - 0 corresponds to 1 mean false alarm - 1 corresponds to 0.1 mean false alarms - 2 corresponds to 0.01 mean false alarms - ... Used this way, the bigger the value, better the detection, and a logarithmic scale is used. @param n,k,p binomial parameters. @param logNT logarithm of Number of Tests The computation is based in the gamma function by the following relation: @f[ \left(\begin{array}{c}n\\k\end{array}\right) = \frac{ \Gamma(n+1) }{ \Gamma(k+1) \cdot \Gamma(n-k+1) }. @f] We use efficient algorithms to compute the logarithm of the gamma function. To make the computation faster, not all the sum is computed, part of the terms are neglected based on a bound to the error obtained (an error of 10% in the result is accepted). */ static double nfa(int n, int k, double p, double logNT) { static double inv[TABSIZE]; /* table to keep computed inverse values */ double tolerance = 0.1; /* an error of 10% in the result is accepted */ double log1term,term,bin_term,mult_term,bin_tail,err,p_term; int i; /* check parameters */ if( n<0 || k<0 || k>n || p<=0.0 || p>=1.0 ) error("nfa: wrong n, k or p values."); /* trivial cases */ if( n==0 || k==0 ) return -logNT; if( n==k ) return -logNT - (double) n * log10(p); /* probability term */ p_term = p / (1.0-p); /* compute the first term of the series */ /* binomial_tail(n,k,p) = sum_{i=k}^n bincoef(n,i) * p^i * (1-p)^{n-i} where bincoef(n,i) are the binomial coefficients. But bincoef(n,k) = gamma(n+1) / ( gamma(k+1) * gamma(n-k+1) ). We use this to compute the first term. Actually the log of it. */ log1term = log_gamma( (double) n + 1.0 ) - log_gamma( (double) k + 1.0 ) - log_gamma( (double) (n-k) + 1.0 ) + (double) k * log(p) + (double) (n-k) * log(1.0-p); term = exp(log1term); /* in some cases no more computations are needed */ if( double_equal(term,0.0) ) /* the first term is almost zero */ { if( (double) k > (double) n * p ) /* at begin or end of the tail? */ return -log1term / M_LN10 - logNT; /* end: use just the first term */ else return -logNT; /* begin: the tail is roughly 1 */ } /* compute more terms if needed */ bin_tail = term; for(i=k+1;i<=n;i++) { /* As term_i = bincoef(n,i) * p^i * (1-p)^(n-i) and bincoef(n,i)/bincoef(n,i-1) = n-1+1 / i, then, term_i / term_i-1 = (n-i+1)/i * p/(1-p) and term_i = term_i-1 * (n-i+1)/i * p/(1-p). 1/i is stored in a table as they are computed, because divisions are expensive. p/(1-p) is computed only once and stored in 'p_term'. */ bin_term = (double) (n-i+1) * ( ii. Then, the error on the binomial tail when truncated at the i term can be bounded by a geometric series of form term_i * sum mult_term_i^j. */ err = term * ( ( 1.0 - pow( mult_term, (double) (n-i+1) ) ) / (1.0-mult_term) - 1.0 ); /* One wants an error at most of tolerance*final_result, or: tolerance * abs(-log10(bin_tail)-logNT). Now, the error that can be accepted on bin_tail is given by tolerance*final_result divided by the derivative of -log10(x) when x=bin_tail. that is: tolerance * abs(-log10(bin_tail)-logNT) / (1/bin_tail) Finally, we truncate the tail if the error is less than: tolerance * abs(-log10(bin_tail)-logNT) * bin_tail */ if( err < tolerance * fabs(-log10(bin_tail)-logNT) * bin_tail ) break; } } return -log10(bin_tail) - logNT; } /*----------------------------------------------------------------------------*/ /*--------------------------- Rectangle structure ----------------------------*/ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** Rectangle structure: line segment with width. */ struct rect { double x1,y1,x2,y2; /* first and second point of the line segment */ double width; /* rectangle width */ double x,y; /* center of the rectangle */ double theta; /* angle */ double dx,dy; /* vector with the line segment angle */ double prec; /* tolerance angle */ double p; /* probability of a point with angle within 'prec' */ }; /*----------------------------------------------------------------------------*/ /** Copy one rectangle structure to another. */ static void rect_copy(struct rect * in, struct rect * out) { /* check parameters */ if( in == NULL || out == NULL ) error("rect_copy: invalid 'in' or 'out'."); /* copy values */ out->x1 = in->x1; out->y1 = in->y1; out->x2 = in->x2; out->y2 = in->y2; out->width = in->width; out->x = in->x; out->y = in->y; out->theta = in->theta; out->dx = in->dx; out->dy = in->dy; out->prec = in->prec; out->p = in->p; } /*----------------------------------------------------------------------------*/ /** Rectangle points iterator. The integer coordinates of pixels inside a rectangle are iteratively explored. This structure keep track of the process and functions ri_ini(), ri_inc(), ri_end(), and ri_del() are used in the process. An example of how to use the iterator is as follows: \code struct rect * rec = XXX; // some rectangle rect_iter * i; for( i=ri_ini(rec); !ri_end(i); ri_inc(i) ) { // your code, using 'i->x' and 'i->y' as coordinates } ri_del(i); // delete iterator \endcode The pixels are explored 'column' by 'column', where we call 'column' a set of pixels with the same x value that are inside the rectangle. The following is an schematic representation of a rectangle, the 'column' being explored is marked by colons, and the current pixel being explored is 'x,y'. \verbatim vx[1],vy[1] * * * * * * * ye * : * vx[0],vy[0] : * * : * * x,y * * : * * : vx[2],vy[2] * : * y ys * ^ * * | * * | * * +---> x vx[3],vy[3] \endverbatim The first 'column' to be explored is the one with the smaller x value. Each 'column' is explored starting from the pixel of the 'column' (inside the rectangle) with the smaller y value. The four corners of the rectangle are stored in order that rotates around the corners at the arrays 'vx[]' and 'vy[]'. The first point is always the one with smaller x value. 'x' and 'y' are the coordinates of the pixel being explored. 'ys' and 'ye' are the start and end values of the current column being explored. So, 'ys' < 'ye'. */ typedef struct { double vx[4]; /* rectangle's corner X coordinates in circular order */ double vy[4]; /* rectangle's corner Y coordinates in circular order */ double ys,ye; /* start and end Y values of current 'column' */ int x,y; /* coordinates of currently explored pixel */ } rect_iter; /*----------------------------------------------------------------------------*/ /** Interpolate y value corresponding to 'x' value given, in the line 'x1,y1' to 'x2,y2'; if 'x1=x2' return the smaller of 'y1' and 'y2'. The following restrictions are required: - x1 <= x2 - x1 <= x - x <= x2 */ static double inter_low(double x, double x1, double y1, double x2, double y2) { /* check parameters */ if( x1 > x2 || x < x1 || x > x2 ) error("inter_low: unsuitable input, 'x1>x2' or 'xx2'."); /* interpolation */ if( double_equal(x1,x2) && y1y2 ) return y2; return y1 + (x-x1) * (y2-y1) / (x2-x1); } /*----------------------------------------------------------------------------*/ /** Interpolate y value corresponding to 'x' value given, in the line 'x1,y1' to 'x2,y2'; if 'x1=x2' return the larger of 'y1' and 'y2'. The following restrictions are required: - x1 <= x2 - x1 <= x - x <= x2 */ static double inter_hi(double x, double x1, double y1, double x2, double y2) { /* check parameters */ if( x1 > x2 || x < x1 || x > x2 ) error("inter_hi: unsuitable input, 'x1>x2' or 'xx2'."); /* interpolation */ if( double_equal(x1,x2) && y1y2 ) return y1; return y1 + (x-x1) * (y2-y1) / (x2-x1); } /*----------------------------------------------------------------------------*/ /** Free memory used by a rectangle iterator. */ static void ri_del(rect_iter * iter) { if( iter == NULL ) error("ri_del: NULL iterator."); free( (void *) iter ); } /*----------------------------------------------------------------------------*/ /** Check if the iterator finished the full iteration. See details in \ref rect_iter */ static int ri_end(rect_iter * i) { /* check input */ if( i == NULL ) error("ri_end: NULL iterator."); /* if the current x value is larger than the larger x value in the rectangle (vx[2]), we know the full exploration of the rectangle is finished. */ return (double)(i->x) > i->vx[2]; } /*----------------------------------------------------------------------------*/ /** Increment a rectangle iterator. See details in \ref rect_iter */ static void ri_inc(rect_iter * i) { /* check input */ if( i == NULL ) error("ri_inc: NULL iterator."); /* if not at end of exploration, increase y value for next pixel in the 'column' */ if( !ri_end(i) ) i->y++; /* if the end of the current 'column' is reached, and it is not the end of exploration, advance to the next 'column' */ while( (double) (i->y) > i->ye && !ri_end(i) ) { /* increase x, next 'column' */ i->x++; /* if end of exploration, return */ if( ri_end(i) ) return; /* update lower y limit (start) for the new 'column'. We need to interpolate the y value that corresponds to the lower side of the rectangle. The first thing is to decide if the corresponding side is vx[0],vy[0] to vx[3],vy[3] or vx[3],vy[3] to vx[2],vy[2] Then, the side is interpolated for the x value of the 'column'. But, if the side is vertical (as it could happen if the rectangle is vertical and we are dealing with the first or last 'columns') then we pick the lower value of the side by using 'inter_low'. */ if( (double) i->x < i->vx[3] ) i->ys = inter_low((double)i->x,i->vx[0],i->vy[0],i->vx[3],i->vy[3]); else i->ys = inter_low((double)i->x,i->vx[3],i->vy[3],i->vx[2],i->vy[2]); /* update upper y limit (end) for the new 'column'. We need to interpolate the y value that corresponds to the upper side of the rectangle. The first thing is to decide if the corresponding side is vx[0],vy[0] to vx[1],vy[1] or vx[1],vy[1] to vx[2],vy[2] Then, the side is interpolated for the x value of the 'column'. But, if the side is vertical (as it could happen if the rectangle is vertical and we are dealing with the first or last 'columns') then we pick the lower value of the side by using 'inter_low'. */ if( (double)i->x < i->vx[1] ) i->ye = inter_hi((double)i->x,i->vx[0],i->vy[0],i->vx[1],i->vy[1]); else i->ye = inter_hi((double)i->x,i->vx[1],i->vy[1],i->vx[2],i->vy[2]); /* new y */ i->y = (int) ceil(i->ys); } } /*----------------------------------------------------------------------------*/ /** Create and initialize a rectangle iterator. See details in \ref rect_iter */ static rect_iter * ri_ini(struct rect * r) { double vx[4],vy[4]; int n,offset; rect_iter * i; /* check parameters */ if( r == NULL ) error("ri_ini: invalid rectangle."); /* get memory */ i = (rect_iter *) malloc(sizeof(rect_iter)); if( i == NULL ) error("ri_ini: Not enough memory."); /* build list of rectangle corners ordered in a circular way around the rectangle */ vx[0] = r->x1 - r->dy * r->width / 2.0; vy[0] = r->y1 + r->dx * r->width / 2.0; vx[1] = r->x2 - r->dy * r->width / 2.0; vy[1] = r->y2 + r->dx * r->width / 2.0; vx[2] = r->x2 + r->dy * r->width / 2.0; vy[2] = r->y2 - r->dx * r->width / 2.0; vx[3] = r->x1 + r->dy * r->width / 2.0; vy[3] = r->y1 - r->dx * r->width / 2.0; /* compute rotation of index of corners needed so that the first point has the smaller x. if one side is vertical, thus two corners have the same smaller x value, the one with the largest y value is selected as the first. */ if( r->x1 < r->x2 && r->y1 <= r->y2 ) offset = 0; else if( r->x1 >= r->x2 && r->y1 < r->y2 ) offset = 1; else if( r->x1 > r->x2 && r->y1 >= r->y2 ) offset = 2; else offset = 3; /* apply rotation of index. */ for(n=0; n<4; n++) { i->vx[n] = vx[(offset+n)%4]; i->vy[n] = vy[(offset+n)%4]; } /* Set a initial condition. The values are set to values that will cause 'ri_inc' (that will be called immediately) to initialize correctly the first 'column' and compute the limits 'ys' and 'ye'. 'y' is set to the integer value of vy[0], the starting corner. 'ys' and 'ye' are set to very small values, so 'ri_inc' will notice that it needs to start a new 'column'. The smaller integer coordinate inside of the rectangle is 'ceil(vx[0])'. The current 'x' value is set to that value minus one, so 'ri_inc' (that will increase x by one) will advance to the first 'column'. */ i->x = (int) ceil(i->vx[0]) - 1; i->y = (int) ceil(i->vy[0]); i->ys = i->ye = -DBL_MAX; /* advance to the first pixel */ ri_inc(i); return i; } /*----------------------------------------------------------------------------*/ /** Compute a rectangle's NFA value. */ static double rect_nfa(struct rect * rec, image_double angles, double logNT) { rect_iter * i; int pts = 0; int alg = 0; /* check parameters */ if( rec == NULL ) error("rect_nfa: invalid rectangle."); if( angles == NULL ) error("rect_nfa: invalid 'angles'."); /* compute the total number of pixels and of aligned points in 'rec' */ for(i=ri_ini(rec); !ri_end(i); ri_inc(i)) /* rectangle iterator */ if( i->x >= 0 && i->y >= 0 && i->x < (int) angles->xsize && i->y < (int) angles->ysize ) { ++pts; /* total number of pixels counter */ if( isaligned(i->x, i->y, angles, rec->theta, rec->prec) ) ++alg; /* aligned points counter */ } ri_del(i); /* delete iterator */ return nfa(pts,alg,rec->p,logNT); /* compute NFA value */ } /*----------------------------------------------------------------------------*/ /*---------------------------------- Regions ---------------------------------*/ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** Compute region's angle as the principal inertia axis of the region. The following is the region inertia matrix A: @f[ A = \left(\begin{array}{cc} Ixx & Ixy \\ Ixy & Iyy \\ \end{array}\right) @f] where Ixx = sum_i G(i).(y_i - cx)^2 Iyy = sum_i G(i).(x_i - cy)^2 Ixy = - sum_i G(i).(x_i - cx).(y_i - cy) and - G(i) is the gradient norm at pixel i, used as pixel's weight. - x_i and y_i are the coordinates of pixel i. - cx and cy are the coordinates of the center of th region. lambda1 and lambda2 are the eigenvalues of matrix A, with lambda1 >= lambda2. They are found by solving the characteristic polynomial: det( lambda I - A) = 0 that gives: lambda1 = ( Ixx + Iyy + sqrt( (Ixx-Iyy)^2 + 4.0*Ixy*Ixy) ) / 2 lambda2 = ( Ixx + Iyy - sqrt( (Ixx-Iyy)^2 + 4.0*Ixy*Ixy) ) / 2 To get the line segment direction we want to get the angle the eigenvector assotiated to the smaller eigenvalue. We have to solve a,b in: a.Ixx + b.Ixy = a.lambda2 a.Ixy + b.Iyy = b.lambda2 We want the angle theta = atan(b/a). It can be computed with any of the two equations: theta = atan( (lambda2-Ixx) / Ixy ) or theta = atan( Ixy / (lambda2-Iyy) ) When |Ixx| > |Iyy| we use the first, otherwise the second (just to get better numeric precision). */ static double get_theta( struct point * reg, int reg_size, double x, double y, image_double modgrad, double reg_angle, double prec ) { double lambda,theta,weight; double Ixx = 0.0; double Iyy = 0.0; double Ixy = 0.0; int i; /* check parameters */ if( reg == NULL ) error("get_theta: invalid region."); if( reg_size <= 1 ) error("get_theta: region size <= 1."); if( modgrad == NULL || modgrad->data == NULL ) error("get_theta: invalid 'modgrad'."); if( prec < 0.0 ) error("get_theta: 'prec' must be positive."); /* compute inertia matrix */ for(i=0; idata[ reg[i].x + reg[i].y * modgrad->xsize ]; Ixx += ( (double) reg[i].y - y ) * ( (double) reg[i].y - y ) * weight; Iyy += ( (double) reg[i].x - x ) * ( (double) reg[i].x - x ) * weight; Ixy -= ( (double) reg[i].x - x ) * ( (double) reg[i].y - y ) * weight; } if( double_equal(Ixx,0.0) && double_equal(Iyy,0.0) && double_equal(Ixy,0.0) ) error("get_theta: null inertia matrix."); /* compute smallest eigenvalue */ lambda = 0.5 * ( Ixx + Iyy - sqrt( (Ixx-Iyy)*(Ixx-Iyy) + 4.0*Ixy*Ixy ) ); /* compute angle */ theta = fabs(Ixx)>fabs(Iyy) ? atan2(lambda-Ixx,Ixy) : atan2(Ixy,lambda-Iyy); /* The previous procedure don't cares about orientation, so it could be wrong by 180 degrees. Here is corrected if necessary. */ if( angle_diff(theta,reg_angle) > prec ) theta += M_PI; return theta; } /*----------------------------------------------------------------------------*/ /** Computes a rectangle that covers a region of points. */ static void region2rect( struct point * reg, int reg_size, image_double modgrad, double reg_angle, double prec, double p, struct rect * rec ) { double x,y,dx,dy,l,w,theta,weight,sum,l_min,l_max,w_min,w_max; int i; /* check parameters */ if( reg == NULL ) error("region2rect: invalid region."); if( reg_size <= 1 ) error("region2rect: region size <= 1."); if( modgrad == NULL || modgrad->data == NULL ) error("region2rect: invalid image 'modgrad'."); if( rec == NULL ) error("region2rect: invalid 'rec'."); /* center of the region: It is computed as the weighted sum of the coordinates of all the pixels in the region. The norm of the gradient is used as the weight of a pixel. The sum is as follows: cx = \sum_i G(i).x_i cy = \sum_i G(i).y_i where G(i) is the norm of the gradient of pixel i and x_i,y_i are its coordinates. */ x = y = sum = 0.0; for(i=0; idata[ reg[i].x + reg[i].y * modgrad->xsize ]; x += (double) reg[i].x * weight; y += (double) reg[i].y * weight; sum += weight; } if( sum <= 0.0 ) error("region2rect: weights sum equal to zero."); x /= sum; y /= sum; /* theta */ theta = get_theta(reg,reg_size,x,y,modgrad,reg_angle,prec); /* length and width: 'l' and 'w' are computed as the distance from the center of the region to pixel i, projected along the rectangle axis (dx,dy) and to the orthogonal axis (-dy,dx), respectively. The length of the rectangle goes from l_min to l_max, where l_min and l_max are the minimum and maximum values of l in the region. Analogously, the width is selected from w_min to w_max, where w_min and w_max are the minimum and maximum of w for the pixels in the region. */ dx = cos(theta); dy = sin(theta); l_min = l_max = w_min = w_max = 0.0; for(i=0; i l_max ) l_max = l; if( l < l_min ) l_min = l; if( w > w_max ) w_max = w; if( w < w_min ) w_min = w; } /* store values */ rec->x1 = x + l_min * dx; rec->y1 = y + l_min * dy; rec->x2 = x + l_max * dx; rec->y2 = y + l_max * dy; rec->width = w_max - w_min; rec->x = x; rec->y = y; rec->theta = theta; rec->dx = dx; rec->dy = dy; rec->prec = prec; rec->p = p; /* we impose a minimal width of one pixel A sharp horizontal or vertical step would produce a perfectly horizontal or vertical region. The width computed would be zero. But that corresponds to a one pixels width transition in the image. */ if( rec->width < 1.0 ) rec->width = 1.0; } /*----------------------------------------------------------------------------*/ /** Build a region of pixels that share the same angle, up to a tolerance 'prec', starting at point (x,y). */ static void region_grow( int x, int y, image_double angles, struct point * reg, int * reg_size, double * reg_angle, image_char used, double prec ) { double sumdx,sumdy; int xx,yy,i; /* check parameters */ if( x < 0 || y < 0 || x >= (int) angles->xsize || y >= (int) angles->ysize ) error("region_grow: (x,y) out of the image."); if( angles == NULL || angles->data == NULL ) error("region_grow: invalid image 'angles'."); if( reg == NULL ) error("region_grow: invalid 'reg'."); if( reg_size == NULL ) error("region_grow: invalid pointer 'reg_size'."); if( reg_angle == NULL ) error("region_grow: invalid pointer 'reg_angle'."); if( used == NULL || used->data == NULL ) error("region_grow: invalid image 'used'."); /* first point of the region */ *reg_size = 1; reg[0].x = x; reg[0].y = y; *reg_angle = angles->data[x+y*angles->xsize]; /* region's angle */ sumdx = cos(*reg_angle); sumdy = sin(*reg_angle); used->data[x+y*used->xsize] = USED; /* try neighbors as new region points */ for(i=0; i<*reg_size; i++) for(xx=reg[i].x-1; xx<=reg[i].x+1; xx++) for(yy=reg[i].y-1; yy<=reg[i].y+1; yy++) if( xx>=0 && yy>=0 && xx<(int)used->xsize && yy<(int)used->ysize && used->data[xx+yy*used->xsize] != USED && isaligned(xx,yy,angles,*reg_angle,prec) ) { /* add point */ used->data[xx+yy*used->xsize] = USED; reg[*reg_size].x = xx; reg[*reg_size].y = yy; ++(*reg_size); /* update region's angle */ sumdx += cos( angles->data[xx+yy*angles->xsize] ); sumdy += sin( angles->data[xx+yy*angles->xsize] ); *reg_angle = atan2(sumdy,sumdx); } } /*----------------------------------------------------------------------------*/ /** Try some rectangles variations to improve NFA value. Only if the rectangle is not meaningful (i.e., log_nfa <= eps). */ static double rect_improve( struct rect * rec, image_double angles, double logNT, double eps ) { struct rect r; double log_nfa,log_nfa_new; double delta = 0.5; double delta_2 = delta / 2.0; int n; log_nfa = rect_nfa(rec,angles,logNT); if( log_nfa > eps ) return log_nfa; /* try finer precisions */ rect_copy(rec,&r); for(n=0; n<5; n++) { r.p /= 2.0; r.prec = r.p * M_PI; log_nfa_new = rect_nfa(&r,angles,logNT); if( log_nfa_new > log_nfa ) { log_nfa = log_nfa_new; rect_copy(&r,rec); } } if( log_nfa > eps ) return log_nfa; /* try to reduce width */ rect_copy(rec,&r); for(n=0; n<5; n++) { if( (r.width - delta) >= 0.5 ) { r.width -= delta; log_nfa_new = rect_nfa(&r,angles,logNT); if( log_nfa_new > log_nfa ) { rect_copy(&r,rec); log_nfa = log_nfa_new; } } } if( log_nfa > eps ) return log_nfa; /* try to reduce one side of the rectangle */ rect_copy(rec,&r); for(n=0; n<5; n++) { if( (r.width - delta) >= 0.5 ) { r.x1 += -r.dy * delta_2; r.y1 += r.dx * delta_2; r.x2 += -r.dy * delta_2; r.y2 += r.dx * delta_2; r.width -= delta; log_nfa_new = rect_nfa(&r,angles,logNT); if( log_nfa_new > log_nfa ) { rect_copy(&r,rec); log_nfa = log_nfa_new; } } } if( log_nfa > eps ) return log_nfa; /* try to reduce the other side of the rectangle */ rect_copy(rec,&r); for(n=0; n<5; n++) { if( (r.width - delta) >= 0.5 ) { r.x1 -= -r.dy * delta_2; r.y1 -= r.dx * delta_2; r.x2 -= -r.dy * delta_2; r.y2 -= r.dx * delta_2; r.width -= delta; log_nfa_new = rect_nfa(&r,angles,logNT); if( log_nfa_new > log_nfa ) { rect_copy(&r,rec); log_nfa = log_nfa_new; } } } if( log_nfa > eps ) return log_nfa; /* try even finer precisions */ rect_copy(rec,&r); for(n=0; n<5; n++) { r.p /= 2.0; r.prec = r.p * M_PI; log_nfa_new = rect_nfa(&r,angles,logNT); if( log_nfa_new > log_nfa ) { log_nfa = log_nfa_new; rect_copy(&r,rec); } } return log_nfa; } /*----------------------------------------------------------------------------*/ /** Reduce the region size, by elimination the points far from the starting point, until that leads to rectangle with the right density of region points or to discard the region if too small. */ static int reduce_region_radius( struct point * reg, int * reg_size, image_double modgrad, double reg_angle, double prec, double p, struct rect * rec, image_char used, image_double angles, double density_th ) { double density,rad1,rad2,rad,xc,yc; int i; /* check parameters */ if( reg == NULL ) error("reduce_region_radius: invalid pointer 'reg'."); if( reg_size == NULL ) error("reduce_region_radius: invalid pointer 'reg_size'."); if( prec < 0.0 ) error("reduce_region_radius: 'prec' must be positive."); if( rec == NULL ) error("reduce_region_radius: invalid pointer 'rec'."); if( used == NULL || used->data == NULL ) error("reduce_region_radius: invalid image 'used'."); if( angles == NULL || angles->data == NULL ) error("reduce_region_radius: invalid image 'angles'."); /* compute region points density */ density = (double) *reg_size / ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width ); /* if the density criterion is satisfied there is nothing to do */ if( density >= density_th ) return TRUE; /* compute region's radius */ xc = (double) reg[0].x; yc = (double) reg[0].y; rad1 = dist( xc, yc, rec->x1, rec->y1 ); rad2 = dist( xc, yc, rec->x2, rec->y2 ); rad = rad1 > rad2 ? rad1 : rad2; /* while the density criterion is not satisfied, remove farther pixels */ while( density < density_th ) { rad *= 0.75; /* reduce region's radius to 75% of its value */ /* remove points from the region and update 'used' map */ for(i=0; i<*reg_size; i++) if( dist( xc, yc, (double) reg[i].x, (double) reg[i].y ) > rad ) { /* point not kept, mark it as NOTUSED */ used->data[ reg[i].x + reg[i].y * used->xsize ] = NOTUSED; /* remove point from the region */ reg[i].x = reg[*reg_size-1].x; /* if i==*reg_size-1 copy itself */ reg[i].y = reg[*reg_size-1].y; --(*reg_size); --i; /* to avoid skipping one point */ } /* reject if the region is too small. 2 is the minimal region size for 'region2rect' to work. */ if( *reg_size < 2 ) return FALSE; /* re-compute rectangle */ region2rect(reg,*reg_size,modgrad,reg_angle,prec,p,rec); /* re-compute region points density */ density = (double) *reg_size / ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width ); } /* if this point is reached, the density criterion is satisfied */ return TRUE; } /*----------------------------------------------------------------------------*/ /** Refine a rectangle. For that, an estimation of the angle tolerance is performed by the standard deviation of the angle at points near the region's starting point. Then, a new region is grown starting from the same point, but using the estimated angle tolerance. If this fails to produce a rectangle with the right density of region points, 'reduce_region_radius' is called to try to satisfy this condition. */ static int refine( struct point * reg, int * reg_size, image_double modgrad, double reg_angle, double prec, double p, struct rect * rec, image_char used, image_double angles, double density_th ) { double angle,ang_d,mean_angle,tau,density,xc,yc,ang_c,sum,s_sum; int i,n; /* check parameters */ if( reg == NULL ) error("refine: invalid pointer 'reg'."); if( reg_size == NULL ) error("refine: invalid pointer 'reg_size'."); if( prec < 0.0 ) error("refine: 'prec' must be positive."); if( rec == NULL ) error("refine: invalid pointer 'rec'."); if( used == NULL || used->data == NULL ) error("refine: invalid image 'used'."); if( angles == NULL || angles->data == NULL ) error("refine: invalid image 'angles'."); /* compute region points density */ density = (double) *reg_size / ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width ); /* if the density criterion is satisfied there is nothing to do */ if( density >= density_th ) return TRUE; /*------ First try: reduce angle tolerance ------*/ /* compute the new mean angle and tolerance */ xc = (double) reg[0].x; yc = (double) reg[0].y; ang_c = angles->data[ reg[0].x + reg[0].y * angles->xsize ]; sum = s_sum = 0.0; n = 0; for(i=0; i<*reg_size; i++) { used->data[ reg[i].x + reg[i].y * used->xsize ] = NOTUSED; if( dist( xc, yc, (double) reg[i].x, (double) reg[i].y ) < rec->width ) { angle = angles->data[ reg[i].x + reg[i].y * angles->xsize ]; ang_d = angle_diff_signed(angle,ang_c); sum += ang_d; s_sum += ang_d * ang_d; ++n; } } mean_angle = sum / (double) n; tau = 2.0 * sqrt( (s_sum - 2.0 * mean_angle * sum) / (double) n + mean_angle*mean_angle ); /* 2 * standard deviation */ /* find a new region from the same starting point and new angle tolerance */ region_grow(reg[0].x,reg[0].y,angles,reg,reg_size,®_angle,used,tau); /* if the region is too small, reject */ if( *reg_size < 2 ) return FALSE; /* re-compute rectangle */ region2rect(reg,*reg_size,modgrad,reg_angle,prec,p,rec); /* re-compute region points density */ density = (double) *reg_size / ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width ); /*------ Second try: reduce region radius ------*/ if( density < density_th ) return reduce_region_radius( reg, reg_size, modgrad, reg_angle, prec, p, rec, used, angles, density_th ); /* if this point is reached, the density criterion is satisfied */ return TRUE; } /*----------------------------------------------------------------------------*/ /*-------------------------- Line Segment Detector ---------------------------*/ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** LSD full interface. */ ntuple_list LineSegmentDetection( image_double image, double scale, double sigma_scale, double quant, double ang_th, double eps, double density_th, int n_bins, double max_grad, image_int * region ) { ntuple_list out = new_ntuple_list(5); image_double scaled_image,angles,modgrad; image_char used; struct coorlist * list_p; void * mem_p; struct rect rec; struct point * reg; int reg_size,min_reg_size,i; unsigned int xsize,ysize; double rho,reg_angle,prec,p,log_nfa,logNT; int ls_count = 0; /* line segments are numbered 1,2,3,... */ /* check parameters */ if( image==NULL || image->data==NULL || image->xsize==0 || image->ysize==0 ) error("invalid image input."); if( scale <= 0.0 ) error("'scale' value must be positive."); if( sigma_scale <= 0.0 ) error("'sigma_scale' value must be positive."); if( quant < 0.0 ) error("'quant' value must be positive."); if( ang_th <= 0.0 || ang_th >= 180.0 ) error("'ang_th' value must be in the range (0,180)."); if( density_th < 0.0 || density_th > 1.0 ) error("'density_th' value must be in the range [0,1]."); if( n_bins <= 0 ) error("'n_bins' value must be positive."); if( max_grad <= 0.0 ) error("'max_grad' value must be positive."); /* angle tolerance */ prec = M_PI * ang_th / 180.0; p = ang_th / 180.0; rho = quant / sin(prec); /* gradient magnitude threshold */ /* scale image (if necessary) and compute angle at each pixel */ if( scale != 1.0 ) { scaled_image = gaussian_sampler( image, scale, sigma_scale ); angles = ll_angle( scaled_image, rho, &list_p, &mem_p, &modgrad, (unsigned int) n_bins, max_grad ); free_image_double(scaled_image); } else angles = ll_angle( image, rho, &list_p, &mem_p, &modgrad, (unsigned int) n_bins, max_grad ); xsize = angles->xsize; ysize = angles->ysize; logNT = 5.0 * ( log10( (double) xsize ) + log10( (double) ysize ) ) / 2.0; min_reg_size = (int) (-logNT/log10(p)); /* minimal number of points in region that can give a meaningful event */ /* initialize some structures */ if( region != NULL ) /* image to output pixel region number, if asked */ *region = new_image_int_ini(angles->xsize,angles->ysize,0); used = new_image_char_ini(xsize,ysize,NOTUSED); reg = (struct point *) calloc( (size_t) (xsize*ysize), sizeof(struct point) ); if( reg == NULL ) error("not enough memory!"); /* search for line segments */ for(; list_p != NULL; list_p = list_p->next ) if( used->data[ list_p->x + list_p->y * used->xsize ] == NOTUSED && angles->data[ list_p->x + list_p->y * angles->xsize ] != NOTDEF ) /* there is no risk of double comparison problems here because we are only interested in the exact NOTDEF value */ { /* find the region of connected point and ~equal angle */ region_grow( list_p->x, list_p->y, angles, reg, ®_size, ®_angle, used, prec ); /* reject small regions */ if( reg_size < min_reg_size ) continue; /* construct rectangular approximation for the region */ region2rect(reg,reg_size,modgrad,reg_angle,prec,p,&rec); /* Check if the rectangle exceeds the minimal density of region points. If not, try to improve the region. The rectangle will be rejected if the final one does not fulfill the minimal density condition. This is an addition to the original LSD algorithm published in "LSD: A Fast Line Segment Detector with a False Detection Control" by R. Grompone von Gioi, J. Jakubowicz, J.M. Morel, and G. Randall. The original algorithm is obtained with density_th = 0.0. */ if( !refine( reg, ®_size, modgrad, reg_angle, prec, p, &rec, used, angles, density_th ) ) continue; /* compute NFA value */ log_nfa = rect_improve(&rec,angles,logNT,eps); if( log_nfa <= eps ) continue; /* A New Line Segment was found! */ ++ls_count; /* increase line segment counter */ /* The gradient was computed with a 2x2 mask, its value corresponds to points with an offset of (0.5,0.5), that should be added to output. The coordinates origin is at the center of pixel (0,0). */ rec.x1 += 0.5; rec.y1 += 0.5; rec.x2 += 0.5; rec.y2 += 0.5; /* scale the result values if a subsampling was performed */ if( scale != 1.0 ) { rec.x1 /= scale; rec.y1 /= scale; rec.x2 /= scale; rec.y2 /= scale; rec.width /= scale; } /* add line segment found to output */ add_5tuple(out, rec.x1, rec.y1, rec.x2, rec.y2, rec.width); /* add region number to 'region' image if needed */ if( region != NULL ) for(i=0; idata[reg[i].x+reg[i].y*(*region)->xsize] = ls_count; } /* free memory */ free_image_double(angles); free_image_double(modgrad); free_image_char(used); free( (void *) reg ); free( (void *) mem_p ); return out; } /*----------------------------------------------------------------------------*/ /** LSD Simple Interface with Scale. */ ntuple_list lsd_scale(image_double image, double scale) { /* LSD parameters */ double sigma_scale = 0.6; /* Sigma for Gaussian filter is computed as sigma = sigma_scale/scale. */ double quant = 2.0; /* Bound to the quantization error on the gradient norm. */ double ang_th = 22.5; /* Gradient angle tolerance in degrees. */ double eps = 0.0; /* Detection threshold, -log10(NFA). */ double density_th = 0.7; /* Minimal density of region points in rectangle. */ int n_bins = 1024; /* Number of bins in pseudo-ordering of gradient modulus. */ double max_grad = 255.0; /* Gradient modulus in the highest bin. The default value corresponds to the highest gradient modulus on images with gray levels in [0,255]. */ return LineSegmentDetection( image, scale, sigma_scale, quant, ang_th, eps, density_th, n_bins, max_grad, NULL ); } /*----------------------------------------------------------------------------*/ /** LSD Simple Interface. */ ntuple_list lsd(image_double image) { /* LSD parameters */ double scale = 0.8; /* Scale the image by Gaussian filter to 'scale'. */ return lsd_scale(image,scale); } /*----------------------------------------------------------------------------*/ ================================================ FILE: thirdparty/LSD/lsd.h ================================================ /*---------------------------------------------------------------------------- LSD - Line Segment Detector on digital images Copyright 2007-2010 rafael grompone von gioi (grompone@gmail.com) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** @file lsd.h LSD module header @author rafael grompone von gioi (grompone@gmail.com) */ /*----------------------------------------------------------------------------*/ #ifndef LSD_HEADER #define LSD_HEADER /*----------------------------------------------------------------------------*/ /*----------------------- 'list of n-tuple' data type ------------------------*/ /*----------------------------------------------------------------------------*/ /** 'list of n-tuple' data type The i component, of the n-tuple number j, of an n-tuple list 'ntl' is accessed with: ntl->values[ i + j * ntl->dim ] The dimension of the n-tuple (n) is: ntl->dim The number of number of n-tuples in the list is: ntl->size The maximum number of n-tuples that can be stored in the list with the allocated memory at a given time is given by: ntl->max_size */ typedef struct ntuple_list_s { unsigned int size; unsigned int max_size; unsigned int dim; double * values; } * ntuple_list; void free_ntuple_list(ntuple_list in); ntuple_list new_ntuple_list(unsigned int dim); /*----------------------------------------------------------------------------*/ /*----------------------------- Image Data Types -----------------------------*/ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** char image data type The pixel value at (x,y) is accessed by: image->data[ x + y * image->xsize ] with x and y integer. */ typedef struct image_char_s { unsigned char * data; unsigned int xsize,ysize; } * image_char; void free_image_char(image_char i); image_char new_image_char(unsigned int xsize, unsigned int ysize); image_char new_image_char_ini( unsigned int xsize, unsigned int ysize, unsigned char fill_value ); /*----------------------------------------------------------------------------*/ /** int image data type The pixel value at (x,y) is accessed by: image->data[ x + y * image->xsize ] with x and y integer. */ typedef struct image_int_s { int * data; unsigned int xsize,ysize; } * image_int; void free_image_int(image_int i); image_int new_image_int(unsigned int xsize, unsigned int ysize); image_int new_image_int_ini( unsigned int xsize, unsigned int ysize, int fill_value ); /*----------------------------------------------------------------------------*/ /** double image data type The pixel value at (x,y) is accessed by: image->data[ x + y * image->xsize ] with x and y integer. */ typedef struct image_double_s { double * data; unsigned int xsize,ysize; } * image_double; void free_image_double(image_double i); image_double new_image_double(unsigned int xsize, unsigned int ysize); image_double new_image_double_ini( unsigned int xsize, unsigned int ysize, double fill_value ); /*----------------------------------------------------------------------------*/ /*-------------------------- Line Segment Detector ---------------------------*/ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /* LSD Full Interface */ /*----------------------------------------------------------------------------*/ /** LSD Full Interface @param image Input image. @param scale When different than 1.0, LSD will scale the image by Gaussian filtering. Example: is scale=0.8, the input image will be subsampled to 80% of its size, and then the line segment detector will be applied. Suggested value: 0.8 @param sigma_scale When scale!=1.0, the sigma of the Gaussian filter is: sigma = sigma_scale / scale, if scale < 1.0 sigma = sigma_scale, if scale >= 1.0 Suggested value: 0.6 @param quant Bound to the quantization error on the gradient norm. Example: if gray level is quantized to integer steps, the gradient (computed by finite differences) error due to quantization will be bounded by 2.0, as the worst case is when the error are 1 and -1, that gives an error of 2.0. Suggested value: 2.0 @param ang_th Gradient angle tolerance in the region growing algorithm, in degrees. Suggested value: 22.5 @param eps Detection threshold, -log10(NFA). The bigger, the more strict the detector is, and will result in less detections. (Note that the 'minus sign' makes that this behavior is opposite to the one of NFA.) The value -log10(NFA) is equivalent but more intuitive than NFA: - -1.0 corresponds to 10 mean false alarms - 0.0 corresponds to 1 mean false alarm - 1.0 corresponds to 0.1 mean false alarms - 2.0 corresponds to 0.01 mean false alarms . Suggested value: 0.0 @param density_th Minimal proportion of region points in a rectangle. Suggested value: 0.7 @param n_bins Number of bins used in the pseudo-ordering of gradient modulus. Suggested value: 1024 @param max_grad Gradient modulus in the highest bin. For example, for images with integer gray levels in [0,255], the maximum possible gradient value is 255.0. Suggested value: 255.0 @param region Optional output: an int image where the pixels used in some line support region are marked. Unused pixels have the value '0' while the used ones have the number of the line segment, numbered 1,2,3,... If desired, a non NULL pointer to an image_int should be used. The resulting image has the size of the image used for the processing, that is, the size of the input image scaled by the given factor 'scale'. Suggested value: NULL @return A 5-tuple list, where each 5-tuple corresponds to a detected line segment. The five values are: - x1,y1,x2,y2,width . for a line segment from (x1,y1) to (x2,y2) and a width 'width'. */ ntuple_list LineSegmentDetection( image_double image, double scale, double sigma_scale, double quant, double ang_th, double eps, double density_th, int n_bins, double max_grad, image_int * region ); /*----------------------------------------------------------------------------*/ /* LSD Simple Interface with Scale */ /*----------------------------------------------------------------------------*/ /** LSD Simple Interface with Scale @param image Input image. @param scale When different than 1.0, LSD will scale the image by Gaussian filtering. Example: is scale=0.8, the input image will be subsampled to 80% of its size, and then the line segment detector will be applied. Suggested value: 0.8 @return a 5-tuple list of detected line segments. */ ntuple_list lsd_scale(image_double image, double scale); /*----------------------------------------------------------------------------*/ /* LSD Simple Interface */ /*----------------------------------------------------------------------------*/ /** LSD Simple Interface @param image Input image. @return a 5-tuple list of detected line segments. */ ntuple_list lsd(image_double image); #endif /* !LSD_HEADER */ /*----------------------------------------------------------------------------*/ ================================================ FILE: thirdparty/LSD/lsd_call_example.c ================================================ #include #include "lsd.h" int main(void) { image_double image; ntuple_list out; unsigned int x,y,i,j; unsigned int X = 128; /* x image size */ unsigned int Y = 128; /* y image size */ /* create a simple image: left half black, right half gray */ image = new_image_double(X,Y); for(x=0;xdata[ x + y * image->xsize ] = xsize); for(i=0;isize;i++) { for(j=0;jdim;j++) printf("%f ",out->values[ i * out->dim + j ]); printf("\n"); } /* free memory */ free_image_double(image); free_ntuple_list(out); return 0; } ================================================ FILE: thirdparty/LSD/lsd_cmd.c ================================================ /*---------------------------------------------------------------------------- LSD - Line Segment Detector on digital images Copyright 2007-2010 rafael grompone von gioi (grompone@gmail.com) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** @file lsd_cmd.c Command line interface for LSD module (Line Segment Detector). @author rafael grompone von gioi (grompone@gmail.com) */ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** Definition of the command line interface. */ #define USE " \ #name: lsd \ #author: rafael grompone von gioi \ #version: 1.5 of December 3, 2010 \ #year: 2007-2010 \ #desc: Line Segment Detector \ #opt: scale | s | double | 0.8 | 0.0 | | \ Scale image by Gaussian filter before processing. \ #opt: sigma_coef | c | double | 0.6 | 0.0 | | \ Sigma for Gaussian filter is computed as sigma_coef/scale. \ #opt: quant | q | double | 2.0 | 0.0 | | \ Bound to quantization error on the gradient norm. \ #opt: ang_th | a | double | 22.5 | 0.0 | 180.0 | \ Gradient angle tolerance in degrees. \ #opt: eps | e | double | 0.0 | | | Detection threshold, -log10(max. NFA) \ #opt: density_th | d | double | 0.7 | 0.0 | 1.0 | \ Minimal density of region points in a rectangle to be accepted. \ #opt: n_bins | b | int | 1024 | 1 | | \ Number of bins in 'ordering' of gradient modulus. \ #opt: max_grad | m | double | 255.0 | 1 | | \ Gradient modulus in the highest bin. \ #opt: reg | R | str | | | | \ Output image showing pixels used by each detection. Scaled size. \ #opt: epsfile | P | str | | | | Output line segments into EPS file 'epsfile'. \ #opt: svgfile | S | str | | | | Output line segments into SVG file 'svgfile'. \ #opt: width | W | double | 1.5 | | | \ LS width used in EPS and SVG files. If <=0, use detected values. \ #req: in | | str | | | | Input image (PGM) \ #req: out | | str | | | | Line Segment output (ascii file: x1,y1,x2,y2,width) \ " /*----------------------------------------------------------------------------*/ #include #include #include #include #include #include "lsd.h" #ifndef FALSE #define FALSE 0 #endif /* !FALSE */ #ifndef TRUE #define TRUE 1 #endif /* !TRUE */ /*----------------------------------------------------------------------------*/ /** Fatal error, print a message to standard-error output and exit. */ static void error(char * msg) { fprintf(stderr,"%s\n",msg); exit(EXIT_FAILURE); } /*----------------------------------------------------------------------------*/ /*--------------------- Command Line interface handling ----------------------*/ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ #define FIELD_LENGTH 160 #define VERSION_OPTION "--version" /*----------------------------------------------------------------------------*/ /** Structure to store one argument definition and read value. */ struct argument { char name[FIELD_LENGTH]; /* name to internally identify the argument */ char desc[FIELD_LENGTH]; /* description */ char id; /* letter used with '-' to use the option */ char type; /* i=int, d=double, s=str, b=bool */ int required; int assigned; int def_value; /* true or false, a default value is assigned? */ char d_value[FIELD_LENGTH]; /* default value */ char s_value[FIELD_LENGTH]; /* string found, also the value if 'str' */ int i_value; double f_value; int min_set; /* true or false, is minimal value set? */ double min; int max_set; /* true or false, is maximal value set? */ double max; }; /*----------------------------------------------------------------------------*/ /** Structure to store the full set of argument definitions and its values. */ struct arguments { char name[FIELD_LENGTH]; char author[FIELD_LENGTH]; char version[FIELD_LENGTH]; char desc[FIELD_LENGTH]; char compiled[FIELD_LENGTH]; char year[FIELD_LENGTH]; int arg_num; int arg_allocated; struct argument * args; }; /*----------------------------------------------------------------------------*/ /** Free an 'arguments' structure. */ static void free_arguments(struct arguments * arg) { free( (void *) arg->args ); free( (void *) arg ); } /*----------------------------------------------------------------------------*/ /** Accepted characters in field identifier: numbers, letters and '_'. */ static int is_id_char(int c) { return c=='_' || isalpha(c) || isdigit(c); } /*----------------------------------------------------------------------------*/ /** Read next field definition in an argument definition. */ static char * get_next_field(char * p, char * id, char * value) { int n; /* search for field id */ while( isspace(*p) ) ++p; /* skip spaces */ if( *p != '#' ) error("Error: missing '#' in 'use description'."); ++p; for( n=0; is_id_char(*p) && n= FIELD_LENGTH ) error("Error: field too long in 'use description'."); id[n] = '\0'; if( *(p++) != ':' ) error("Error: missing ':' in 'use description'."); /* search for field value */ while( isspace(*p) ) ++p; /* skip spaces */ for( n=0; *p != '#' && *p != '\0' && n= FIELD_LENGTH ) error("Error: field too long in 'use description'."); value[n] = '\0'; /* remove spaces at the end of the field */ while( --n >= 0 && isspace(value[n]) ) value[n] = '\0'; return p; } /*----------------------------------------------------------------------------*/ /** Read next token in an argument definition. */ static char * get_next_token(char * p, char div, char * value) { int n; if( *p == '\0' ) error("Error: argument token expected in 'use description'."); while( isspace(*p) ) ++p; /* skip spaces */ for( n=0; *p!=div && *p!='\0' && n= FIELD_LENGTH ) error("Error: field too long in 'use description'."); value[n] = '\0'; while( --n >= 0 && isspace(value[n]) ) value[n] = '\0'; /* remove 'div' at the end of the token, if present */ if( *p == div ) ++p; return p; } /*----------------------------------------------------------------------------*/ /** Process one argument description. */ static void process_new_argument(char * id, char * value,struct arguments * arg) { char token[FIELD_LENGTH]; char * p; int i; /* allocate memory if needed */ if( arg->arg_num >= arg->arg_allocated ) { arg->arg_allocated *= 2; arg->args = (struct argument *) realloc( (void *) arg->args, arg->arg_allocated * sizeof(struct argument) ); if( arg->args == NULL ) error("Error: not enough memory."); } /* argument name */ p = get_next_token(value,'|',arg->args[arg->arg_num].name); for( i=0; iarg_num; i++ ) if( strcmp(arg->args[i].name,arg->args[arg->arg_num].name) == 0 ) error("Error: argument name used twice in 'use description'."); /* 'option' letter - to be used with '-' to identify option */ p = get_next_token(p,'|',token); if( strcmp(id,"opt") == 0 ) { arg->args[arg->arg_num].required = FALSE; if( strlen(token) <= 0 || strlen(token) > 1 ) error("Error: invalid option letter in 'use description'."); arg->args[arg->arg_num].id = token[0]; if( !isalpha(arg->args[arg->arg_num].id) ) error("Error: option id must be a letter in 'use description'."); for( i=0; iarg_num; i++ ) if( !(arg->args[i].required) && arg->args[i].id == arg->args[arg->arg_num].id ) error("Error: option letter used twice in 'use description'."); } else /* must be 'req' - required argument */ { arg->args[arg->arg_num].required = TRUE; if( strlen(token) > 0 ) error("Error: unused option letter in 'use description'."); arg->args[arg->arg_num].id = 0; } /* argument type */ p = get_next_token(p,'|',token); if( strcmp(token,"int") == 0 ) arg->args[arg->arg_num].type = 'i'; else if( strcmp(token,"double") == 0 ) arg->args[arg->arg_num].type = 'd'; else if( strcmp(token,"str") == 0 ) arg->args[arg->arg_num].type = 's'; else if( strcmp(token,"bool") == 0 ) arg->args[arg->arg_num].type = 'b'; else error("Error: unknown argument type in 'use description'."); /* required arguments can't be boolean */ if( arg->args[arg->arg_num].required && arg->args[arg->arg_num].type == 'b' ) error("Error: required arguments can't be boolean in 'use description'."); /* default value */ p = get_next_token(p,'|',token); if( strlen(token) > 0 ) { if( arg->args[arg->arg_num].required ) error("Error: default value in required argument in 'use description'."); arg->args[arg->arg_num].def_value = TRUE; arg->args[arg->arg_num].assigned = TRUE; strcpy(arg->args[arg->arg_num].d_value,token); strcpy(arg->args[arg->arg_num].s_value,token); if( arg->args[arg->arg_num].type == 'i' ) arg->args[arg->arg_num].i_value = atoi(token); if( arg->args[arg->arg_num].type == 'd' ) arg->args[arg->arg_num].f_value = atof(token); } else { arg->args[arg->arg_num].def_value = FALSE; arg->args[arg->arg_num].s_value[0] = '\0'; arg->args[arg->arg_num].assigned = FALSE; } /* required arguments can't have default value */ if( arg->args[arg->arg_num].required && arg->args[arg->arg_num].def_value ) error("Error: required args can't have default value in 'use description'."); /* min value */ p = get_next_token(p,'|',token); if( strlen(token) > 0 ) { arg->args[arg->arg_num].min_set = TRUE; arg->args[arg->arg_num].min = atof(token); } else { arg->args[arg->arg_num].min_set = FALSE; } /* max value */ p = get_next_token(p,'|',token); if( strlen(token) > 0 ) { arg->args[arg->arg_num].max_set = TRUE; arg->args[arg->arg_num].max = atof(token); } else { arg->args[arg->arg_num].max_set = FALSE; } /* argument description */ p = get_next_token(p,'|',arg->args[arg->arg_num].desc); /* the field should end there */ if( *p != '\0' ) error("Error: too many tokens in one argument in 'use description'."); arg->arg_num++; } /*----------------------------------------------------------------------------*/ /** Process an argument definition. */ static void process_argument_description( char * desc, struct arguments * arg ) { char id[FIELD_LENGTH]; char value[FIELD_LENGTH]; /* initialize 'arg' */ arg->name[0] = '\0'; arg->author[0] = '\0'; arg->version[0] = '\0'; arg->year[0] = '\0'; arg->desc[0] = '\0'; arg->compiled[0] = '\0'; arg->arg_num = 0; arg->arg_allocated = 2; arg->args = (struct argument *) malloc( arg->arg_allocated * sizeof(struct argument) ); if( arg->args == NULL ) error("Error: not enough memory."); /* assign compilation date and time */ strcat(arg->compiled,__DATE__); strcat(arg->compiled," "); strcat(arg->compiled,__TIME__); /* process description */ while( *desc != '\0' ) { desc = get_next_field(desc,id,value); if( strcmp(id,"name") == 0 ) { if( arg->name[0] != '\0' ) error("Error: multiple 'name' fields in 'use description'."); strcpy(arg->name,value); } else if( strcmp(id,"author") == 0 ) { if( arg->author[0] != '\0' ) error("Error: multiple 'author' fields in 'use description'."); strcpy(arg->author,value); } else if( strcmp(id,"version") == 0 ) { if( arg->version[0] != '\0' ) error("Error: multiple 'version' fields in 'use description'."); strcpy(arg->version,value); } else if( strcmp(id,"year") == 0 ) { if( arg->year[0] != '\0' ) error("Error: multiple 'year' fields in 'use description'."); strcpy(arg->year,value); } else if( strcmp(id,"desc") == 0 ) { if( arg->desc[0] != '\0' ) error("Error: multiple 'desc' fields in 'use description'."); strcpy(arg->desc,value); } else if( strcmp(id,"opt") == 0 || strcmp(id,"req") == 0 ) { process_new_argument(id,value,arg); } else { error("Error: unknown token in 'use description'."); } } /* verify required arguments */ if( arg->name[0] == '\0' ) error("Error: program name is required in 'use description'."); if( arg->author[0] == '\0' ) error("Error: author name is required in 'use description'."); if( arg->version[0] == '\0' ) error("Error: version is required in 'use description'."); if( arg->desc[0] == '\0' ) error("Error: program description is required in 'use description'."); if( arg->year[0] == '\0' ) error("Error: year is required in 'use description'."); } /*----------------------------------------------------------------------------*/ /** Print version. */ static void print_version(struct arguments * arg, FILE * f) { fprintf(f,"Version %s, compiled %s\n",arg->version,arg->compiled); } /*----------------------------------------------------------------------------*/ /** Evaluate arguments. */ static void evaluate_arguments(int argc, char ** argv, struct arguments * arg) { int in_required_args = FALSE; int n,i; if( argc <= 0 ) error("Error: unexpected command line: missing command."); for( n=1; !in_required_args && n < argc; n++ ) { /* when an argument do not start with "-" it is not optional. but, if the argument is just "-", then is a non optional argument with value "-", and will be analyzed later. */ if( argv[n][0] != '-' || (argv[n][0]=='-' && strlen(argv[n])== 1) ) { in_required_args = TRUE; --n; continue; } if( strlen(argv[n]) != 2 ) { /* check if it is the special option 'version' */ if( strcmp(argv[n],VERSION_OPTION) == 0 ) { print_version(arg,stdout); free_arguments(arg); exit(EXIT_SUCCESS); } /* otherwise is a bad option */ fprintf(stderr,"Error: %s ",argv[n]); error("unrecognized option."); } for( i=0; iarg_num; i++ ) if( !(arg->args[i].required) && arg->args[i].id == argv[n][1] ) { arg->args[i].assigned = TRUE; if( arg->args[i].type != 'b' ) { /* go for the value */ ++n; /* a value is expected */ if( n >= argc ) { fprintf(stderr,"Error: in '%s': ",argv[n-1]); error("a value was expected."); } if( strlen(argv[n]) > FIELD_LENGTH ) { fprintf(stderr,"Error: in '%s': ",argv[n-1]); error("value too long."); } strcpy(arg->args[i].s_value,argv[n]); if( arg->args[i].type == 'i' ) { arg->args[i].i_value = atoi(argv[n]); if( arg->args[i].min_set && arg->args[i].i_value < (int) arg->args[i].min ) { fprintf(stderr,"Error: in '%s': ",argv[n-1]); error("value out of range."); } if( arg->args[i].max_set && arg->args[i].i_value > (int) arg->args[i].max ) { fprintf(stderr,"Error: in '%s': ",argv[n-1]); error("value out of range."); } } if( arg->args[i].type == 'd' ) { arg->args[i].f_value = atof(argv[n]); if( arg->args[i].min_set && arg->args[i].f_value < arg->args[i].min ) { fprintf(stderr,"Error: in '%s': ",argv[n-1]); error("value out of range."); } if( arg->args[i].max_set && arg->args[i].f_value > arg->args[i].max ) { fprintf(stderr,"Error: in '%s': ",argv[n-1]); error("value out of range."); } } } i = arg->arg_num; /* argument found, stop search */ } } for( i=0; narg_num; i++ ) if( arg->args[i].required ) { arg->args[i].assigned = TRUE; strcpy(arg->args[i].s_value,argv[n]); if( arg->args[i].type == 'i' ) { arg->args[i].i_value = atoi(argv[n]); if( arg->args[i].min_set && arg->args[i].i_value < (int) arg->args[i].min ) { fprintf(stderr,"Error: in '%s': ",arg->args[i].name); error("value out of range."); } if( arg->args[i].max_set && arg->args[i].i_value > (int) arg->args[i].max ) { fprintf(stderr,"Error: in '%s': ",arg->args[i].name); error("value out of range."); } } if( arg->args[i].type == 'd' ) { arg->args[i].f_value = atof(argv[n]); if( arg->args[i].min_set && arg->args[i].f_value < arg->args[i].min ) { fprintf(stderr,"Error: in '%s': ",arg->args[i].name); error("value out of range."); } if( arg->args[i].max_set && arg->args[i].f_value > arg->args[i].max ) { fprintf(stderr,"Error: in '%s': ",arg->args[i].name); error("value out of range."); } } ++n; } } /*----------------------------------------------------------------------------*/ /** Print command line interface help. */ static void use(struct arguments * arg) { int i; fprintf(stderr,"%s, %s\n",arg->name,arg->desc); fprintf(stderr,"Copyright (c) %s %s\n",arg->year,arg->author); print_version(arg,stderr); fprintf(stderr,"\nUsage: %s",arg->name); /* always present version option */ fprintf(stderr," [%s]",VERSION_OPTION); for(i=0;iarg_num;i++) if( !(arg->args[i].required) ) { fprintf(stderr," [-%c",arg->args[i].id); if( arg->args[i].type != 'b' ) fprintf(stderr," %s",arg->args[i].name); fprintf(stderr,"]"); } for(i=0;iarg_num;i++) if( arg->args[i].required ) fprintf(stderr," %s",arg->args[i].name); fprintf(stderr,"\n\n"); /* option description */ fprintf(stderr," %s\tPrint version and compilation date/time and exit.\n", VERSION_OPTION); for(i=0;iarg_num;i++) if( !(arg->args[i].required) ) { fprintf(stderr," -%c",arg->args[i].id); if( arg->args[i].type != 'b' ) { fprintf(stderr," %s",arg->args[i].name); } fprintf(stderr,"\t%s\n",arg->args[i].desc); if( arg->args[i].type == 'i' ) { fprintf(stderr,"\t\t'%s' is integer",arg->args[i].name); fprintf(stderr,", range ["); if( arg->args[i].min_set ) fprintf(stderr,"%d,",(int)arg->args[i].min); else fprintf(stderr,"-inf,"); if( arg->args[i].max_set ) fprintf(stderr,"%d]",(int)arg->args[i].max); else fprintf(stderr,"inf]"); if( arg->args[i].def_value ) fprintf(stderr,", default value %d",atoi(arg->args[i].d_value)); fprintf(stderr,"\n"); } if( arg->args[i].type == 'd' ) { fprintf(stderr,"\t\t'%s' is double",arg->args[i].name); fprintf(stderr,", range ["); if( arg->args[i].min_set ) fprintf(stderr,"%g,",arg->args[i].min); else fprintf(stderr,"-inf,"); if( arg->args[i].max_set ) fprintf(stderr,"%g]",arg->args[i].max); else fprintf(stderr,"inf]"); if( arg->args[i].def_value ) fprintf(stderr,", default value %g",atof(arg->args[i].d_value)); fprintf(stderr,"\n"); } } for(i=0;iarg_num;i++) if( arg->args[i].required ) { fprintf(stderr," %s",arg->args[i].name); fprintf(stderr,"\t%s\n",arg->args[i].desc); if( arg->args[i].type == 'i' ) { fprintf(stderr,"\t\t'%s' is integer",arg->args[i].name); fprintf(stderr,", range ["); if( arg->args[i].min_set ) fprintf(stderr,"%d,",(int)arg->args[i].min); else fprintf(stderr,"-inf,"); if( arg->args[i].max_set ) fprintf(stderr,"%d]",(int)arg->args[i].max); else fprintf(stderr,"inf]"); fprintf(stderr,"\n"); } if( arg->args[i].type == 'd' ) { fprintf(stderr,"\t\t'%s' is double",arg->args[i].name); fprintf(stderr,", range ["); if( arg->args[i].min_set ) fprintf(stderr,"%f,",arg->args[i].min); else fprintf(stderr,"-inf,"); if( arg->args[i].max_set ) fprintf(stderr,"%f]",arg->args[i].max); else fprintf(stderr,"inf]"); fprintf(stderr,"\n"); } } fprintf(stderr,"\n"); free_arguments(arg); exit(EXIT_FAILURE); } /*----------------------------------------------------------------------------*/ /** Process and evaluate a program arguments. */ static struct arguments * process_arguments(char * desc, int argc, char ** argv) { struct arguments * arg; int i; /* get memory */ arg = (struct arguments *) malloc(sizeof(struct arguments)); if( arg == NULL ) error("Error: not enough memory."); process_argument_description(desc,arg); evaluate_arguments(argc,argv,arg); /* if there are missing arguments print the 'use' information */ for(i=0; iarg_num; i++) if( arg->args[i].required && !(arg->args[i].assigned) ) use(arg); return arg; } /*----------------------------------------------------------------------------*/ /** Test if an argument has a defined value. */ static int is_assigned(struct arguments * arg, char * name) { int i; for(i=0; iarg_num; i++) if( strcmp(name,arg->args[i].name) == 0 ) return arg->args[i].assigned; error("Error: is_assigned: unknown argument."); return -1; /* useless, just to prevent warning in strict compilers */ } /*----------------------------------------------------------------------------*/ /** Get the value of a string argument. */ static char * get_str(struct arguments * arg, char * name) { int i; for(i=0; iarg_num; i++) if( strcmp(name,arg->args[i].name) == 0 ) { if( arg->args[i].type == 's' ) { if( !(arg->args[i].assigned) ) return NULL; return arg->args[i].s_value; } else error("Error: get_str: the parameter is not a double."); } error("Error: get_str: unknown argument."); return NULL; /* useless, just to prevent warning in strict compilers */ } /*----------------------------------------------------------------------------*/ /** Get the value of an integer argument. */ static int get_int(struct arguments * arg, char * name) { int i; for(i=0; iarg_num; i++) if( strcmp(name,arg->args[i].name) == 0 ) { if( !(arg->args[i].assigned) ) error("Error: get_int: parameter not assigned."); if( arg->args[i].type == 'i' ) return arg->args[i].i_value; else error("Error: get_int: the parameter is not an integer."); } error("Error: get_int: unknown argument."); return -1; /* useless, just to prevent warning in strict compilers */ } /*----------------------------------------------------------------------------*/ /** Get the value of a double argument. */ static double get_double(struct arguments * arg, char * name) { int i; for(i=0; iarg_num; i++) if( strcmp(name,arg->args[i].name) == 0 ) { if( !(arg->args[i].assigned) ) error("Error: get_double: parameter not assigned."); if( arg->args[i].type == 'd' ) return arg->args[i].f_value; else error("Error: get_double: the parameter is not a double."); } error("Error: get_double: unknown argument."); return -1.0; /* useless, just to prevent warning in strict compilers */ } /*----------------------------------------------------------------------------*/ /*------------------------------ PGM image I/O -------------------------------*/ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** Skip white characters and comments in a PGM file. */ static void skip_whites_and_comments(FILE * f) { int c; do { while(isspace(c=getc(f))); /* skip spaces */ if(c=='#') /* skip comments */ while( c!='\n' && c!='\r' && c!=EOF ) c=getc(f); } while( c == '#' || isspace(c) ); if( c != EOF && ungetc(c,f) == EOF ) error("Error: unable to 'ungetc' while reading PGM file."); } /*----------------------------------------------------------------------------*/ /** Read a ASCII number from a PGM file. */ static unsigned int get_num(FILE * f) { unsigned int num; int c; while(isspace(c=getc(f))); if(!isdigit(c)) error("Error: corrupted PGM file."); num = (unsigned int) (c - '0'); while( isdigit(c=getc(f)) ) num = 10 * num + c - '0'; if( c != EOF && ungetc(c,f) == EOF ) error("Error: unable to 'ungetc' while reading PGM file."); return num; } /*----------------------------------------------------------------------------*/ /** Read a PGM file into an "image_double". If the name is "-" the file is read from standard input. */ static image_double read_pgm_image_double(char * name) { FILE * f; int c,bin; unsigned int xsize,ysize,depth,x,y; image_double image; /* open file */ if( strcmp(name,"-") == 0 ) f = stdin; else f = fopen(name,"rb"); if( f == NULL ) error("Error: unable to open input image file."); /* read header */ if( getc(f) != 'P' ) error("Error: not a PGM file!"); if( (c=getc(f)) == '2' ) bin = FALSE; else if( c == '5' ) bin = TRUE; else error("Error: not a PGM file!"); skip_whites_and_comments(f); xsize = get_num(f); /* X size */ skip_whites_and_comments(f); ysize = get_num(f); /* Y size */ skip_whites_and_comments(f); depth = get_num(f); /* depth */ if(depth==0) fprintf(stderr,"Warning: depth=0, probably invalid PGM file\n"); /* white before data */ if(!isspace(c=getc(f))) error("Error: corrupted PGM file."); /* get memory */ image = new_image_double(xsize,ysize); /* read data */ for(y=0;ydata[ x + y * xsize ] = bin ? (double) getc(f) : (double) get_num(f); /* close file if needed */ if( f != stdin && fclose(f) == EOF ) error("Error: unable to close file while reading PGM file."); return image; } /*----------------------------------------------------------------------------*/ /** Write an "image_int" into a PGM file. If the name is "-" the file is written to standard output. */ static void write_pgm_image_int(image_int image, char * name) { FILE * f; unsigned int x,y,n; int v,max,min; /* check min and max values */ max = min = 0; for(y=0; yysize; y++) for(x=0; xxsize; x++) { v = image->data[ x + y * image->xsize ]; if( v > max ) max = v; if( v < min ) min = v; } if( min < 0 ) fprintf(stderr, "Warning: write_pgm_image_int: negative values in '%s'.\n",name); if( max > 65535 ) fprintf(stderr, "Warning: write_pgm_image_int: values exceeding 65535 in '%s'.\n",name); /* open file */ if( strcmp(name,"-") == 0 ) f = stdout; else f = fopen(name,"w"); if( f == NULL ) error("Error: unable to open output image file."); /* write header */ fprintf(f,"P2\n"); fprintf(f,"%u %u\n",image->xsize,image->ysize); fprintf(f,"%d\n",max); /* write data */ for(n=0,y=0; yysize; y++) for(x=0; xxsize; x++) { fprintf(f,"%d ",image->data[ x + y * image->xsize ]); if(++n==8) /* lines should not be longer than 70 characters */ { fprintf(f,"\n"); n = 0; } } /* close file if needed */ if( f != stdout && fclose(f) == EOF ) error("Error: unable to close file while writing PGM file."); } /*----------------------------------------------------------------------------*/ /*----------------------------- Write EPS File -------------------------------*/ /*----------------------------------------------------------------------------*/ /** Write line segments into an EPS file. If the name is "-" the file is written to standard output. According to Adobe "Encapsulated PostScript File Format Specification", Version 3.0, 1 May 1992, and Adobe "PostScript(R) LANGUAGE REFERENCE", third edition, 1999. */ static void write_eps( ntuple_list segs, char * filename, unsigned int xsize, unsigned int ysize, double width ) { FILE * eps; unsigned int i; /* open file */ if( strcmp(filename,"-") == 0 ) eps = stdout; else eps = fopen(filename,"w"); if( eps == NULL ) error("Error: unable to open EPS output file."); /* write EPS header */ fprintf(eps,"%%!PS-Adobe-3.0 EPSF-3.0\n"); fprintf(eps,"%%%%BoundingBox: 0 0 %u %u\n",xsize,ysize); fprintf(eps,"%%%%Creator: LSD, Line Segment Detector\n"); fprintf(eps,"%%%%Title: (%s)\n",filename); fprintf(eps,"%%%%EndComments\n"); /* write line segments */ for(i=0;isize;i++) { fprintf( eps,"newpath %f %f moveto %f %f lineto %f setlinewidth stroke\n", segs->values[i*segs->dim+0], (double) ysize - segs->values[i*segs->dim+1], segs->values[i*segs->dim+2], (double) ysize - segs->values[i*segs->dim+3], width <= 0.0 ? segs->values[i*segs->dim+4] : width ); } /* close EPS file */ fprintf(eps,"showpage\n"); fprintf(eps,"%%%%EOF\n"); if( eps != stdout && fclose(eps) == EOF ) error("Error: unable to close file while writing EPS file."); } /*----------------------------------------------------------------------------*/ /*----------------------------- Write SVG File -------------------------------*/ /*----------------------------------------------------------------------------*/ /** Write line segments into a SVG file. If the name is "-" the file is written to standard output. */ static void write_svg( ntuple_list segs, char * filename, unsigned int xsize, unsigned int ysize, double width ) { FILE * svg; unsigned int i; /* open file */ if( strcmp(filename,"-") == 0 ) svg = stdout; else svg = fopen(filename,"w"); if( svg == NULL ) error("Error: unable to open SVG output file."); /* write SVG header */ fprintf(svg,"\n"); fprintf(svg,"\n"); fprintf(svg,"\n"); /* write line segments */ for(i=0;isize;i++) { fprintf(svg,"values[i*segs->dim+0],segs->values[i*segs->dim+1], segs->values[i*segs->dim+2],segs->values[i*segs->dim+3]); fprintf(svg,"stroke-width=\"%f\" stroke=\"black\" />\n", width <= 0.0 ? segs->values[i*segs->dim+4] : width); } /* close SVG file */ fprintf(svg,"\n"); if( svg != stdout && fclose(svg) == EOF ) error("Error: unable to close file while writing SVG file."); } /*----------------------------------------------------------------------------*/ /* Main */ /*----------------------------------------------------------------------------*/ /** Main function call */ int main(int argc, char ** argv) { struct arguments * arg = process_arguments(USE,argc,argv); FILE * output; image_double image; ntuple_list out; image_int region; unsigned int i,j; /* read input file */ image = read_pgm_image_double(get_str(arg,"in")); /* execute LSD */ out = LineSegmentDetection( image, get_double(arg,"scale"), get_double(arg,"sigma_coef"), get_double(arg,"quant"), get_double(arg,"ang_th"), get_double(arg,"eps"), get_double(arg,"density_th"), get_int(arg,"n_bins"), get_double(arg,"max_grad"), is_assigned(arg,"reg") ? ®ion : NULL ); /* output */ if( strcmp(get_str(arg,"out"),"-") == 0 ) output = stdout; else output = fopen(get_str(arg,"out"),"w"); if( output == NULL ) error("Error: unable to open ASCII output file."); for(i=0;isize;i++) { for(j=0;jdim;j++) fprintf(output,"%f ",out->values[i*out->dim+j]); fprintf(output,"\n"); } if( output != stdout && fclose(output) == EOF ) /* close file if needed */ error("Error: unable to close file while output file."); /* store region output if needed */ if(is_assigned(arg,"reg")) { write_pgm_image_int( region, get_str(arg,"reg") ); free_image_int(region); } /* create EPS output if needed */ if(is_assigned(arg,"epsfile")) write_eps( out, get_str(arg,"epsfile"), image->xsize, image->ysize, get_double(arg,"width") ); /* create SVG output if needed */ if(is_assigned(arg,"svgfile")) write_svg( out, get_str(arg,"svgfile"), image->xsize, image->ysize, get_double(arg,"width") ); /* free memory */ free_image_double(image); free_ntuple_list(out); free_arguments(arg); return EXIT_SUCCESS; } /*----------------------------------------------------------------------------*/ ================================================ FILE: thirdparty/LSWMS/CMakeLists.txt ================================================ ############################## PROJECT( lineSegment ) ############################## cmake_minimum_required (VERSION 2.6) # Packages find_package( OpenCV REQUIRED ) # Includes include_directories( ${OPENCV_INCLUDE_DIR} ${PROJECT_BINARY_DIR} ) set(SOURCE_FILES main.cpp LSWMS.cpp LSWMS.h ) # Add executable and target link libraries ADD_EXECUTABLE( lineSegment ${SOURCE_FILES}) TARGET_LINK_LIBRARIES( lineSegment ${OpenCV_LIBS}) ================================================ FILE: thirdparty/LSWMS/LSWMS.cpp ================================================ #include "LSWMS.h" #ifdef linux #include #endif #include #include #define ABS(a) (((a) < 0) ? -(a) : (a)) #define NOT_A_VALID_ANGLE 5 #define ANGLE_MARGIN 22.5 #define MAX_ERROR 0.19625 // ((22.5/2)*CV_PI/180 using namespace cv; using namespace std; static void setTo14Quads(DIR_POINT &dp) { if(dp.vx < 0) { dp.vx = -dp.vx; dp.vy = -dp.vy; } } LSWMS::LSWMS(const cv::Size imSize, const int R, const int numMaxLSegs, bool verbose) { // ********************************************** // Constructor of class LSWMS (Slice Sampling Weighted // Mean-Shift) // Args: // -> imSize - Size of image // -> R - accuracy parameter // -> numMaxLSegs - requested number of line segments. // if set to 0, the algorithm finds exploring // the whole image until no more line segments // can be found // -> verbose - show messages // ********************************************** __verbose = verbose; // Init variables __imSize = imSize; __imWidth = imSize.width; __imHeight = imSize.height; __R = R; __numMaxLSegs = numMaxLSegs; __N = 2*__R + 1; // Add padding it necessary if( (__imSize.width + 2*__N) % 4 != 0) __N = __N + ((__imSize.width + 2*__N) % 4)/2; __imPadSize.width = __imSize.width + 2*__N; __imPadSize.height = __imSize.height + 2*__N; // Init images __img = cv::Mat(__imSize, CV_8U); __imgPad = cv::Mat(__imPadSize, CV_8U); __roiRect = cv::Rect(__N, __N, __imSize.width, __imSize.height); // Mask image __M = cv::Mat(__imPadSize, CV_8U); __M.setTo(255); // Angle mask __A = cv::Mat(__imPadSize, CV_32F); __A.setTo(NOT_A_VALID_ANGLE); // Gradient images __G = cv::Mat(__imPadSize, CV_8U); __G.setTo(0); __Gx = cv::Mat(__imPadSize, CV_16S); __Gx.setTo(0); __Gy = cv::Mat(__imPadSize, CV_16S); __Gy.setTo(0); // Iterator if(__numMaxLSegs != 0) { __sampleIterator = std::vector(__imSize.width*__imSize.height, 0); for(unsigned int k=0; k<__sampleIterator.size(); k++) __sampleIterator[k] = k; cv::randShuffle(__sampleIterator); } // Angular m_margin __margin = (float)(ANGLE_MARGIN*CV_PI/180); } int LSWMS::run(const cv::Mat &img, std::vector &lSegs, std::vector &errors) { // ********************************************** // This function analyses the input image and finds // line segments that are stored in the given vector // Args: // -> img - Color or grayscale input image // <- lSegs - Output vector of line segments // <- errors - Output vector of angular errors // Ret: // RET_OK - no errors found // RET_ERROR - errors found // ********************************************** // Clear line segment container lSegs.clear(); errors.clear(); // Input image to __img if(img.channels() == 3) cv::cvtColor(img, __img, CV_BGR2GRAY); else __img = img; // Add convolution borders cv::copyMakeBorder(__img, __imgPad, __N, __N, __N, __N, cv::BORDER_REPLICATE); // This way we avoid line segments at the boundaries of the image // Init Mask matrix __M.setTo(255); __imgPadROI = __M(__roiRect); __imgPadROI.setTo(0); // Compute Gradient map // Call to the computation of the gradient and angle maps (SOBEL) int retP = computeGradientMaps(__imgPad, __G, __Gx, __Gy); if(retP == RET_ERROR) { if(__verbose) { printf("ERROR: Probability map could not be computed\n"); } return RET_ERROR; } // Set padding to zero int NN = __N + __R; setPaddingToZero(__Gx, NN); setPaddingToZero(__Gy, NN); setPaddingToZero(__G, NN); // Line segment finder int retLS = findLineSegments(__G, __Gx, __Gy, __A, __M, lSegs, errors); return retLS; return RET_OK; } int LSWMS::computeGradientMaps(const cv::Mat &img, cv::Mat &G, cv::Mat &Gx, cv::Mat &Gy) { // ********************************************** // SOBEL mode // // This function obtains the gradient image (G, Gx, Gy), // and fills the angular map A. // // Args: // -> img - Grayscale input image // <- G - Gradient magnitude image // <- Gx - Gradient x-magnitude image // <- Gy - Gradient y-magnitude image // Ret: // RET_OK - no errors found // RET_ERROR - errors found // ********************************************** if(__verbose) { printf("Compute gradient maps..."); fflush(stdout); } // Sobel operator int ddepth = CV_16S; cv::Mat absGx, absGy; cv::Sobel(img, Gx, ddepth, 1, 0); convertScaleAbs(Gx, absGx, (double)1/8); cv::Sobel(img, Gy, ddepth, 0, 1); convertScaleAbs(Gy, absGy, (double)1/8); //cv::addWeighted(absGx, 0.5, absGy, 0.5, 0, G, CV_8U); cv::add(absGx, absGy, G); // Obtain the threshold cv::Scalar meanG = cv::mean(G); __meanG = (int)meanG.val[0]; if(__verbose) { printf(" computed: __meanG = %d\n", __meanG); } // Move from 2nd to 4th and from 3rd to 1st // From 2nd to 4th, //if( gx < 0 && gy > 0 ) {gx = -gx; gy = -gy;} // from 2 to 4 //if( gx < 0 && gy < 0 ) {gx = -gx; gy = -gy;} // from 3 to 1 //if( gx < 0 ) {gx = -gx; gy = -gy;} int movedCounter = 0; for(int j=0; j<__imPadSize.height; ++j) { short *ptRowGx = Gx.ptr(j); short *ptRowGy = Gy.ptr(j); for(int i=0; i<__imPadSize.width; ++i) { if(ptRowGx[i] < 0) { ptRowGy[i] = -ptRowGy[i]; ptRowGx[i] = -ptRowGx[i]; movedCounter++; } } } if(__verbose) { printf("Moved %d/%d (%.2f%%) elements to 1st4th quadrant\n", movedCounter, __imPadSize.height*__imPadSize.width, ((double)100*movedCounter)/((double)__imPadSize.height*__imPadSize.width)); } if(__meanG > 0 && __meanG < 256) return RET_OK; else return RET_ERROR; } int LSWMS::findLineSegments(const cv::Mat &G, const cv::Mat &Gx, const cv::Mat &Gy, cv::Mat &A, cv::Mat &M, std::vector &lSegs, std::vector &errors) { // ********************************************** // This function finds line segments using the // probability map P, the gradient components // Gx, and Gy and the angle map A. // // Args: // -> G - Gradient magnitude map // -> Gx - Gradient x-magnitude image // -> Gy - Gradient y-magnitude image // <- M - Mask image of visited pixels // <- lSegs - vector of detected line segments // <- errors - vector of angular errors // Ret: // RET_OK - no errors found // RET_ERROR - errors found // ********************************************** // Loop over the image int x0, y0; int kIterator = 0; int imgSize = __img.cols*__img.rows; while(true) { if (kIterator == imgSize) { // This is the end break; } if(__numMaxLSegs == 0) { x0 = kIterator%__img.cols; y0 = kIterator/__img.cols; } else { x0 = __sampleIterator[kIterator]%__img.cols; y0 = __sampleIterator[kIterator]/__img.cols; } kIterator++; // Add padding x0 = x0 + __N; y0 = y0 + __N; // Check mask and value if(__M.at(y0,x0)==0 && G.at(y0,x0) > __meanG) { // The sample is (x0, y0) cv::Point ptOrig(x0, y0); float gX = (float)Gx.at(y0,x0); float gY = (float)Gy.at(y0,x0); DIR_POINT dpOrig(ptOrig, gX, gY); // Since it is computed from Gx, Gy, it is in 1º4º // Line segment generation float error = 0; if(__verbose) { printf("-------------------------------\n"); } if(__verbose) { printf("Try dpOrig=(%d,%d,%.2f,%.2f)...\n", dpOrig.pt.x, dpOrig.pt.y, dpOrig.vx, dpOrig.vy); } int retLS = lineSegmentGeneration(dpOrig, __lSeg, error); if( (retLS == RET_OK) && error < MAX_ERROR ) { if(__verbose) { printf("lSeg generated=(%d,%d)->(%d,%d)...\n", __lSeg[0].x, __lSeg[0].y, __lSeg[1].x, __lSeg[1].y); } if(__verbose) { printf("-------------------------------\n"); } lSegs.push_back(__lSeg); errors.push_back((double)error); if(__numMaxLSegs != 0 && lSegs.size() >= (unsigned int)__numMaxLSegs) break; } else { // Mark as visited cv::Rect w(x0-__R, y0 -__R, __N, __N); cv::Mat roi = __M(w); roi.setTo(255); } } } return RET_OK; } int LSWMS::lineSegmentGeneration(const DIR_POINT &dpOrig, LSEG &lSeg, float &error) { // ********************************************** // Starts at dpOrig and generates lSeg // // Args: // -> dpOrig - starting DIR_POINT // <- lSeg - detected line segment // Ret: // RET_OK - lSeg created // RET_ERROR - lSeg not created // ********************************************** // Check input data if(dpOrig.pt.x < 0 || dpOrig.pt.x >= __G.cols || dpOrig.pt.y<0 || dpOrig.pt.y >= __G.rows) return RET_ERROR; // Find best candidate with Mean-Shift // ----------------------------------------------------- DIR_POINT dpCentr = dpOrig; if(__verbose) { printf("\tMean-Shift(Centr): from (%d,%d,%.2f,%.2f) to...", dpOrig.pt.x, dpOrig.pt.y, dpOrig.vx, dpOrig.vy); fflush(stdout); } int retMSC = weightedMeanShift(dpOrig, dpCentr, __M); /// COMO LE PASO __M, TIENE EN CUENTA SI SE HA VISITADO O NO if(__verbose) { printf(" (%d,%d,%.2f, %.2f)\n", dpCentr.pt.x, dpCentr.pt.y, dpCentr.vx, dpCentr.vy); } if(retMSC == RET_ERROR) { if(__verbose) { printf("\tMean-Shift reached not a valid point\n"); } return RET_ERROR; } // Grow in two directions from dpCentr // ----------------------------------------------------- if(__verbose) { printf("\tGROW 1:"); fflush(stdout); } cv::Point pt1; float retG1 = grow(dpCentr, pt1, 1); float d1 = (float)((dpCentr.pt.x - pt1.x)*(dpCentr.pt.x - pt1.x) + (dpCentr.pt.y - pt1.y)*(dpCentr.pt.y - pt1.y)); if(__verbose) { printf("\tpt1(%d,%d), dist = %.2f, error=%.4f\n", pt1.x, pt1.y, d1, retG1); } if(__verbose) { printf("\tGROW 2:"); fflush(stdout); } cv::Point pt2; float retG2 = grow(dpCentr, pt2, 2); float d2 = (float)((dpCentr.pt.x - pt2.x)*(dpCentr.pt.x - pt2.x) + (dpCentr.pt.y - pt2.y)*(dpCentr.pt.y - pt2.y)); if(__verbose) { printf("\tpt2(%d,%d), dist = %.2f, error=%.4f\n", pt2.x, pt2.y, d2, retG2); } if(retG1 == -1 && retG2 == -1) return RET_ERROR; // Select the most distant extremum if(d10) { dirX = dirX/norm; dirY = dirY/norm; DIR_POINT dpAux(dpCentr.pt, -(-dirY), -dirX); // DIR_POINT must be filled ALWAYS with gradient vectors float retG = grow(dpAux, pt2, 1); error = retG; } else { pt2 = dpCentr.pt; } // Check dirX = (float)(pt1.x -pt2.x); dirY = (float)(pt1.y -pt2.y); if( sqrt(dirX*dirX + dirY*dirY) < __N) { if(__verbose) { printf("Line segment not generated: Too short.\n"); } return RET_ERROR; } // Output line segment if(__verbose) { printf("LSeg = (%d,%d)-(%d,%d)\n", pt2.x, pt2.y, pt1.x, pt1.y); } lSeg.clear(); lSeg.push_back(cv::Point(pt2.x - 2*__R, pt2.y - 2*__R)); lSeg.push_back(cv::Point(pt1.x - 2*__R, pt1.y - 2*__R)); // Update visited positions matrix updateMask(pt1,pt2); return RET_OK; } void LSWMS::updateMask(cv::Point pt1, cv::Point pt2) { // Bresenham from one extremum to the other int x1 = pt1.x, x2 = pt2.x, y1 = pt1.y, y2 = pt2.y; int dx = ABS(x2-x1); int dy = ABS(y2-y1); int sx, sy, err, e2; if(x1 < x2) sx = 1; else sx = -1; if(y1 < y2) sy = 1; else sy = -1; err = dx-dy; while(true) { // Current value is (x1,y1) // ------------------------------- // Do... // Set window to "visited=255" for(int j=y1-__R; j<=y1+__R; ++j) { unsigned char* ptRowM = __M.ptr(j); for(int i=x1-__R; i<=x1+__R; ++i) ptRowM[i] = 255; } // ------------------------------- // Check end if (x1 == x2 && y1 == y2) break; // Update position for next iteration e2 = 2*err; if(e2 > -dy) { err = err - dy; x1 = x1 + sx;} if(e2 < dx) { err = err + dx; y1 = y1 + sy;} } } int LSWMS::weightedMeanShift(const DIR_POINT &dpOrig, DIR_POINT &dpDst, const cv::Mat &M) { // ********************************************** // Refines dpOrig and creates dpDst // // Args: // -> dpOrig - starting DIR_POINT // <- dpDst - refined DIR_POINT // Ret: // RET_OK - dpDst created // RET_ERROR - dpDst not found // // Called from "lineSegmentGeneration" // ********************************************** // MAIN LOOP: loop until MS generates no movement (or dead-loop) __seeds.clear(); DIR_POINT dpCurr = dpOrig; // The initial dp is in 1º4º dpDst = dpOrig; while(true) { // Check point if(dpCurr.pt.x < 0 || dpCurr.pt.x >= __G.cols || dpCurr.pt.y<0 || dpCurr.pt.y >= __G.rows) return RET_ERROR; // Check direction if(dpCurr.vx==0 && dpCurr.vy == 0) return RET_ERROR; // Convert to 1º4º (maybe not needed) setTo14Quads(dpCurr); // Check already visited if(!M.empty()) { if(M.at(dpCurr.pt.y, dpCurr.pt.x) == 255) { return RET_ERROR; } } // Check if previously used as seed for this MS-central (this is to avoid dead-loops) for(unsigned int i=0; i<__seeds.size(); i++) { if(__seeds[i].x == dpCurr.pt.x && __seeds[i].y == dpCurr.pt.y) { dpDst = dpCurr; return RET_ERROR; } } // Define bounds int xMin = dpCurr.pt.x - __R; int yMin = dpCurr.pt.y - __R; int xMax = dpCurr.pt.x + __R; int yMax = dpCurr.pt.y + __R; int offX = __R; int offY = __R; if( xMin < 0 || yMin < 0 || xMax >= __G.cols || yMax >= __G.rows) return RET_ERROR; __seeds.push_back(dpCurr.pt); // Define rois cv::Rect roi(xMin, yMin, xMax-xMin+1, yMax-yMin+1); cv::Mat gBlock = cv::Mat(__G, roi); cv::Mat gXBlock = cv::Mat(__Gx, roi); cv::Mat gYBlock = cv::Mat(__Gy, roi); cv::Mat aBlock = cv::Mat(__A, roi); cv::Mat insideBlock = cv::Mat(gBlock.size(), CV_8U); // 0: outside, 1:inside insideBlock.setTo(1); // Update angles (this is to compute angles only once) for(int j=0; j(j,i) = atan2((float)gYBlock.at(j,i), (float)gXBlock.at(j,i)); } } //if(__verbose) printf("dpCurr(%d,%d)(%.2f,%.2f)\n", dpCurr.pt.x, dpCurr.pt.y, dpCurr.vx, dpCurr.vy); //if(__verbose) std::cout << "gBlock" << gBlock << endl; //if(__verbose) std::cout << "gXBlock" << gXBlock << endl; //if(__verbose) std::cout << "gYBlock" << gYBlock << endl; //if(__verbose) std::cout << "aBlock" << aBlock << endl; // ---------------------------------- // Angle analysis float currentAngle = atan2(dpCurr.vy, dpCurr.vx); // output is between (-CV_PI/2, CV_PI/2) //if(__verbose) printf("currentAngle = %.2f\n", currentAngle); // ---------------------------------- float angleShift = 0; int outsideCounter = 0; if(currentAngle - __margin < -PI_2) { // Shift angles according to currentAngle to avoid discontinuities //if(__verbose) printf("shift angles since %.2f - %.2f < %.2f\n", currentAngle, __margin, -PI_2); angleShift = currentAngle; aBlock = aBlock - currentAngle; currentAngle = 0; float minAngle = currentAngle - __margin; float maxAngle = currentAngle + __margin; for(int j=0; j(j); uchar *ptRowGBlock = gBlock.ptr(j); for(int i=0; i PI_2) ptRowABlock[i] -= (float)CV_PI; if(ptRowABlock[i] < minAngle || ptRowABlock[i] > maxAngle) { //ptRowGBlock[i] = -1; insideBlock.at(j,i) = 0; outsideCounter++; } } } // Restore aBlock = aBlock + angleShift; } else if(currentAngle + __margin > PI_2) { // Shift angles according to currentAngle to avoid discontinuities //if(__verbose) printf("shift angles since %.2f + %.2f > %.2f\n", currentAngle, __margin, PI_2); angleShift = currentAngle; aBlock = aBlock - currentAngle; currentAngle = 0; float minAngle = currentAngle - __margin; float maxAngle = currentAngle + __margin; for(int j=0; j(j); uchar *ptRowGBlock = gBlock.ptr(j); for(int i=0; i PI_2) ptRowABlock[i] -= (float)CV_PI; if(ptRowABlock[i] < minAngle || ptRowABlock[i] > maxAngle) { //ptRowGBlock[i] = -1; insideBlock.at(j,i) = 0; outsideCounter++; } } } // Restore aBlock = aBlock + angleShift; } else { angleShift = 0; float minAngle = currentAngle - __margin; float maxAngle = currentAngle + __margin; for(int j=0; j(j); uchar *ptRowGBlock = gBlock.ptr(j); for(int i=0; i maxAngle) { //ptRowGBlock[i] = -1; insideBlock.at(j,i) = 0; outsideCounter++; } } } } //if(__verbose) std::cout << "insideBlock" << insideBlock << endl; //if(__verbose) std::cout << "aBlock(after computing insideBlock" << aBlock << endl; // Check number of samples inside the bandwidth if(outsideCounter == (2*__R+1)*(2*__R+1)) return RET_ERROR; // New (Circular) Mean angle (weighted by G) float sumWeight = 0; float foffX = 0; float foffY = 0; float meanAngle = 0; for(int j=0; j(j); float *ptRowABlock = aBlock.ptr(j); for(int i=0; i(j,i) != 0) { // This sample is inside the Mean-Shift bandwidth // Weighted mean of positons foffX += (float)(i+1)*ptRowGBlock[i]; // This cannot be precomputed... foffY += (float)(j+1)*ptRowGBlock[i]; // Weighted mean of angle meanAngle += ptRowABlock[i]*ptRowGBlock[i]; sumWeight += ptRowGBlock[i]; } } } foffX /= sumWeight; foffX--; foffY /= sumWeight; foffY--; meanAngle /= sumWeight; //if(__verbose) printf("meanAngle = %.2f\n", meanAngle); // Check convergence (movement with respect to the center) if(cvRound(foffX) == offX && cvRound(foffY) == offY) { // Converged. Assign and return. dpDst = DIR_POINT(dpCurr.pt, cos(meanAngle), sin(meanAngle)); setTo14Quads(dpDst); return RET_OK; } else { // Not converged: update dpCurr and iterate dpCurr.pt.x += cvRound(foffX) - offX; dpCurr.pt.y += cvRound(foffY) - offY; dpCurr.vx = cos(meanAngle); dpCurr.vy = sin(meanAngle); } } return RET_OK; } float LSWMS::grow(const DIR_POINT &dpOrig, cv::Point &ptDst, int dir) { // ********************************************** // Finds end-point ptDst starting from dpOrig // // Args: // -> dpOrig - starting DIR_POINT // <- ptDst - end-point // -> dir - growing direction (1(+) or 2(-)) // Ret: // error - error of line segment // // Called from lineSegmentGeneration // ********************************************** cv::Point ptEnd1, ptEnd2; //auxiliar DIR_POINT dpEnd, dpRef; // auxiliar // Init output ptDst = dpOrig.pt; // Starting gradient vector and director vector float gX, gY; if(dir == 1) { gX = dpOrig.vx; gY = dpOrig.vy; } else if(dir == 2) { gX = -dpOrig.vx; gY = -dpOrig.vy; } else return RET_ERROR; // Compute currentAngle in 1º4º float error1 = 0; float growAngle, auxAngle, minAngle, maxAngle, diffAngle; //if(gX < 0) // In this case, direction must not be fliped to 1º4º, because otherwise the sense is lost for the second grow procedure... //{ // // Move to 1º4º // gX = -gX; // gY = -gY; //} growAngle = atan2(gY, gX); // Starting point and angle - Bresenham cv::Point pt1 = dpOrig.pt; cv::Point pt2(pt1.x + (int)(1000*(-gY)), pt1.y + (int)(1000*(gX))); cv::clipLine(__imPadSize, pt1, pt2); // Loop - Bresenham int k1=0; int x1 = pt1.x, x2 = pt2.x, y1 = pt1.y, y2 = pt2.y; int dx = ABS(x2-x1); int dy = ABS(y2-y1); int sx, sy, err, e2; if(__verbose) { printf("From (%d,%d) to (%d,%d)...", x1, y1, x2, y2); fflush(stdout); } if(x1 < x2) sx = 1; else sx = -1; if(y1 < y2) sy = 1; else sy = -1; err = dx-dy; int maxNumZeroPixels = 2*__R, countZeroPixels=0; while(true) { // Current value is (x1,y1) //if(__verbose) { printf("\n\tBresenham(%d,%d)", x1, y1); fflush(stdout); } // ------------------------------- // Do... // Check if angle has been computed if(__A.at(y1,x1) != NOT_A_VALID_ANGLE) auxAngle = __A.at(y1,x1); else { auxAngle = atan2((float)__Gy.at(y1,x1), (float)__Gx.at(y1,x1)); __A.at(y1,x1) = auxAngle; } // Check early-termination of Bresenham if(__G.at(y1,x1) == 0) { //if(__verbose) printf("Zero-pixel num. %d\n", countZeroPixels); countZeroPixels++; if(countZeroPixels >= maxNumZeroPixels) break; // No gradient point } // Check angular limits if(growAngle - __margin < -PI_2) // e.g. currentAngle = -80º, margin = 20º { minAngle = growAngle - __margin + (float)CV_PI; // e.g. -80 -20 +180 = 80º maxAngle = growAngle + __margin; // e.g. -80 +20 =-60º if( auxAngle < 0) { if( auxAngle > maxAngle ) break; //if(__verbose) printf("Early-termination: auxAngle(%.2f) > maxAngle(%.2f) && auxAngle < 0\n", auxAngle, maxAngle); diffAngle = ABS(growAngle - auxAngle); } else // auxAngle > 0 { if( auxAngle < minAngle) break; //if(__verbose) printf("Early-termination: auxAngle(%.2f) < minAngle(%.2f) && auxAngle > 0\n", auxAngle, minAngle); diffAngle = ABS(growAngle - (auxAngle - (float)CV_PI)); } } else if(growAngle + __margin > PI_2) // e.g. currentAngle = 80º, margin = 20º { minAngle = growAngle - __margin; // e.g. 80 -20 = 60º maxAngle = growAngle + __margin - (float)CV_PI; // e.g. 80 +20 -180 = -80º if( auxAngle > 0 ) { if( auxAngle < minAngle) break; //if(__verbose) printf("Early-termination: auxAngle(%.2f) < minAngle(%.2f) && auxAngle > 0\n", auxAngle, minAngle); diffAngle = ABS(growAngle - auxAngle); } else // auxAngle < 0 { if( auxAngle > maxAngle) break; //if(__verbose) printf("Early-termination: auxAngle(%.2f) > maxAngle(%.2f) && auxAngle < 0\n", auxAngle, maxAngle); diffAngle = ABS(growAngle - (auxAngle + (float)CV_PI)); } } else { minAngle = growAngle - __margin; maxAngle = growAngle + __margin; if(auxAngle < minAngle || auxAngle > maxAngle) break; //if(__verbose) printf("Early-termination: auxAngle(%.2f) < minAngle(%.2f) || > maxAngle(%.2f)\n", auxAngle, minAngle, maxAngle); diffAngle = ABS(growAngle - auxAngle); } // If arrived here, the point is valid (inside the angular limits, and with G!=0) //error1 += ABS(ABS(__Gx.at(y1,x1)) - ABS(gX)) + // ABS(ABS(__Gy.at(y1,x1)) - ABS(gY)); //error1 += ABS(auxAngle - growAngle); // OJO, SI HA HABIDO DISCONTINUIDAD, ESTO NO ES CORRECTO... error1 += diffAngle; ptEnd1 = cv::Point(x1,y1); k1++; // ------------------------------- // Check end if (x1 == x2 && y1 == y2) break; // Update position for next iteration e2 = 2*err; if(e2 > -dy) { err = err - dy; x1 = x1 + sx;} if(e2 < dx) { err = err + dx; y1 = y1 + sy;} } // "k1": how many points have been visited // "ptEnd": last valid point if( k1==0 ) // this means that even the closest point has not been accepted { ptEnd1 = dpOrig.pt; error1 = (float)CV_PI; } else error1 /= k1; if(__verbose) { printf(", Arrived to (%d,%d), error=%.2f", ptEnd1.x, ptEnd1.y, error1); fflush(stdout); } // Set ptDst ptDst = ptEnd1; // Apply Mean-Shift to refine the end point //if(__verbose) printf("Check grow movement: From (%d,%d) to (%d,%d)\n", dpOrig.pt.x, dpOrig.pt.y, ptEnd1.x, ptEnd1.y); if(__verbose) { printf(", Dist = (%d,%d)\n", ABS(ptEnd1.x - dpOrig.pt.x), ABS(ptEnd1.y - dpOrig.pt.y)); } if(ABS(ptEnd1.x - dpOrig.pt.x) > __R || ABS(ptEnd1.y - dpOrig.pt.y) > __R) // ONLY IF THERE HAS BEEN (SIGNIFICANT) MOTION FROM PREVIOUS MEAN-SHIFT MAXIMA { int counter = 0; while(true) { if(__verbose) { printf("\tMean-Shift(Ext): from (%d,%d,%.2f,%.2f) to...", ptEnd1.x, ptEnd1.y, gX, gY); fflush(stdout); } counter++; // Mean-Shift on the initial extremum // ------------------------------------------------------------- dpEnd.pt = ptEnd1; dpEnd.vx = gX; dpEnd.vy = gY; // gX and gY have been update in the last iter dpRef.pt = ptEnd1; dpRef.vx = gX; dpRef.vy = gY; int retMSExt = weightedMeanShift(dpEnd, dpRef); if(__verbose) { printf("(%d,%d,%.2f,%.2f)\n", dpRef.pt.x, dpRef.pt.y, dpRef.vx, dpRef.vy); } if(retMSExt == RET_ERROR) { // The refinement gave and incorrect value, keep last Bresenham value ptDst = ptEnd1; return RET_OK; } // Check motion caused by Mean-Shift if(dpRef.pt.x == dpEnd.pt.x && dpRef.pt.y == dpEnd.pt.y) { ptDst = dpRef.pt; return RET_OK; } // Check displacement from dpOrig gX = (float)(dpRef.pt.y - dpOrig.pt.y); // float dX = dpRef.x - dpOrig.x; and gX = dY; gY = (float)(dpOrig.pt.x - dpRef.pt.x); // float dY = dpRef.y - dpOrig.y; and gY = -dX; if(gX == 0 && gY == 0) { ptDst = dpRef.pt; return RET_OK; } float norm = sqrt(gX*gX + gY*gY); gX /= norm; gY /= norm; // New Bresenham procedure if(gX < 0) { // MOve to 1º4º gX = -gX; gY = -gY; } growAngle = atan2(gY, gX); int k2=0; float error2 = 0; pt2.x = pt1.x + (int)(1000*(-gY)); pt2.y = pt1.y + (int)(1000*(gX)); x1 = pt1.x; x2 = pt2.x; y1 = pt1.y; y2 = pt2.y; dx = ABS(x2-x1); dy = ABS(y2-y1); if(x1 < x2) sx = 1; else sx = -1; if(y1 < y2) sy = 1; else sy = -1, err = dx-dy; if(__verbose) { printf("\tRefined GROW: From (%d,%d) to (%d,%d)...", x1, y1, x2, y2); fflush(stdout); } while(true) { // Current value is (x1,y1) //if(__verbose) { printf("\n\tBresenham(%d,%d)", x1, y1); fflush(stdout); } // ------------------------------- // Do... // Check if angle has been computed if(__A.at(y1,x1) != NOT_A_VALID_ANGLE) auxAngle = __A.at(y1,x1); else { auxAngle = atan2((float)__Gy.at(y1,x1), (float)__Gx.at(y1,x1)); __A.at(y1,x1) = auxAngle; } // Check early-termination of Bresenham if(__G.at(y1,x1) == 0) { //if(__verbose) printf("Zero-pixel num. %d\n", countZeroPixels); countZeroPixels++; if(countZeroPixels >= maxNumZeroPixels) break; // No gradient point } // Check angular limits if(growAngle - __margin < -PI_2) // e.g. currentAngle = -80º, margin = 20º { minAngle = growAngle - __margin + (float)CV_PI; // e.g. -80 -20 +180 = 80º maxAngle = growAngle + __margin; // e.g. -80 +20 =-60º if( auxAngle < 0) { if( auxAngle > maxAngle ) break; //if(__verbose) printf("Early-termination: auxAngle(%.2f) > maxAngle(%.2f) && auxAngle < 0\n", auxAngle, maxAngle); diffAngle = ABS(growAngle - auxAngle); } else // auxAngle > 0 { if( auxAngle < minAngle) break; //if(__verbose) printf("Early-termination: auxAngle(%.2f) < minAngle(%.2f) && auxAngle > 0\n", auxAngle, minAngle); diffAngle = ABS(growAngle - (auxAngle - (float)CV_PI)); } } else if(growAngle + __margin > PI_2) // e.g. currentAngle = 80º, margin = 20º { minAngle = growAngle - __margin; // e.g. 80 -20 = 60º maxAngle = growAngle + __margin - (float)CV_PI; // e.g. 80 +20 -180 = -80º if( auxAngle > 0 ) { if( auxAngle < minAngle) break; //if(__verbose) printf("Early-termination: auxAngle(%.2f) < minAngle(%.2f) && auxAngle > 0\n", auxAngle, minAngle); diffAngle = ABS(growAngle - auxAngle); } else // auxAngle < 0 { if( auxAngle > maxAngle) break; //if(__verbose) printf("Early-termination: auxAngle(%.2f) > maxAngle(%.2f) && auxAngle < 0\n", auxAngle, maxAngle); diffAngle = ABS(growAngle - (auxAngle + (float)CV_PI)); } } else { minAngle = growAngle - __margin; maxAngle = growAngle + __margin; if(auxAngle < minAngle || auxAngle > maxAngle) break; //if(__verbose) printf("Early-termination: auxAngle(%.2f) < minAngle(%.2f) || > maxAngle(%.2f)\n", auxAngle, minAngle, maxAngle); diffAngle = ABS(growAngle - auxAngle); } error2 += diffAngle; ptEnd2 = cv::Point(x1,y1); k2++; // ------------------------------- // Check end if (x1 == x2 && y1 == y2) break; // Update position for next iteration e2 = 2*err; if(e2 > -dy) { err = err - dy; x1 = x1 + sx;} if(e2 < dx) { err = err + dx; y1 = y1 + sy;} } // Bresenham while // "k2": how many points have been visited // "ptEnd2": last valid point if( k2==0 ) // this means that even the closest point has not been accepted { ptEnd2 = dpOrig.pt; error2 = (float)CV_PI; } else error2 = error2 / k2; fflush(stdout); // Don't really know why, but this is necessary to avoid dead loops... if(__verbose) { printf(", Arrived to (%d,%d), error=%.2f", ptEnd2.x, ptEnd2.y, error2); fflush(stdout); } if(__verbose) { printf(", Dist = (%d,%d)\n", ABS(ptEnd2.x - dpOrig.pt.x), ABS(ptEnd1.y - dpOrig.pt.y)); } // Compare obtained samples if(error1 <= error2) { ptDst = ptEnd1; return error1; } else { // Update ptEnd1 with ptEnd2 because it is better and iterate ptEnd1 = ptEnd2; k1 = k2; error1 = error2; } } // Mean-Shift while } //else if(__verbose) // printf("Not enough movement\n"); //return RET_OK; return error1; } void LSWMS::setPaddingToZero(cv::Mat &img, int NN) { cv::rectangle(img, cv::Point(0,0), cv::Point(img.cols-1, NN-1), cv::Scalar(0), CV_FILLED); cv::rectangle(img, cv::Point(0,0), cv::Point(NN-1, img.rows-1), cv::Scalar(0), CV_FILLED); cv::rectangle(img, cv::Point(0,img.rows-NN), cv::Point(img.cols-1, img.rows-1), cv::Scalar(0), CV_FILLED); cv::rectangle(img, cv::Point(img.cols-NN,0), cv::Point(img.cols-1, img.rows-1), cv::Scalar(0), CV_FILLED); } void LSWMS::drawLSegs(cv::Mat &img, std::vector &lSegs, cv::Scalar color, int thickness) { for(unsigned int i=0; i &lSegs, std::vector &errors, int thickness) { std::vector colors; colors.push_back(CV_RGB(255,0,0)); colors.push_back(CV_RGB(200,0,0)); colors.push_back(CV_RGB(150,0,0)); colors.push_back(CV_RGB(50,0,0)); for(unsigned int i=0; i LSEG; typedef struct _DIR_POINT { cv::Point pt; float vx; float vy; _DIR_POINT(cv::Point _pt, float _vx, float _vy) { pt = _pt; vx = _vx; vy = _vy; }; _DIR_POINT() { pt = cv::Point(0,0); vx = 0; vy = 0; } }DIR_POINT; class LSWMS { private: //Verbose bool __verbose; // Sizes cv::Size __imSize, __imPadSize; int __imWidth, __imHeight; // Window parameters int __R, __N; // Line Segments LSEG __lSeg; int __numMaxLSegs; // Images and maps cv::Mat __img, __imgPad; cv::Rect __roiRect; cv::Mat __imgPadROI; cv::Mat __G, __Gx, __Gy; // Map of probability of line segments cv::Mat __M; // Map of visited pixels cv::Mat __A; // Map of angles cv::Mat __imAux; // For debugging // Thresholds and variables int __meanG; std::vector __sampleIterator; float __margin; // Mean-Shift central std::vector __seeds; // Functions void setPaddingToZero(cv::Mat &img, int NN); void updateMask(cv::Point pt1, cv::Point pt2); // SOBEL-specific functions int computeGradientMaps(const cv::Mat &img, cv::Mat &G, cv::Mat &Gx, cv::Mat &Gy); // General functions int findLineSegments(const cv::Mat &G, const cv::Mat &Gx, const cv::Mat &Gy, cv::Mat &A, cv::Mat &M, std::vector &lSegs, std::vector &errors); int lineSegmentGeneration(const DIR_POINT &dpOrig, LSEG &lSeg, float &error); // Growing and Mean-Shift float grow(const DIR_POINT &dpOrig, cv::Point &ptDst, int dir); int weightedMeanShift(const DIR_POINT &dpOrig, DIR_POINT &dpDst, const cv::Mat &M=cv::Mat()); public: LSWMS(const cv::Size imSize, const int R, const int numMaxLSegs=0, bool verbose=false); int run(const cv::Mat &img, std::vector &lSegs, std::vector &errors); void drawLSegs(cv::Mat &img, std::vector &lSegs, cv::Scalar color=CV_RGB(255,0,0), int thickness=1); void drawLSegs(cv::Mat &img, std::vector &lSegs, std::vector &errors, int thickness=1); }; #endif // __LSWMS_H__ ================================================ FILE: thirdparty/LSWMS/main.cpp ================================================ /* * Project: lineSegments (LSWMS Line Segment using Weighted Mean-Shift) * * File: main.cpp * * Contents: Creation, initialisation and usage of LSWMS object * for the detection of line segments in images or videos * * Author: Marcos Nieto * * Homepage: www.marcosnieto.net */ #ifdef WIN32 #include #include #endif #ifdef linux #include #include #include #endif #include #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "LSWMS.h" using namespace std; using namespace cv; // Timing #ifdef WIN32 double t1, t2; #else int t1, t2; struct timeval ts; #endif double t; void help() { cout << "/*\n" << " **************************************************************************************************\n" << " * Line segment detection using WMS \n" << " * ----------------------------------------------------\n" << " * \n" << " * Author:Marcos Nieto\n" << " * www.marcosnieto.net\n" << " * marcos.nieto.doncel@gmail.com\n" << " * \n" << " * Date:01/04/2012\n" << " **************************************************************************************************\n" << " * \n" << " * Usage: \n" << " * -video # Specifies video file as input (if not specified, camera is used) \n" << " * -image # Specifies image file as input (if not specified, camera is used) \n" << " * -verbose # Actives verbose: ON, OFF (default)\n" << " * -play # ON: the video runs until the end; OFF: frame by frame (key press event)\n" << " * -resizedWidth # Specifies the desired width of the image (the height is computed to keep aspect ratio)\n" << " * -numMaxLSegs # Specifies the maximum number of line segments to detected.\n" << " *\n" << " * -hough # ON: Applies OpenCV HoughLinesP for comparison (PPHT)\n" << " *\n" << " * Example:\n" << " * lineSegment -video myVideo.avi -verbose ON -play OFF\n" << " * lineSegment -image myImage.jpg -resizedWidth 300 -numMaxLSegs 100\n" << " * lineSegment -image myImage.jpg -hough ON\n" << " * \n" << " * Keys:\n" << " * Esc: Quit\n" << " */\n" << endl; } void processPPHT(cv::Mat &img, std::vector &lSegs) { cv::Mat imgGRAY; cv::cvtColor(img, imgGRAY, CV_RGB2GRAY); cv::Mat dst; cv::Canny(imgGRAY, dst, 20, 80, 3); std::vector lines; cv::HoughLinesP(dst, lines, 1, CV_PI/180, 80, 30, 10); LSEG lSeg; cv::Point p1, p2; lSegs.clear(); for(size_t i=0; i &lSegs, cv::Scalar color) { for(size_t i=0; i lSegs, lSegsPPHT; std::vector errors; // Start showing help help(); // Parse arguments if(argc < 2) return -1; for(int i=1; i> inputImg; } else { printf("-------------------------\n"); } if( inputImg.empty() ) break; // Resize to processing size cv::resize(inputImg, inputImg, procSize); // Color Conversion if(inputImg.channels() == 3) { cv::cvtColor(inputImg, imgGRAY, CV_BGR2GRAY); inputImg.copyTo(outputImg); if(usePPHT) inputImg.copyTo(outputImgPPHT); } else { inputImg.copyTo(imgGRAY); cv::cvtColor(inputImg, outputImg, CV_GRAY2BGR); if(usePPHT) cv::cvtColor(inputImg, outputImgPPHT, CV_GRAY2BGR); } // ++++++++++++++++++++++++++++++++++++++++ // Process LSWMS #ifdef WIN32 t1 = ::GetTickCount(); #else gettimeofday(&ts,0); t1 = (ts.tv_sec * 1000 + (ts.tv_usec / 1000)); #endif lswms.run(inputImg, lSegs, errors); #ifdef WIN32 t2 = ::GetTickCount(); #else gettimeofday(&ts,0); t2 = (ts.tv_sec * 1000 + (ts.tv_usec / 1000)); #endif // process time = t2 - t1 t = (double)t2-(double)t1; cv::Scalar mean, stddev; cv::meanStdDev(errors, mean, stddev); if(!stillImage) printf("Fr.#%d - LSWMS: %d lines / %.0f ms , Ang.Error: (Mean, Std)=(%.2f, %.2f)(deg)\n", frameNum, lSegs.size(), t, mean.val[0]*180/CV_PI, stddev.val[0]*180/CV_PI); else printf("LSWMS: %d segments\nAngular Error: Mean = %.2f (deg), Std = %.2f (deg)\nProcess Time = %.0f (ms)\n", lSegs.size(), mean.val[0]*180/CV_PI, stddev.val[0]*180/CV_PI, t); //lswms.drawLSegs(outputImg, lSegs,CV_RGB(255,0,0), 2); // drawing all line segments the same lswms.drawLSegs(outputImg, lSegs, errors); // drawing according to errors // ++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++ if(usePPHT) { // Process PPHT #ifdef WIN32 t1 = ::GetTickCount(); #else gettimeofday(&ts,0); t1 = (ts.tv_sec * 1000 + (ts.tv_usec / 1000)); #endif processPPHT(inputImg, lSegsPPHT); #ifdef WIN32 t2 = ::GetTickCount(); #else gettimeofday(&ts,0); t2 = (ts.tv_sec * 1000 + (ts.tv_usec / 1000)); #endif // process time = t2 - t1 t = (double)t2-(double)t1; drawPPHT(outputImgPPHT, lSegsPPHT, CV_RGB(0,0,255)); if(!stillImage) printf("Fr.#%d - PPHT: %d lines / %.0f ms\n", frameNum, lSegsPPHT.size(), t); else printf("\nPPHT: %d segments\nProcess Time = %.0f (ms)\n", lSegsPPHT.size(), t); // ++++++++++++++++++++++++++++++++++++++++ } // View imshow("LSWMS", outputImg); if(usePPHT) imshow("PPHT", outputImgPPHT); if(stillImage) { cv::imwrite("lswms.bmp", outputImg); if(usePPHT) cv::imwrite("ppht.bmp", outputImgPPHT); } if(playMode) cv::waitKey(1); else cv::waitKey(0); char q = (char)waitKey(1); if( q == 27 ) { printf("\nStopped by user request\n"); break; } if(stillImage) break; } // main while if(!stillImage) video.release(); return 0; } ================================================ FILE: thirdparty/MCMLSD/MCMLSD/Readme.txt ================================================ many function in the line segmentation algorithm were mex file, if you are using windows or linux system, please recompile following c code into mex file. mexRemoveVotes_v3_scale.c mexVoteEdges_v3_scale.c the c code can be compiled by command mex xxxxxxxxx.c Please use matlab coder to compile following .m file into mex file: hmmParameters.m returnLines.m sampleLine.m the matlab coder is an app in matlab to automatically compile .m code into mex file, The entry point for the code is demo_start_v2.m. The instruction is in following select No for "Does this code use global variables?" The input variable type should be configurated in following sampleLine.m rho double(1x1) theta double(1x1) m double(1x1) n double(1x1) pp double(1x2) returnLines.m points_proj double(:infx2) final_labels double(1x:inf) hmmParameters.m exist_edge_on double(1x40) exist_edge_off double(1x40) ang_dev_on double(1x181) ang_dev_off double(1x181) node_idx double(:infx1) Psi_t double(2x2) pi_var double(2x1) y_h double(:infx1) distances double(:infx1) range_dis double(1x40) nexist_edge_on double(1x40) nexist_edge_off double(1x40) prob_on double(1x1) prob_off double(1x1) prob_stay_on double(1x1) prob_leave_off double(1x1) prob_leave_on double(1x1) prob_stay_off double(1x1) ang_dev double(:infx1) range_ang double(1x181) 4. Select MEX as output format also remove the _mex ending in the output file name section for example if you are compiling sampleLine.m, output the file name as sampleLine instead of sampleLine_mex the line segment detector has two steps 1. compute the kernel for the image size you only need to compute the kernal once for one an image size [kernels, kernels_flip, kernel_params] =kernelInitialization(img); the kernels, kernels_flip, kernel_params are the kernel parameter for the line segment algorithm below 2. line segment detection [lines, fullLines] =lineSegmentation_HighRes(img,kernels, kernels_flip, kernel_params); the lines variable contains the detected line segmentations it arranged as [x1 y1 x2 y2 probability] The fullLines are the detected lines. It is arranged as [rho theta probability] please run the demo_start_v2.m for demonstration the code in Evaluation Code.zip are line evaluation algorithms run_create_contours_MCMLSD.m is the algorithm to get line segment statistics for MCMLSD, you can modify it to process other line segment detection algorithms run_eval_PR_4Methods.m and run_eval_PR.m process the statistical information from the run_create_contours_MCMLSD.m result and perform evaluations run_plot_PR.m and run_plot_PR4Methods.m plot the results in a graph ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/checkInParam.m ================================================ function [out] = checkInput(img1,g1_mag1,g1_dir1,g1_sc1,g2_mag1,g2_sc1,g2_all1,noise1,... EDGE_W1,subpixelflag1,maxscale1) load('input.mat'); out = 0; if ~isequal(img1, img) display('error img'); out = out + 1; end if ~isequal(g1_mag1, g1_mag) display('error g1_mag'); out = out + 1; end if ~isequal(g1_dir1, g1_dir) display('error g1_dir'); out = out + 1; end if ~isequal(g1_sc1, g1_sc) display('error g1_sc'); out = out + 1; end if ~isequal(g2_mag1, g2_mag) display('error g2_mag'); out = out + 1; end if ~isequal(g2_sc1, g2_sc) display('error g2_sc'); out = out + 1; end if ~isequal(g2_all1, g2_all) display('error g2_all'); out = out + 1; end if noise1 ~= noise display('error noise'); out = out + 1; end if EDGE_W1 ~= edgew display('error EDGE_W'); out = out + 1; end if subpixelflag1 ~= subpixelflag display('error subpixelflag'); out = out + 1; end if maxscale1 ~= scale display('error scale'); out = out + 1; end end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/checkOutParam.m ================================================ function [out] = checkOutParam(edge_map1,blur_map1,dark_map1,light_map1,... xzero1_map1,yzero1_map1,xzero2_map1,yzero2_map1) load('output.mat'); out = 0; if ~isequal(edge_map1, edge_map) display('error edge_map'); out = out + 1; end if ~isequal(blur_map1, blur_map) display('error blur_map'); out = out + 1; end if ~isequal(dark_map1, dark_map) display('error dark_map'); out = out + 1; end if ~isequal(light_map1, light_map) display('error light_map'); out = out + 1; end if ~isequal(xzero1_map1, xzero1_map) display('error xzero1_map'); out = out + 1; end if ~isequal(yzero1_map1, yzero1_map) display('error yzero1_map'); out = out + 1; end if ~isequal(xzero2_map1, xzero2_map) display('error xzero2_map'); out = out + 1; end if ~isequal(yzero2_map1, yzero2_map) display('error yzero2_map'); out = out + 1; end end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/check_save_requirements.m ================================================ function[sfilenames] = check_save_requirements(save_flags,outputdir,etype); name1 = ['edge',etype]; sfilenames = {name1,'blur.mat','dark.mat','light.mat',... 'g1mag.mat','g1dir.mat','g1scale.mat','g2mag.mat','g2scale.mat',... 'xzero1.mat','yzero1.mat','xzero2.mat','yzero2.mat'}; if any(save_flags) % Output directory does not exist: if ((exist(outputdir) ~= 7) & (length(outputdir) ~= 0)) mkdir(outputdir); % Create this directory mess1 = 'Requested output directory has been created.'; uiwait(msgbox(mess1,'Output Directory Creation','none','modal')); end; if (length(outputdir) == 0) outputdir = 'tmp_output'; opmessage = ['Output directory name not specified. ',... 'Files will be saved in directory "tmp_output".']; uiwait(msgbox(opmessage,'Output Directory Warning','warn','modal')); if (exist(outputdir) ~= 7) mkdir(outputdir); end; end; filestosave = sfilenames(find(save_flags)); x = dir(outputdir); xx = {x.name}'; commonfiles = intersect(filestosave,xx); if ~isempty(commonfiles) maxnumx = 0; for k = 1:1:length(xx) y = xx{k}; numx = 0; if (length(y)>4) if (y(end-4)=='x') numx = sum(y=='x'); end; end; if (numx > maxnumx) maxnumx = numx; end; end; assignin('base','maxnumx',maxnumx+1); assignin('base','commonfiles',commonfiles); % uiwait(outputdir_erase_info); % Call GUI % % changename_flag = evalin('base','changename_flag;'); % % if changename_flag % repx = repmat('x',1,maxnumx+1); % for k = 1:1:length(sfilenames) % s = sfilenames{k}; % s = [s(1:end-4),repx,s(end-3:end)]; % sfilenames{k} = s; % end; % end; evalin('base','clear changename_flag maxnumx commonfiles;'); end; end; for k = 1:1:length(sfilenames) s = sfilenames{k}; s = [outputdir,'/',s]; sfilenames{k} = s; end; return; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/convolve_2.m ================================================ %############################################################## % % [cimg] = convolve_2(mimg,filt,bc) % % Convolution of two matrices with the boundaries handled % depending on the value of the boundary condition variable. % - 0 for extension convolution % - 1 for no overlap convolution % %############################################################## function[cimg] = convolve_2(mimg,filt,bc) if (bc == 0) pad_img = pad_matrix(mimg,size(filt)); cimg = conv2(pad_img,filt,'same'); cimg = trim_matrix(cimg,size(filt)); else cimg = conv2(mimg,filt,'same'); if (size(filt,1) < size(filt,2)) k = floor(0.5*length(filt)); cimg(:,1:k) = 0; cimg(:,end-k+1:end) = 0; else k = floor(0.5*length(filt)); cimg(1:k,:) = 0; cimg(end-k+1:end,:) = 0; end; end; return; %######################## % Function to pad matrix: %######################## function[r] = pad_matrix(m,d) if (d(1) < d(2)) k = floor(0.5*d(2)); ad1 = repmat(m(:,1),1,k); ad2 = repmat(m(:,end),1,k); r = [ad1 m ad2]; else k = floor(0.5*d(1)); ad1 = repmat(m(1,:),k,1); ad2 = repmat(m(end,:),k,1); r = [ad1; m; ad2]; end; return; %######################### % Function to trim matrix: %######################### function[r] = trim_matrix(m,d) if (d(1) < d(2)) k = floor(0.5*d(2)); r = m(:,k+1:end-k); else k = floor(0.5*d(1)); r = m(k+1:end-k,:); end; return; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/d2gauss.m ================================================ %################################################################ % % d2gauss.m returns a 2-d Gaussian filter with kernal attributes: % size: n1*n2 % theta: CCW-angle tkernat filter rotated % sigma1: standard deviation of 1st gaussian % sigma2: standard deviation of 2nd gaussian % %################################################################ function[kern] = d2gauss(n1,std1,n2,std2,theta,max1); [I,J] = meshgrid(1:1:n2,1:1:n1); It = I - (n2+1)/2; Jt = J - (n1+1)/2; u1 = cos(theta)*Jt' - sin(theta)*It'; u2 = sin(theta)*Jt' + cos(theta)*It'; kern = gauss(u1,std1) .* gauss(u2,std2); %############################################ % Normalise the kernal and confine to limits: %############################################ kern = kern / sqrt(sum(sum(kern.*kern))); max2 = max(max(kern)); kern = kern / (max2/max1); return; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/derivative2nd.m ================================================ %############################################################ % % derivative2nd(g1dir,maxscale,noise,gauss_a,conv_type,fpath) % %############################################################ function[g2mag,g2sc,g2all] = derivative2nd(g1dir,maxscale,noise,... gauss_a,conv_type); fm2 = '.ascii'; %############ % Initialise: %############ g2mag = 0; g2sc = 0; nrows = size(g1dir,1); g2all = zeros(maxscale*nrows,size(g1dir,2)); for scale = 1:1:maxscale %############################# % Set scale value for filters: %############################# if (scale == 1) g2scaleval = '05'; else g2scaleval = '1'; end; mimg = gauss_a(:,:,scale); %kern1 = load(strcat(fpath,filesep,'gx',g2scaleval,fm2)); kern1 = load(strcat('gx',g2scaleval,fm2)); rc1 = convolve_2(mimg,kern1,conv_type); %kern2 = load(strcat(fpath,filesep,'g2y',g2scaleval,fm2)); kern2 = load(strcat('g2y',g2scaleval,fm2)); rc2 = convolve_2(rc1,kern2,conv_type); %kern3 = load(strcat(fpath,filesep,'gy',g2scaleval,fm2)); kern3 = load(strcat('gy',g2scaleval,fm2)); rc3 = convolve_2(mimg,kern3,conv_type); %kern4 = load(strcat(fpath,filesep,'g2x',g2scaleval,fm2)); kern4 = load(strcat('g2x',g2scaleval,fm2)); rc4 = convolve_2(rc3,kern4,conv_type); %kern5 = load(strcat(fpath,filesep,'g1x',g2scaleval,fm2)); kern5 = load(strcat('g1x',g2scaleval,fm2)); rc5 = convolve_2(mimg,kern5,conv_type); %kern6 = load(strcat(fpath,filesep,'g1y',g2scaleval,fm2)); kern6 = load(strcat('g1y',g2scaleval,fm2)); rc6 = convolve_2(rc5,kern6,conv_type); %####################################### % Calculate the 2nd Gaussian derivative: %####################################### g2 = g2steer(rc4,rc2,rc6,g1dir); g2all((scale-1)*nrows+1:scale*nrows,:) = g2; % For subpixel loc'n. %############################################################## % Augment multi-scale Gaussian directional 2nd derivative maps: %############################################################## [g2mag,g2sc] = g2scale(g2mag,g2,g2sc,scale,noise,0); end; return; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/elderEdge.m ================================================ function [edgeStruct] = elderEdge() %Run local scale control edge detector on image (Elder & Zucker, 1998) noise = 1; %estimated SD of pixel noise imagefile='P1020177.jpg'; %name of image file. Most formats are handled. May be RGB or grayscale. maxscale=5; %maximum scale, must be positive integer. Scales increase exponentially from 0.5 to 2^{maxscale-2}. edgew=10; %maximum edge blur (distance in pixels between extrema in the 2nd derivative) conss=1; %boundary condition for scalespace computation. 0 for extension, 1 for no overlap congrd=0; %boundary condition for derivative computation. 0 for extension, 1 for no overlap subpixelflag=0; %generate subpixel-localized edges %run edge detection edgeStruct = main_edge(imagefile,maxscale,noise,edgew,conss,congrd,subpixelflag); ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/elderEdge.m~ ================================================ function elderEdge() %Run local scale control edge detector on image (Elder & Zucker, 1998) noise = 1; %estimated SD of pixel noise imagefile='img.jpg'; %name of image file maxscale=5; %maximum scale, must be positive integer. Scales increase exponentially from 0.5 to 2^{maxscale-2}. edgew=10; %maximum edge blur (distance in pixels between extrema in the 2nd derivative) conss=1; %boundary condition for scalespace computation. 0 for extension, 1 for no overlap congrd=0; %boundary condition for derivative computation. 0 for extension, 1 for no overlap save_v = zeros(0,11); %results to save view_v = zeros(0,11); %results to view save_v(1) = 1; %edge map save_v(2) = 1; %blur map save_v(3) = 1; %dark map save_v(4) = 1; %light map save_v(5) = 0; %gradient magnitude map save_v(6) = 1; %gradient direction map save_v(7) = 0; %gradient scale map save_v(8) = 0; %2nd derivative map save_v(9) = 0; %2nd derivativ scale map save_v(10) = 0; %X zero crossing offset save_v(11) = 0;%Y zero crossing offset view_v(1) = 0; %edge map view_v(2) = 0; %blur map view_v(3) = 0; %dark map view_v(4) = 0; %light map view_v(5) = 0; %gradient magnitude map view_v(6) = 0; %gradient direction map view_v(7) = 0; %gradient scale map view_v(8) = 0; %2nd derivative map view_v(9) = 0; %2nd derivativ scale map view_v(10) = 0; %X zero crossing offset view_v(11) = 0;%Y zero crossing offset %change this path to your own local directory for the filters filtpath='~/Dropbox/code/elderlab/edge/mar03/filters'; edgetype='.jpg'; %format for output edge map (.mat also allowed) edgelplotflag=0; %show edges on image imgplotflag=0; %view original image outputdir=pwd; sfilenames = check_save_requirements(view_v,outputdir,edgetype); subpixelflag=0; outputdata=main_edge(imagefile,maxscale,noise,edgew,... conss,congrd,view_v,view_v,filtpath,... edgetype,edgelplotflag,imgplotflag,sfilenames,... subpixelflag); reblur=uint8(imreconandblur(1,3)); img=imread(imagefile); if size(img,3)==3 img=rgb2gray(img); end imwrite(img,strcat(resultdir,'img.jpg')); imwrite(outputdata.edge_map,strcat(resultdir,'edge.jpg')); imwrite(reblur,strcat(resultdir,'recon.jpg')); ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/find_edges.c ================================================ /************************************************************************************************ * * Routine Name: lvedge - Detect luminance edges by selecting triads of significant * 2nd derivatives of opposite sign flanking a significant 1st derivative of consistent direction. * * Purpose: vgtriad * Detect luminance edges by selecting triads of significant * 2nd derivatives of opposite sign flanking a directional * maximum in the 1st derivative of consistent direction. * * Pixels with maximal gradient magnitude in the gradient * direction are considered as candidate edge pixels. The image * is scanned along the gradient line for pixels with significant * 2nd derivative of opposite sign, consistent with the edge * hypothesis. Scanning is terminated if the line intersects a * pixel with inconsistent or unreliable gradient direction, or * inconsistent 2nd derivative sign if a pixel of consistent sign * has already been detected. Otherwise, the scan selects the * line segment connecting the edge pixel with the maximum 2nd * derivative pixels. The local blur width of the blurred * edge is derived as well. The width is derived from the * distance between G2 terminators of opposite sign, based on an * assumption of Gaussian blur. * * Input: img - Original byte image * g1mag - Multi-scale gradient magnitude map * g1dir - Multi-Scale Gradient direction map * g1scale - Gradient scale map * g2 - Multi-Scale 2nd Derivative Map * g2scale - G2 Scale Map * noise - Estimated sensor noise * maxwidth - Maximum edge width detected * Output: gewidth - Estimate of blur scale based on edgewidth. * Type is VFF_TYP_FLOAT. * dark - Estimate of luminance on dark side of edge. * Type is VFF_TYP_1_BYTE. * light - Estimate of luminance on light side of edge * Returns: TRUE (1) on success, FALSE (0) on failure * Restrictions: Restricted to real, single-band images. * Does not work on explicit location data. * Written By: James Elder * Date: Oct 13, 1997 * Verified: * Side Effects: * Examples: * Modifications: ****************************************************************/ #define char16_t uint16_T /*JE Sept 2014. Needed for MATLAB 2012a under OSX19.0 and Xcode 5.1 */ #include "mex.h" #include /* NULL */ #include #include #define notDblMtx(it) (mxIsComplex(it)) double g2max1, /* Max G2 response of correct sign */ g2max2, /* Max G2 response of incorrect sign */ g2maxscale, /* Scale of max G2 response of correct sign */ xfirst, yfirst, zfirst, /* Endpoints for interpolation */ /* Sensor noise threshold */ k_thresh, /* Min. contrib. to linear interp. for pixel to be labeled */ pixerr[6] = {9.5,8,3.5,0.25,0.04,0.0}, /* Half-range of gradient direction */ /* uncertainty due to pixelation */ /* as function of G1 scale. */ g2thresh = 0.0000596, /* Min on sig. g2 value for interpolation */ edgewidth, /* Estimated width of edge */ xend, yend; /* Estimated gradient ray termination coordinates */ int g1len_to_max,maxg1len, /* Current and max number of G1 pixels supporting edge assertion */ g1max, /* Is current pixel directional max of gradient? */ g2len, /* Number of G2 pixels supporting edge */ rows, cols, /* Columns in image */ g1offsets[1024], /* Offsets to G1 pixels in current path */ g2offsets[4], /* Offsets to G2 pixels in current path */ edgescale = 0, /* Max scale of G1 or G2 response in path */ acuity_problem, /* Flag to indicate 1-pixel acuity will not be obtained */ zcross, /* Flag to indicate zero-crossing found */ keepoff1,keepoff2; /* Offsets to pixels from which 2nd derivative calculated */ double G2fact1, G2fact2; /* Factor in recalculation of G2val: "ki * pow(cos(ddiri),2)" */ int Xx1,Xx2,Yy1,Yy2; /* Offsets returned from g2_path for subpixel method 2 */ double KPI = 3.141593; double noise; /* Sensor noise threshold */ FILE *f; /* Internal functions */ int round_int(double rd); int g2_path(double theta,int bx,int by,double *g1mag,double *g1dir,double *g1scale, double *g2,double *g2scale,int g2sign); int compare_dir(double g1mag1,double g1dir1,int g1scale1,double g1mag2,double g1dir2,int g1scale2); int sign(double r); int find_edges(double *img,double *g1mag,double *g1dir,double *g1scale,double *g2, double *g2scale,double *g2all,double sensor_noise,int maxwidth,int sublocflag,int maxscale, double *xout,double *xout_blur, double *xout_dark,double *xout_light,double *xout_x1zero,double *xout_y1zero, double *xout_x2zero,double *xout_y2zero) { double theta; /* Either in gradient direction or against gradient direction */ int x,y,i; /* Image dimensions and indices */ double *g1magd,*g1dird,*g2d; /* Input G1 and G2 map data */ double *imgd; double g2maxp,g2maxn; /* Used to detect false edge pixels */ double g2scalep,g2scalen; /* Scale of max pos and min neg G2 responses */ double blurvar; double nxend,nyend,pxend,pyend; /* Estimated gradient line terminations */ double nwidth,pwidth; /*distance from current pixel to g2 extrema */ double erf_const,C,D,L,meanl; double l,d; double nxfirst, nyfirst, pxfirst, pyfirst, pzfirst, nzfirst, xinter, yinter; int g2sc1, g2sc2, g2sc3, g2sc4, off_side1, off_side2, off_side3, off_side4; int gind; double G2factor1, G2factor2, G2factor3, G2factor4; int X1,X2,X3,X4,Y1,Y2,Y3,Y4,match_flag; int newoff1,newoff2,newoff3,newoff4; double new_nz,new_pz,bestsnr,bestnz,bestpz; static double g2norms[6] = {1.873,0.2443,0.0306,0.003817,0.00047715,0.0000596}; /* Thresholds */ int count=0; g1magd = g1mag; g1dird = g1dir; g2d = g2; imgd = img; noise = sensor_noise; g2thresh = 5.2*g2thresh*noise; /* threshold on interpolated g2 values */ maxg1len = maxwidth*2; /* Up to 2 pixels per step */ k_thresh = 0.1; /* Min coeff. in linear interp. to include pixel in edge */ erf_const = 0.68268949213709; for (i=0;i<5;i++) /* Convert pixelation uncertainty from deg. to radians */ pixerr[i] = pixerr[i] * KPI / 180.0; /**** Order (x,y) reversed from cantata code ****/ for (x=0;x 0.0 && *g2d >= 0.0) /* Non-negative 2nd derivative */ { acuity_problem = 0; g2max1 = 0; g2max2 = 0.0; g2maxscale = 0.0; g1len_to_max = 0; g2len = 0; zcross = 0; edgewidth = 0.0; xfirst = 0.0; yfirst = 0.0; zfirst = 0.0; keepoff1 = 0; keepoff2 = 0; G2fact1 = 0; G2fact2 = 0; /* Find g2_path, last parameter '1' makes g2_path selective for negative G2 responses */ g2_path(theta,x,y,g1magd,g1dird,g1scale+count,g2d,g2scale+count,1); if (g2max1 != 0.0 && g1max) /* Gradient max and found significant negative G2 response */ { nxfirst = xfirst; nyfirst = yfirst; nzfirst = -zfirst; off_side1 = keepoff1; off_side2 = keepoff2; G2factor1 = G2fact1; G2factor2 = G2fact2; X1 = Xx1; X2 = Xx2; Y1 = Yy1; Y2 = Yy2; nxend = xend; /* Save estimated edge ray termination */ nyend = yend; nwidth = sqrt(pow(nxend,2) + pow(nyend,2)); g2maxn = g2max1; /* Save min negative G2 response */ g2maxp = g2max2; /* Save max positive G2 response */ g2scalen = g2maxscale; /* Save scale of min negative G2 response */ g2max1 = 0.0; g2max2 = 0.0; g2maxscale = 0.0; if (theta > 0) /* Now scan opposite to gradient direction */ theta = theta - KPI; else theta = theta + KPI; xfirst = 0.0; yfirst = 0.0; zfirst = 0.0; keepoff1 = 0; keepoff2 = 0; G2fact1 = 0; G2fact2 = 0; /* Find g2_path, last parameter '0' makes g2_path selective for positive G2 responses */ g2_path(theta,x,y,g1magd,g1dird,g1scale+count,g2d,g2scale+count,0); pxend = xend; /* Save estimated edge ray termination */ pyend = yend; pwidth = sqrt(pow(pxend,2) + pow(pyend,2)); if ((g2max1>g2maxp) && (g2max2>g2maxn) && g1max) { pxfirst = xfirst; pyfirst = yfirst; pzfirst = zfirst; off_side3 = keepoff1; off_side4 = keepoff2; G2factor3 = G2fact1; G2factor4 = G2fact2; X3 = Xx1; X4 = Xx2; Y3 = Yy1; Y4 = Yy2; if ((!acuity_problem && zcross) || (acuity_problem && fabs(pwidth-nwidth) 0.0) *(xout_blur+count) = sqrt(blurvar); else *(xout_blur+count) = 0.1; l = *(imgd+round_int(nxend)*rows+round_int(nyend)); d = *(imgd+round_int(pxend)*rows+round_int(pyend)); if (l<=d) { meanl = round_int(0.5*(l+d)); *(xout_dark+count) = meanl; *(xout_light+count) = meanl; } else if (blurvar < 1) { *(xout_dark+count) = round_int(d); *(xout_light+count) = round_int(l); } else { C = (l - d) / erf_const; D = d - 0.5 * C * (1 - erf_const); L = C + D; if (D<0) *(xout_dark+count) = 0; else if (D> 255) *(xout_dark+count) = 255.0; else *(xout_dark+count) = round_int(D); if (L<0) *(xout_light+count)= 0; else if (L> 255) *(xout_light+count) = 255.0; else *(xout_light+count) = round_int(L); } if (sublocflag) { /* METHOD 1: Interpolate to find better estimate of zero-crossing. Store resultant x and y in *xout_xzero and *xout_yzero. */ xinter = (nzfirst * (pxfirst+x+1) + pzfirst * (nxfirst+x+1)) / (nzfirst + pzfirst); yinter = (nzfirst * (pyfirst+y+1) + pzfirst * (nyfirst+y+1)) / (nzfirst + pzfirst); /* Update in xout_x1zero and xout_y1zero matrices */ xinter = (xinter > cols) ? cols : xinter; *(xout_x1zero+count) = (xinter < 0) ? 0 : xinter; yinter = (yinter > rows) ? rows : yinter; *(xout_y1zero+count) = (yinter < 0) ? 0 : yinter; /* METHOD 2: Interpolate as with Method 1, except that scale at the 4 flanking pixels must match. */ g2sc1 = (int)*(g2scale+count+off_side1); g2sc2 = (int)*(g2scale+count+off_side2); g2sc3 = (int)*(g2scale+count+off_side3); g2sc4 = (int)*(g2scale+count+off_side4); if ((g2sc1==g2sc2) && (g2sc1==g2sc3) && (g2sc1==g2sc4)) /* Scales match */ { *(xout_x2zero+count) = *(xout_x1zero+count); *(xout_y2zero+count) = *(xout_y1zero+count); } else /* Scales do not match */ { match_flag = 0; gind = 1; /* g2 scale index */ bestsnr = 0; while (!match_flag && (gind<=maxscale)) { newoff1 = (x+X1) * rows * maxscale + (y+Y1) + rows * (gind-1); newoff2 = (x+X2) * rows * maxscale + (y+Y2) + rows * (gind-1); newoff3 = (x+X3) * rows * maxscale + (y+Y3) + rows * (gind-1); newoff4 = (x+X4) * rows * maxscale + (y+Y4) + rows * (gind-1); new_nz = -G2factor1 * (*(g2all+newoff1)) - G2factor2 * (*(g2all+newoff2)); new_pz = G2factor3 * (*(g2all+newoff3)) + G2factor4 * (*(g2all+newoff4)); /* If there is no scale for which all 4 are significant, will need to * choose the one with the best SNR, therefore store it. */ if ((new_nz+new_pz)>bestsnr) { bestsnr = new_nz + new_pz; bestnz = new_nz; bestpz = new_pz; } /* If new estimates exceed the threshold, have found answer */ if ((new_nz > 5.2*noise*g2norms[gind-1]) && (new_pz > 5.2*noise*g2norms[gind-1])) { xinter = (new_nz * (pxfirst+x+1) + new_pz * (nxfirst+x+1)) / (new_nz + new_pz); yinter = (new_nz * (pyfirst+y+1) + new_pz * (nyfirst+y+1)) / (new_nz + new_pz); match_flag = 1; } gind++; } /* Use scale with best SNR if none match */ if (!match_flag) { xinter = (bestnz * (pxfirst+x+1) + bestpz * (nxfirst+x+1)) / bestsnr; yinter = (bestnz * (pyfirst+y+1) + bestpz * (nyfirst+y+1)) / bestsnr; } /* Update in xout_x2zero and xout_y2zero matrices */ xinter = (xinter > cols) ? cols : xinter; *(xout_x2zero+count) = (xinter < 0) ? 0 : xinter; yinter = (yinter > rows) ? rows : yinter; *(xout_y2zero+count) = (yinter < 0) ? 0 : yinter; } } } } } } count++; } return(1); } /****************************************************************/ int round_int(double rd) { double t1, t2; int xf, xc; xf = (int)floor(rd); xc = (int)ceil(rd); t1 = fabs(rd-xf); t2 = fabs(rd-xc); if (t1 >= t2) return(xc); else return(xf); } /*****************************************************************/ /* g2_path */ int g2_path(double theta,int bx,int by,double *g1mag,double *g1dir,double *g1scale, double *g2,double *g2scale,int g2signbit) { int x1, y1, x2, y2, dx, dy; int off1=0; int off2=0; /* Offsets and indices for linear interp. */ int end_of_path; /* Flag signalling when max (min) found or continuity broken */ int same_dir1, same_dir2; /* Flags indicating gradient direction compatibility */ int g1len, g2halflen; /* Num of G2 pixels terminating current ray */ double tan_theta, x, y; /* Real coords of points on path */ double g1magval, g1dirval; /* Gradient at centre pixel */ double g1mag1, g1dir1, g1mag2, g1dir2; /* Gradients at pixel pair on path */ double k1, k2; /* Linear interp. coefficients */ double g1val, g2val; /* Interpolated G1 and G2 responses on path */ int g1scaleval; /* Scale of gradient at centre pixel */ int g1scale1, g1scale2, g2scale1, g2scale2; /* Scales of pixels on path */ double ddir1, ddir2; /* gradient dir differences along grad line. */ double g1_prev_val, acuity, length; int found_interp_flag=0; /*#########################################*/ /* Select the 1st 2 pixels flanking the ray from 0 in the theta direction. */ /*#########################################*/ if (theta > 0) dy = -1; else dy = 1; if (fabs(theta) < KPI*0.5) dx = 1; else dx = -1; x1 = dx; y1 = 0; x2 = 0; y2 = dy; tan_theta = tan(theta); /* If theta < 45deg -> (x2,y2) = (dx,dy), else (x1,y1) = (dx,dy) */ if (fabs(tan_theta) < 1) x2 = dx; else y1 = dy; /* End of block */ /*##############*/ acuity = 20.0; g2max2 = 0.0; g1magval = (float)*g1mag; g1dirval = (float)*g1dir; g1scaleval = (int)*g1scale; g2val = (float)*g2; g1_prev_val = g1magval; if (g2val != 0.0 && sign(g2val) == g2signbit) /* sig. G2 of right sign */ { g2maxscale = (float) *g2scale; g2max1 = g2val; g2offsets[g2len++] = 0; g2halflen = 1; if (!found_interp_flag) { G2fact1 = 1; G2fact2 = 0; Xx1 = 0; Xx2 = 0; Yy1 = 0; Yy2 = 0; zfirst = g2max1; xfirst = 0; yfirst = 0; keepoff1 = off1; keepoff2 = off2; found_interp_flag = 1; } } else /* Initialize G2 variables */ { g2max1 = 0.0; g2maxscale = 0.0; g2halflen = 0; } end_of_path = 0; xend = yend = 0.0; g1len = g1len_to_max; g1max = 1; /*##################################### Scan for G2 max of the correct sign, until length limit or interrupted #####################################*/ while (!end_of_path && g1len < maxg1len) { if ((g2val==0.0) && (g2max1 == 0)) acuity_problem = 1; /* Check if flanking pixels go out of range of image */ if ((bx+x1<0) || (bx+x1>=cols) || (bx+x2<0) || (bx+x2>=cols) || (by+y1<0) || (by+y1>=rows) || (by+y2<0) || (by+y2>=rows)) end_of_path = 1; else { /* Derive linear interpolation coefficients */ if (x1 == x2) { y = -x1 * tan_theta; k1 = fabs(y-y2); k2 = fabs(y-y1); } else { x = -y1 / tan_theta; k1 = fabs(x-x2); k2 = fabs(x-x1); } /*########################################################*/ /* Get G1 and G2 information for the two pixels on path */ /*########################################################*/ /**** cols and rows changed from cantata code here as Matlab processes columnwise ****/ off1 = x1 * rows + y1; off2 = x2 * rows + y2; x = k1 * x1 + k2 * x2; y = k1 * y1 + k2 * y2; length = sqrt(x*x + y*y); g1dir1 = *(g1dir+off1); g1dir2 = *(g1dir+off2); g1mag1 = *(g1mag+off1); g1mag2 = *(g1mag+off2); g1scale1 = (int)*(g1scale+off1); g1scale2 = (int)*(g1scale+off2); g2scale1 = (int)*(g2scale+off1); g2scale2 = (int)*(g2scale+off2); /* Interpolate the G1 estimate */ g1val = k1 * g1mag1 + k2 * g1mag2; if (g1val > g1magval) g1max = 1; /* Pixel 1 compatible? */ same_dir1 = compare_dir(g1magval,g1dirval,(int)g1scaleval,g1mag1,g1dir1,(int)g1scale1); /* Pixel 2 compatible? */ same_dir2 = compare_dir(g1magval,g1dirval,(int)g1scaleval,g1mag2,g1dir2,(int)g1scale2); ddir1 = fabs(g1dir1-g1dirval); ddir2 = fabs(g1dir2-g1dirval); /* Interpolate the G2 estimate */ g2val = k1 * pow(cos(ddir1),2) * (*(g2+off1)) + k2 * pow(cos(ddir2),2) * (*(g2+off2)); if ((g1len==0) && (g2val<0.0)) zcross = 1; if ((!(g2max1==0.0 && fabs(g2val)>g2thresh && sign(g2val) == g2signbit) && !((same_dir1 && k1>k_thresh) || (same_dir2 && k2>k_thresh))) || (fabs(g2val) > g2thresh && (sign(g2val) != g2signbit) && zcross) || ((fabs(g2val) < g2thresh) && (length > acuity))) { end_of_path = 1; } else if ((sign(g2val) == g2signbit) && (fabs(g2val) > fabs(g2max1))) { g2max1 = g2val; /* Derive scale of G2 response */ if (g2scale1 == 0) g2maxscale = (float) g2scale2; else if (g2scale2 == 0) g2maxscale = (float) g2scale1; else g2maxscale = k1 * g2scale1 + k2 * g2scale2; g1len_to_max = g1len; /* Update g1 index */ g2len -= g2halflen; /* Erase previous G2 terminators */ g2halflen = 0; if (k1 > k_thresh) /* If path lies near this pixel, label as G2 */ { g2offsets[g2len++] = off1; g2halflen++; } if (k2 > k_thresh) { g2offsets[g2len++] = off2; g2halflen++; } xend = k1 * x1 + k2 * x2; /* Real coordinates of G2 terminator */ yend = k1 * y1 + k2 * y2; if (!found_interp_flag) { G2fact1 = k1 * pow(cos(ddir1),2); G2fact2 = k2 * pow(cos(ddir2),2); Xx1 = x1; Xx2 = x2; Yy1 = y1; Yy2 = y2; zfirst = g2max1; xfirst = xend; yfirst = yend; keepoff1 = off1; keepoff2 = off2; found_interp_flag = 1; } } else if (((sign(g2val) != g2signbit) || g2val == 0.0) && g2max1 != 0.0) { end_of_path = 1; } else if ((sign(g2val) != g2signbit) && (fabs(g2val) > fabs(g2max2))) { g2max2 = g2val; /* Largest sig. G2 response of incorrect sign */ } g1_prev_val = g1val; } if (!end_of_path) { if (same_dir1) /* 1st pixel in pair is compatible */ { g1offsets[g1len++] = off1; /* Label as interior pixel */ if (g1scale1 > edgescale) /* Update scale to max */ edgescale = g1scale1; } if (same_dir2) /* 2nd pixel in pair is compatible */ { g1offsets[g1len++] = off2; /* Label as interior pixel */ if (g1scale2 > edgescale) /* Update scale to max */ edgescale = g1scale1; /**** Is this meant to be g1scale1 or g1scale2? ****/ } /* Step to next intersection of ray with pixel grid */ if (x1 == x2) { x1 += dx; if (abs(y2) < fabs(x1*tan_theta)) y1+= dy; else x2+= dx; } else { y2 += dy; if (abs(y2) > fabs(x1*tan_theta)) x2+= dx; else y1+= dy; } } } if (g2maxscale > edgescale) /* Update edgescale to max of G1 and G2 scales */ edgescale = (int) g2maxscale; edgewidth += sqrt(xend*xend + yend*yend); /* Add distance from 0 to terminator */ return (1); } /******************************************************************************/ /* compare_dir */ int compare_dir(double g1mag1,double g1dir1,int g1scale1,double g1mag2,double g1dir2,int g1scale2) { double a1, a2; /* Pixelation uncertainty at respective scales */ double ddir, tolerance; /* actual and tolerated gradient direction discrepancy */ static double g1noise_norms[6] = {0.765,0.199,0.0499,0.0125,0.00312,0.00078}; if (g1dir2 == 4) /* Gradient not significant */ return(0); a1 = pixerr[g1scale1-1]; a2 = pixerr[g1scale2-1]; ddir = fabs(g1dir1 - g1dir2); if (ddir > KPI) ddir = 2*KPI - ddir; /* tolerance is sum of half-ranges due to pixelation uncertainty plus the range due to sensor noise */ tolerance = a1 + a2 + 5.2 * noise * sqrt(pow(g1noise_norms[g1scale1-1]/g1mag1,2.0) + pow(g1noise_norms[g1scale2-1]/g1mag2,2.0)); if (ddir <= tolerance) return(1); return(0); } /***************************************************************************/ /* signbit */ int sign(double r) { if (r<0) return (1); else return (0); } /******************************************************************************/ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { double *img; double *g1mag; double *g1dir; double *g1scale; double *g2; double *g2scale; double *g2all; int x_dim, y_dim; double sensor_noise; int maxwidth, maxscale; int sublocflag; double dmwidth,mxscale; double subflag; double *x; double *x_blur; double *x_dark; double *x_light; double *x_x1zero; double *x_y1zero; double *x_x2zero; double *x_y2zero; int warnings = 1; mxArray *arg; double *mxMat; /* copy start */ if (nrhs < 11 ) mexErrMsgTxt("requres at least 11 args."); /* ARG 1: IMAGE */ arg = prhs[0]; if notDblMtx(arg) mexErrMsgTxt("IMAGE arg must be a real non-sparse matrix."); img = mxGetPr(arg); x_dim = (int) mxGetM(arg); /* X is inner index! */ y_dim = (int) mxGetN(arg); rows = x_dim; cols = y_dim; /* ARG 2: g1mag */ arg = prhs[1]; if notDblMtx(arg) mexErrMsgTxt("g1mag arg must be a real non-sparse matrix."); g1mag = mxGetPr(arg); /* ARG 3: g1dir */ arg = prhs[2]; if notDblMtx(arg) mexErrMsgTxt("g1dir arg must be a real matrix"); g1dir = mxGetPr(arg); /* ARG 4: g1scale */ arg = prhs[3]; if (notDblMtx(arg)) mexErrMsgTxt(" g1scale arg must be a int matrix"); g1scale = mxGetPr(arg); /* ARG 5: g2 */ arg = prhs[4]; if notDblMtx(arg) mexErrMsgTxt("g2 arg must be a real matrix"); g2 = mxGetPr(arg); /* ARG 6: g2scale */ arg = prhs[5]; if (notDblMtx(arg)) mexErrMsgTxt("g2scale arg must be a int matrix"); g2scale = mxGetPr(arg); /* ARG 7: g2all */ arg = prhs[6]; if (notDblMtx(arg)) mexErrMsgTxt("g2all arg must be a int matrix"); g2all = mxGetPr(arg); /* ARG 8: sensor_noise */ arg = prhs[7]; if notDblMtx(arg) mexErrMsgTxt("sensor_noise arg must be a real matrix"); if (mxGetM(arg)*mxGetN(arg) != 1) mexErrMsgTxt("sensor_noise arg must be a scalar"); mxMat = mxGetPr(arg); sensor_noise = *mxMat; /* ARG 9: maxwidth */ arg = prhs[8]; if (notDblMtx(arg)) mexErrMsgTxt("maxwidth arg must be a int matrix"); if (mxGetM(arg)*mxGetN(arg) != 1) mexErrMsgTxt("maxwidth arg must be a scalar"); mxMat = mxGetPr(arg); dmwidth = *mxMat; /* ARG 10: subpixel */ arg = prhs[9]; if (notDblMtx(arg)) mexErrMsgTxt("subpixelflag arg must be a int matrix"); if (mxGetM(arg)*mxGetN(arg) != 1) mexErrMsgTxt("subpixelflag arg must be a scalar"); mxMat = mxGetPr(arg); subflag = *mxMat; /* ARG 11: maxscale */ arg = prhs[10]; if (notDblMtx(arg)) mexErrMsgTxt("maxscale arg must be a int matrix"); if (mxGetM(arg)*mxGetN(arg) != 1) mexErrMsgTxt("maxscale arg must be a scalar"); mxMat = mxGetPr(arg); mxscale = *mxMat; /* ARG 6: WARNINGS */ if (nrhs>11) { arg = prhs[4]; if notDblMtx(arg) mexErrMsgTxt("WARINGS arg must be a real scalar."); if (mxGetM(arg) * mxGetN(arg) != 1) mexErrMsgTxt("WARNINGS arg must be a real scalar."); mxMat = mxGetPr(arg); warnings = (int) *mxMat; } plhs[0] = mxCreateDoubleMatrix(x_dim,y_dim,mxREAL); if (plhs[0] == NULL) mexErrMsgTxt("Cannot allocate result matrix"); x = mxGetPr(plhs[0]); plhs[1] = mxCreateDoubleMatrix(x_dim,y_dim,mxREAL); if (plhs[1] == NULL) mexErrMsgTxt("Cannot allocate result matrix"); x_blur = mxGetPr(plhs[1]); plhs[2] = mxCreateDoubleMatrix(x_dim,y_dim,mxREAL); if (plhs[2] == NULL) mexErrMsgTxt("Cannot allocate result matrix"); x_dark = mxGetPr(plhs[2]); plhs[3] = mxCreateDoubleMatrix(x_dim,y_dim,mxREAL); if (plhs[3] == NULL) mexErrMsgTxt("Cannot allocate result matrix"); x_light = mxGetPr(plhs[3]); plhs[4] = mxCreateDoubleMatrix(x_dim,y_dim,mxREAL); if (plhs[4] == NULL) mexErrMsgTxt("Cannot allocate result matrix"); x_x1zero = mxGetPr(plhs[4]); plhs[5] = mxCreateDoubleMatrix(x_dim,y_dim,mxREAL); if (plhs[5] == NULL) mexErrMsgTxt("Cannot allocate result matrix"); x_y1zero = mxGetPr(plhs[5]); plhs[6] = mxCreateDoubleMatrix(x_dim,y_dim,mxREAL); if (plhs[6] == NULL) mexErrMsgTxt("Cannot allocate result matrix"); x_x2zero = mxGetPr(plhs[6]); plhs[7] = mxCreateDoubleMatrix(x_dim,y_dim,mxREAL); if (plhs[7] == NULL) mexErrMsgTxt("Cannot allocate result matrix"); x_y2zero = mxGetPr(plhs[7]); /* copy ends */ maxwidth = (int)dmwidth; maxscale = (int)mxscale; sublocflag = (int)subflag; find_edges(img,g1mag,g1dir,g1scale,g2,g2scale,g2all,sensor_noise,maxwidth,sublocflag, maxscale,x,x_blur,x_dark,x_light,x_x1zero,x_y1zero,x_x2zero,x_y2zero); } ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/g1scale.m ================================================ %########################################################################### % % g1scale(g1mag1,g1dir1,g1mag2,g1dir2,g1scale1,scale,noise,b_est) % % Purpose: Augments multi-scale Gaussian Gradient maps with significant % estimates at a new scale. Pixels for which the magnitude % of the Gaussian gradient is under threshold in the multi-scale % map (gradient magnitude input 1) but over threshold % at the new scale (gradient magnitude input 2) are updated % with the gradient magnitude, direction and scale value of % the new scale. % % Input: g1mag1 - Multi-scale Gaussian gradient magnitude image % g1dir1 - Multi-scale Gaussian gradient direction image % g1mag2 - Gaussian gradient magnitude image at new scale % g1dir2 - Gaussian gradient direction image at new scale % g1scale1 - Multi-scale scale map % g1scale2 - Scale of new gradient estimates % noise - Estimated sensor noise % b_est - Derivatives near boundary estimated by reflecting % intensity function. % Output: g1mag1 - Integrated multi-scale gradient magnitude map % g1dir1 - Integrated multi-scale gradient direction map % g1scale1 - Integrated multi-scale scale map % %########################################################################### function[g1mag1,g1dir1,g1sc1] = g1scale(g1mag1,g1dir1,g1mag2,g1dir2,g1sc1,... scale,noise,b_est) norms12 = [0.765, 0.199, 0.0499, 0.0125, 0.00312, 0.00078]; thresh = 5.6 * noise * norms12(scale); if ((scale<3) | b_est) krad = 1; else krad = ceil(4.6*sqrt(pow2(2*(scale-2))-1)); end if (scale == 1) g1mag1 = zeros(size(g1mag2)); g1dir1 = 4 * ones(size(g1mag2)); g1sc1 = zeros(size(g1mag2)); f = find(g1mag2 >= thresh); g1mag1(f) = g1mag2(f); g1dir1(f) = g1dir2(f); g1sc1(f) = scale; else sz = size(g1mag2); [i,j] = meshgrid(krad+1:1:sz(1)-krad,krad+1:1:sz(2)-krad); itrans = i'; jtrans = j'; if ~(isempty(itrans) | isempty(jtrans)) K = sub2ind(size(g1mag2),itrans(:),jtrans(:)); smat = g1sc1(krad+1:end-krad,krad+1:end-krad); mmat = g1mag2(krad+1:end-krad,krad+1:end-krad); f = find((smat==0) & (mmat>=thresh)); g1mag1(K(f)) = g1mag2(K(f)); g1dir1(K(f)) = g1dir2(K(f)); g1sc1(K(f)) = scale; end; end; return; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/g1steer.m ================================================ %###################################################################### % % g1steer - Computes magnitude and direction of the gradient of the % luminance function based on x and y basis functions for 1st Gaussian % derivative. % % % Input: g1x - X basis for Gaussian gradient % g1y - Y basis for Gaussian gradient % Output: g1mag - Gradient Magnitude Estimate % g1dir - Gradient Direction Estimate % %###################################################################### function[g1mag,g1dir] = g1steer(g1x,g1y) g1mag = zeros(size(g1x)); g1dir = 4 * ones(size(g1x)); f = find((g1x ~= 0) & (g1y ~= 0)); g1dir(f) = atan2(-g1y(f),g1x(f)); g1mag(f) = sqrt(g1y(f).^2 + g1x(f).^2); return; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/g2scale.m ================================================ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % g2scale - Augments multi-scale Gaussian directional 2nd derivative maps % with significant estimates at a new scale. Pixels for which the magnitude % of the 2nd derivative is under threshold in the multi-scale map % (2nd derivative input 1) but over threshold at the new scale (2nd derivative % input 2) are updated with the 2nd derivative magnitude and scale value of the % new scale. % % Input: g2mag1 - Multi-scale Gaussian directional 2nd derivative image % g2mag2 - Gaussian directional 2nd derivative image at new scale % g1scale1 - Multi-scale scale map % noise - Estimated sensor noise % b_est - Estimate derivatives near boundaries? % % Output: g2mag - Integrated multi-scale directional 2nd derivative map % g2scale - Integrated multi-scale 2nd derivative scale map % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function[g2mag1,g2sc1] = g2scale(g2mag1,g2mag2,g2sc1,scale,noise,b_est) norms12 = [1.873 0.2443 0.0306 0.003817 0.00047715 0.0000596 0.000007455]; thresh = 5.2 * noise * norms12(scale); if ((scale<3) | b_est) krad = 1; else krad = ceil(4.6*sqrt(pow2(2*(scale-2))-1.0)); end; if (scale == 1) g2mag1 = zeros(size(g2mag2)); g2sc1 = zeros(size(g2mag2)); f = find(abs(g2mag2) >= thresh); g2sc1(f) = scale; g2mag1(f) = g2mag2(f); else sz = size(g2mag1); [i,j] = meshgrid(krad+1:sz(1)-krad,krad+1:sz(2)-krad); itrans = i'; jtrans = j'; if ~(isempty(itrans) | isempty(jtrans)) K = sub2ind(size(g2mag1),itrans(:),jtrans(:)); magmat1 = g2mag1(krad+1:end-krad,krad+1:end-krad); magmat2 = g2mag2(krad+1:end-krad,krad+1:end-krad); f = find(abs(magmat1) == 0 & abs(magmat2) >= thresh); g2mag1(K(f)) = g2mag2(K(f)); g2sc1(K(f)) = scale; end; end; return; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/g2steer.m ================================================ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % g2steer - Computes the second Gaussian derivative of the luminance function % in specified direction ( normally the Gradient direction). The three input % basis function are used to steer the derivative. The units of the direction % map are radians and the range is between -pi and pi. A value of -4 indicate % that no direction was measurable. The 2nd derivative is taken only for valid % directions. % % Input: g2x - Response map for 1st G2 basis function % g2y - Response map for 2nd G2 basis function % g2xy - Response map for 3rd G2 basis function % g1dir - Luminance gradient direction map % % Output: g2 - Second derivative response map % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function[g2] = g2steer(g2x,g2y,g2xy,g1dir) g2 = zeros(size(g2x)); f = find((g1dir ~= 4.0) & (g2x ~= 0) & (g2xy ~= 0) & (g2y ~= 0)); cdir = cos(2*g1dir); sdir = sin(2*g1dir); g2(f) = 0.5 * (1 + cdir(f)) .* g2x(f) - sdir(f) .* g2xy(f) + ... 0.5 * (1 - cdir(f)) .* g2y(f); return; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/gauss.m ================================================ % gauss.m: Calculates Gaussian pdf values. function[y] = gauss(x,std) y = exp(-x.^2/(2*std^2)) / (std*sqrt(2*pi)); return; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/gradient.m ================================================ %############################################################ % % gradient(maxscale,noise,gauss_a,conv_type,filtpath) % Computes non-zero gradient in the luminance function by % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function[g1mag,g1dir,g1sc] = gradient(maxscale,noise,gauss_a,... conv_type) fm2 = '.ascii'; %############ % Initialise: %############ g1mag = 0; g1dir = 0; g1sc = 0; for scale = 1:1:maxscale % set scale values for filters if (scale == 1) g1scaleval = '05'; else g1scaleval = '1'; end; mimg = gauss_a(:,:,scale); %##################################################### % Compute response of first derivative Gaussian filter % to the blurred image in an arbitrary direction: %##################################################### %kern1 = load(strcat(filtpath,'/gy',g1scaleval,fm2)); kern1 = load(strcat('gy',g1scaleval,fm2)); rc1 = convolve_2(mimg,kern1,conv_type); %kern2 = load(strcat(filtpath,'/g1x',g1scaleval,fm2)); kern2 = load(strcat('g1x',g1scaleval,fm2)); rc2 = convolve_2(rc1,kern2,conv_type); % x basis input %kern3 = load(strcat(filtpath,'/gx',g1scaleval,fm2)); kern3 = load(strcat('gx',g1scaleval,fm2)); rc3 = convolve_2(mimg,kern3,conv_type); %kern4 = load(strcat(filtpath,'/g1y',g1scaleval,fm2)); kern4 = load(strcat('g1y',g1scaleval,fm2)); rc4 = convolve_2(rc3,kern4,conv_type); % y basis input %################################################### % Calculate magnitude and direction of the gradient: %################################################### [m2,d2] = g1steer(rc2,rc4); omag = g1mag; odir = g1dir; osc = g1sc; %############################################ % Augment multi-scale Gaussian Gradient maps: %############################################ [g1mag,g1dir,g1sc] = g1scale(g1mag,g1dir,m2,d2,g1sc,scale,noise,0); end; return; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/main_edge.m ================================================ %############################################################ % % main_edge.m: Main function called from edge GUI interface. % %############################################################ function[OutputData] = main_edge(img,scale,noise,edgew,... conss,congrd,subpixelflag) %############# % Input Image: %############# if (size(img,3)~=1) img = rgb2gray(img); end; img=double(img); %######################## % Compose blurred images: %######################## gauss_imgs = scalespace(img,scale,conss); %######################## % Calculate gradient map: %######################## [g1_mag,g1_dir,g1_sc] = gradient(scale,noise,gauss_imgs,congrd); %############################## % Calculate 2nd derivative map: %############################## [g2_mag,g2_sc,g2_all] = derivative2nd(g1_dir,scale,noise,gauss_imgs,congrd); % save input.mat img g1_mag g1_dir g1_sc g2_mag g2_sc g2_all noise edgew subpixelflag scale %inparTest = checkInParam(img,g1_mag,g1_dir,g1_sc,g2_mag,g2_sc,g2_all,noise,... % edgew,subpixelflag,scale); %if inparTest > 0 % display('stop'); %end %#################### % Calculate edge map: %#################### clear find_edges [edge_map,blur_map,dark_map,light_map,xzero1_map,yzero1_map,xzero2_map,yzero2_map] = ... find_edges(img,g1_mag,g1_dir,g1_sc,g2_mag,g2_sc,g2_all,noise,... edgew,subpixelflag,scale); clear find_edges % outparTest = checkOutParam(edge_map,blur_map,dark_map,light_map,xzero1_map,yzero1_map,xzero2_map,yzero2_map); % if outparTest > 0 % display('stop'); % end %save output.mat edge_map blur_map dark_map light_map xzero1_map yzero1_map xzero2_map yzero2_map % Branka's code leaves dark and light as double which need rounding: dark_map = round(dark_map); light_map = round(light_map); %####################### % Output data in struct: %####################### % OutputData = struct('edge',edge_map,'dark_map',dark_map,... % 'light_map',light_map,'blur_map',blur_map,... % 'g1mag',g1_mag,'g1dir',g1_dir,'g1scale',g1_sc,... % 'g2mag',g2_mag,'g2scale',g2_sc,... % 'x1zero',xzero1_map,'y1zero',yzero1_map,... % 'x2zero',xzero2_map,'y2zero',yzero2_map,... % 'noise',noise); OutputData = struct('edge',edge_map,'blur',blur_map,... 'dark',dark_map,'light',light_map,... 'g1mag',g1_mag,'g1dir',g1_dir,'g1scale',g1_sc,... 'g2mag',g2_mag,'g2scale',g2_sc,'g2_all',g2_all,... 'noise',noise,'xzero',xzero1_map,'yzero',yzero1_map); return; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/mat2hough_scale.m ================================================ function [ r, th] = mat2hough_scale(m, n, r_max, r_res, th_res) % MAT2HOUGH converts matrix coordinates to Hough map values % % Inputs: % r_max: Maximum value r can take % m: vertical matrix index % n: horizontal matrix index % % Output: % r: Hough domain r value equivalent to n % th: Hough domain \theta value equivalent to m % % Author: % Ron Tal % % Date: % February 16, 2009 % % Description: % This function converts the coordinates of a matlab matrix % representing a Hough map, to the equivalent Hough domain % values % th = round2frac((m - 1) * th_res, th_res); r = round2frac((n - 1) * r_res - r_max, r_res); end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/plot_edgelmap.m ================================================ % Function to plot gradient direction vectors at both pixel % and subpixel locations: function[] = plot_edgelmap(img,edgemap,xzeromap,yzeromap,g1dir,... newarrcol,leg1,leg2,imtitle); [M,N] = size(edgemap); [I,J] = find(edgemap==255); K = find(edgemap==255); X = J; Y = I; % Set arrowlength, then define: % (Uarrow,Varrow) = arrow lengths in (x,y) directions % (Xarrow,Yarrow) = arrow tail points arrowlen = 1; Graddir = g1dir(K) + pi/2; Uarrow = arrowlen * cos(Graddir); Varrow = -arrowlen * sin(Graddir); Xtp = X - 0.5*Uarrow; Ytp = Y - 0.5*Varrow; Xarrow = xzeromap(K) - 0.5*Uarrow; Yarrow = yzeromap(K) - 0.5*Varrow; figure; imagesc(img); axis image; colormap(gray); hold on; p1 = plot(0,0); set(p1,'Color',[0 0 1]); set(p1,'Visible','off'); p2 = plot(0,0); set(p2,'Color',newarrcol); set(p2,'Visible','off'); %q1 = quiver(Xtp,Ytp,Uarrow,Varrow,0); JE Jul08 - suppress pixel-localized %edges q2 = quiver(Xarrow,Yarrow,Uarrow,Varrow,0); % %set(q1,'Color',[0 0 1]); set(q2,'Color',newarrcol); L = legend([p1,p2],leg1,leg2,-1); set(L,'Fontsize',8); twords = ['Edgels for Image ',imtitle]; tt = title(twords); set(tt,'Interpreter','none'); hold off; return; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/round2frac.m ================================================ %% round2frac() Rounds the input data to the nearest fraction % % Description: % % Takes 'data' a matrix of floats and rounds it to the nearest 'frac' % % Author: % % Ron Tal % % Date Created: % % November 4, 2008 % function [round_data] = round2frac(data, frac) % if frac > 1, error('Fraction must be smaller than 1'); end round_data = data.*(1/frac); round_data = round(round_data); round_data = round_data.*frac; end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/run_elderEdge.m ================================================ clc clear close all for i = 1:9 clear mex edgeStruct = elderEdge(); figure; imshow(edgeStruct.edge_map); i length(find(edgeStruct.edge_map)) diffs{i} = edgeStruct.edge_map; end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/scalespace.m ================================================ %################################################################ % % r = scalescape(mimg,maxscale,conv_type) % % Create a series of Gaussian blurred images according to a % given maximum scale. % % Input: mimg: image for convolution w/ Gaussian filter % maxscale: maximum scale value % conv_type: convolution type flag % % Output: blurred_imgs: maxscale blurred images % %################################################################ function[blurred_imgs] = scalespace(mimg,maxscale,conv_type) for scale = 1:1:maxscale if (scale < 3) % Image is unblurred: blurred_imgs(:,:,scale) = mimg; else % Set values for generating Gaussian filter at given scale: [stdd,sizz] = setvalues(scale); kern = d2gauss(sizz,stdd,1,1,0,1/(stdd*sqrt(2*pi))); c1mimg = convolve_2(mimg,kern,conv_type); cres = convolve_2(c1mimg,rot90(kern,3),conv_type); blurred_imgs(:,:,scale) = cres; end; end; return; % Results differ to cantata output for scale >= 3 in the 4th d.p. ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/code/setvalues.m ================================================ %########################################################################## % % [stdd,sizz] = setvalues(scale) % % Set values for generating 2d Gaussian filter according to % input scale. % % Input: scale % % Output: stdd: std dev'n along width (along height assumed to be 1) % size: width of output = #columns (height assumed to be 1) % %########################################################################## function[stdd,sizz] = setvalues(scale); if (scale < 3) stdd = 1; else stdd = sqrt((2^(scale-2))^2 - 1); end; sizz = 2 * ceil(4.6 * stdd) + 1; return; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/filters/g1x05.ascii ================================================ 0.750938 0 -0.750938 ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/filters/g1x1.ascii ================================================ 0.000535321 0.0132955 0.107982 0.241971 -0 -0.241971 -0.107982 -0.0132955 -0.000535321 ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/filters/g1y05.ascii ================================================ 0.750938 0 -0.750938 ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/filters/g1y1.ascii ================================================ 0.000535321 0.0132955 0.107982 0.241971 -0 -0.241971 -0.107982 -0.0132955 -0.000535321 ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/filters/g2x05.ascii ================================================ 0.0594001 1.02157 -2.16194 1.02157 0.0594001 ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/filters/g2x1.ascii ================================================ 0.00200744 0.0354546 0.161972 0 -0.39894 0 0.161972 0.0354546 0.00200744 ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/filters/g2y05.ascii ================================================ 0.0594002 1.02157 -2.16194 1.02157 0.0594002 ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/filters/g2y1.ascii ================================================ 0.00200744 0.0354546 0.161972 0 -0.39894 0 0.161972 0.0354546 0.00200744 ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/filters/gx05.ascii ================================================ 0.157727 0.684552 0.157727 ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/filters/gx1.ascii ================================================ 0.00443185 0.053991 0.241971 0.398942 0.241971 0.053991 0.00443185 ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/filters/gy05.ascii ================================================ 0.157726 0.68455 0.157726 ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/ElderZuckerEdgeDetector/filters/gy1.ascii ================================================ 0.00443185 0.053991 0.241971 0.398942 0.241971 0.053991 0.00443185 ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/computeKernel.m ================================================ function [kern,ind]=computeKernel(e,r_max,SIGMA_X, SIGMA_TH, r_res, th_res) %computing the kernel for the probabilistic hough tranform r_th = e; C =[SIGMA_X^2 + (r_th^2) * (SIGMA_TH^2), r_th * (SIGMA_TH^2); r_th * (SIGMA_TH^2), SIGMA_TH^2]; C_inv = inv(C); C_det = det(C); N = 1 / (2*pi * sqrt(C_det)); R = -round2frac(3 *sqrt(C(1,1)), r_res):r_res:round2frac(3 *sqrt(C(1,1)), r_res); TH = -round2frac(3 * SIGMA_TH, th_res):th_res:round2frac(3 * SIGMA_TH, th_res); c=C_inv(1,1); d=C_inv(1,2); g=C_inv(2,1); f=C_inv(2,2); [a,b]=meshgrid(R,TH); vals=N * exp(-0.5*((a*c+b*g).*a+(a*d+b*f).*b)); [r, c] = find(vals > 0.05*max(vals(:))); m_c = min(c) - 1; m_r = min(r) - 1; linearInd = sub2ind([length(TH),length(R)], r, c); kern=[c- m_c,r- m_r, vals(linearInd)]; ind = e + r_max + 1; end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/determine_hough_lines_kernel_vote_remove.m ================================================ function [ lines, edgeStruct ] = determine_hough_lines_kernel_vote_remove( im, pp, kernels, kernels_flip, num, kernel_params, r_res, th_res, sig_bound, frac,scale_factor) %edge detection edgeStruct = main_edge(im,5,1,10,1,0,1); %find the pixel location that has edge value edge_index = find(edgeStruct.edge); edge_img_locations = [edgeStruct.xzero(edge_index),edgeStruct.yzero(edge_index)]; edge_gradients = edgeStruct.g1dir(edge_index); %create a hough map map = mexVoteEdges_v3_scale(edge_img_locations, edge_gradients, kernels, kernels_flip, r_res,th_res, pp, kernel_params,scale_factor); %iteratively extract lines from hough map [P] = hough_find_peaks_vote_removal(map, num, r_res, th_res, edgeStruct, kernels, kernels_flip, pp, kernel_params, 0.0917, 0.3934, sig_bound, frac, scale_factor); %the lines consist of [rho, theta, strength] lines = P(:, 1:3); end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/get_all_segments_assoc_edgeremoval.m ================================================ function [ begin_points, end_points,ls_likelihoods] = get_all_segments_assoc_edgeremoval( line_data, edgeStruct, pp, LIKE_MODEL,scale_factor) begin_points = []; end_points = []; ls_likelihoods = []; for i = 1:size(line_data, 1) [~, begin_pointsi, end_pointsi, ~,~, ~, ~, ~, ~, likelihoods, edgeMap] = get_line_segment_DP_edgeremoval( edgeStruct, line_data(i,1), line_data(i,2), pp, LIKE_MODEL, scale_factor); for j = 1:size(likelihoods,2) begin_points = [begin_points; begin_pointsi(j,:)]; end_points = [end_points; end_pointsi(j,:)]; ls_likelihoods = [ls_likelihoods; likelihoods(j)]; end edgeStruct.edge = edgeMap; end end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/get_line_segment_DP_edgeremoval.m ================================================ function [final_labels, begin_points, end_points, begin_point, end_point, posterior, lslength, logratioposterior, ls_probDiff, likelihoods, edgemap] = get_line_segment_DP_edgeremoval( edgeStruct, rho, theta, pp, probStruct, scale_factor) % Description: Line segment detector that removes the edges associated with % each detected line segment. final_labels = []; begin_points = []; end_points = []; begin_point = []; end_point = []; posterior = []; lslength = []; logratioposterior = []; ls_probDiff = []; edgemap = edgeStruct.edge; edge_gradients = edgeStruct.g1dir; exist_edge_on = probStruct.exist_edge_on; exist_edge_off = probStruct.exist_edge_off; ang_dev_on = probStruct.ang_dev_on_hist; ang_dev_off = probStruct.ang_dev_off_hist; nexist_edge_on = probStruct.nexist_edge_on; nexist_edge_off = probStruct.nexist_edge_off; %the transition probability for the line segments %it is generated from sampling in the YorkUDB dataset prob_leave_on = 0.0051/scale_factor; prob_stay_on =1-prob_leave_on; prob_leave_off = 0.0014/scale_factor; prob_stay_off = 1-prob_leave_off; prob_on = 0.247; prob_off = 0.753; [m, n] = size(edgeStruct.edge); % GET EQUATION OF THE LINE X_1 = rho * cos(theta) - 2000*cos(theta+pi/2) + pp(1); X_2 = rho * cos(theta) + 2000*cos(theta+pi/2) + pp(1); Y_1 = rho * sin(theta) - 2000*sin(theta+pi/2) + pp(2); Y_2 = rho * sin(theta) + 2000*sin(theta+pi/2) + pp(2); M = (Y_2-Y_1)/(X_2-X_1 + 1e-7); b = Y_2 - X_2*M; % GET BOUNDARIES OF THE LINE IN IMAGE FRAME p1 = [1, M + b]; p2 = [n, M*n + b]; p3 = [(1-b)/M,1]; p4 = [(m-b)/M, m]; points = [p1;p2;p3;p4]; X = points(:,1); Y = points(:,2); X_valid = (X <= n).*(X >= 1); Y_valid = (Y <= m).*(Y >= 1); p_valid = X_valid.*Y_valid; points_valid = points(p_valid>0, :); %changed find to logical index X_l = points_valid(:,1)'; Y_l = points_valid(:,2)'; if isempty(X_l) || isempty(Y_l) return; end %get the line points indexXY=sampleLine(rho,theta,n,m,pp); yy=ceil(indexXY(:,2)+pp(2)); xx=ceil(indexXY(:,1)+pp(1)); index = sub2ind([m,n],yy,xx); p1 = [X_l(1), Y_l(1)]; p2 = [X_l(2), Y_l(2)]; % FIND POINTS CONSIDERED node_idx=index; y_h = edgemap(node_idx); % y_h(y_h > 0) = 1; % FIND ORIENTATION DIF AND DIST: TH = pi-theta; if TH<0, TH=TH+pi; elseif TH>pi, TH=TH-pi; end edge_gradientsmap=edge_gradients(node_idx); edgeind=edge_gradientsmap < 0; edge_gradientsmap(edgeind) = edge_gradientsmap(edgeind) + pi; edgeind=edge_gradientsmap>pi; edge_gradientsmap(edgeind)= edge_gradientsmap(edgeind)-pi; edge_img_locations = [edgeStruct.xzero(node_idx),edgeStruct.yzero(node_idx)]; ang_dev = round((edge_gradientsmap - TH)*180/pi); ang_dev(ang_dev < -90) = ang_dev(ang_dev < -90) + 180; ang_dev(ang_dev > 90) = ang_dev(ang_dev > 90) - 180; range_ang = -90:1:90; range_dis = 0:0.05:5; loc_points = [xx, yy]; loc_points(y_h > 0,:) = edge_img_locations(y_h > 0,:); if size(loc_points,1) == 0 loc_points = [-1000, -1000]; end %Get the projection of points along the line defined by p1 and p2 [points_proj, distances] = project_point_to_line_segment_vec(p1,p2,loc_points); distances = interp1(range_dis, range_dis, abs(distances), 'nearest'); range_dis = 0:0.05:1.95; % Eliminate GROSS OUTLIERS node_idx(distances > 2) = []; ang_dev(distances > 2) = []; y_h(distances > 2) = []; points_proj(distances > 2,:) = []; distances(distances > 2) = []; % SORT: if abs(M) > 1 [~, idx] = sort(points_proj(:,2)); else [~, idx] = sort(points_proj(:,1)); end points_proj = points_proj(idx,:); node_idx = node_idx(idx); distances = distances(idx); ang_dev = ang_dev(idx); y_h = y_h(idx); ang_dev(y_h == 0) = NaN; %INIT begin_point = points_proj(1,:); end_point = points_proj(end,:); Psi_t = [prob_stay_on prob_leave_off; prob_leave_on prob_stay_off]; pi_var = [prob_on; prob_off]; [~, obslik,~,DP_table, aux_table, z]=hmmParameters(exist_edge_on,exist_edge_off,ang_dev_on,... ang_dev_off,node_idx,Psi_t,pi_var,y_h,distances,range_dis,nexist_edge_on,... nexist_edge_off,prob_on,prob_off,prob_stay_on,prob_leave_off,prob_leave_on,... prob_stay_off,ang_dev,range_ang); [lsjoint, lslogz,final_labels, node_on, likelihoods] = trace_Back(DP_table, aux_table, z, node_idx, obslik); edgemap(node_on) = 0; final_labels(final_labels == 2) = 0; % RETURN LINE SEGMENTS [begin_points,end_points,lslength,startpositions,endpositions]=returnLines(points_proj,final_labels); %compute p(x=0|y) for each line segment logjointoff = zeros(size(begin_points,1), 1); for j = 1:size(begin_points,1) %number of line segments for i = startpositions(j):endpositions(j) if startpositions(j) == 1 transition = prob_off; past = 0; elseif i == startpositions(j) transition = prob_leave_on; past = DP_table(1,i-1); else transition = prob_stay_off; past = DP_table(2,i-1); end if y_h(i) [~, nn] = min(abs(distances(i) - range_dis)); [~, mm] = min(abs(ang_dev(i) - range_ang)); p_y_off_1 = exist_edge_off(nn); p_t_off_1 = ang_dev_off(mm); loc_off = p_y_off_1*p_t_off_1; %likelihood of y given x = off logjointoff(j) = logjointoff(j) + log(loc_off) + log(transition) + past; else [~, nn] = min(abs(distances(i) - range_dis)); loc_off = nexist_edge_off(nn); logjointoff(j) = logjointoff(j) + log(loc_off) + log(transition) + past; end end end for i = 1:size(logjointoff,1) if logjointoff(i) > lslogz(i) || logjointoff(i) > lsjoint(i) display('Error'); end end if size(lsjoint,1) > 0 logratioposterior = lsjoint - logjointoff; else logratioposterior = 0; end end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/hough_find_peaks_vote_removal.m ================================================ %% Function P = hough_find_peaks_with_near_peak_supression(map, num_lines, NHOOD) % Input % map Hough Map % num_lines Maximum number of lines % NHOOD [R, TH] neighborhood to be % surpressed % % Output % P Hough Peaks % % function [P] = hough_find_peaks_vote_removal(map, num, r_res, th_res, edgeStruct, kernels, kernels_flip, pp, kernel_params, sig_th, sig_r, sig_bound, frac, scale_factor) % Loop until no more peaks or number of desired peaks have been % selected COUNT = 0; MAX_R = 400*scale_factor; P =[]; edgeMap = edgeStruct.edge; iter = 1; [m,n]=size(edgeMap); while 1 iter = iter + 1; % Find max peak: [maxmap,ind]=max(map(:)); [r,c] = ind2sub(size(map), ind); if length(r) > 1, r = r(1); c = c(1); end %here are some stopping criteria if isempty(r) return; end [rho, theta] = mat2hough_scale(r, c, MAX_R, r_res, th_res); if ismember([rho, theta, maxmap], P, 'rows', 'legacy') return; end if COUNT > 0 if (maxmap/P(1,3)) < frac return; end end % Save max peak P = [P; [rho theta maxmap]]; COUNT = COUNT + 1; % If reached number of lines, return if size(P, 1) == num return; end %there following block of code identify the location of edges that %need to be removed from the hough map and edge map indexXY=sampleLine(rho,theta,n,m,pp); yy=ceil(indexXY(:,2)+pp(2)); xx=ceil(indexXY(:,1)+pp(1)); edge_index = sub2ind([m,n],yy,xx); X_1 = rho * cos(theta) - 2000*cos(theta+pi/2) + pp(1); X_2 = rho * cos(theta) + 2000*cos(theta+pi/2) + pp(1); Y_1 = rho * sin(theta) - 2000*sin(theta+pi/2) + pp(2); Y_2 = rho * sin(theta) + 2000*sin(theta+pi/2) + pp(2); M = (Y_2-Y_1)/(X_2-X_1+1e-7); b = Y_2 - X_2*M; line_eq = [M, -1, b]; edge_img_locations = [edgeStruct.xzero(edge_index),edgeStruct.yzero(edge_index), ones(length(edge_index(:)),1)]; edge_gradients = edgeStruct.g1dir(edge_index); edge_gradients2 = edge_gradients; indexless0=edge_gradients2 < 0; indexgreaterpi=edge_gradients2>pi; edge_gradients2(indexless0) = edge_gradients2(indexless0) + pi; edge_gradients2(indexgreaterpi)= edge_gradients2(indexgreaterpi)-pi; edge_gradients2 = pi - edge_gradients2; edgetetalesspi=edge_gradients2 - theta<-pi/2; edge_gradients2(edgetetalesspi)= edge_gradients2(edgetetalesspi)+pi; edgethetagreaterpi=edge_gradients2-theta>pi/2; edge_gradients2(edgethetagreaterpi)= edge_gradients2(edgethetagreaterpi)-pi; orientationDiff = abs(edge_gradients2 - theta); distances = (abs(line_eq*edge_img_locations')'/norm(line_eq(1:2))); distanceBoundary=(distances <= sig_bound*sig_r); edge_img_locations_remove = edge_img_locations(distanceBoundary, 1:2); edge_gradients_remove = edge_gradients(distanceBoundary); orientationDiff = orientationDiff(distanceBoundary); edge_index = edge_index(distanceBoundary); orientatinDiffboundary=orientationDiff <=sig_bound*sig_th; edge_img_locations_remove = edge_img_locations_remove(orientatinDiffboundary, :); edge_gradients_remove = edge_gradients_remove(orientatinDiffboundary); edge_index = edge_index(orientatinDiffboundary); if isempty(edge_img_locations_remove) break; end edgeMap(edge_index) = 0; %remove the detected lines from the hough map map=mexRemoveVotes_v3_scale(edge_img_locations_remove, edge_gradients_remove, kernels, kernels_flip, r_res, th_res, pp, kernel_params, map, scale_factor); %map = mexRemoveVotes_v3_scale(edge_img_locations_remove, edge_gradients_remove, kernels, kernels_flip, r_res, th_res, pp, kernel_params, map, scale_factor); end end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/kernelInitialization.m ================================================ function [kernels, kernels_flip, kernel_params] =kernelInitialization(img) [m,n,~]=size(img); scale_factor = sqrt(m^2+n^2)/800; %800 is the diagnal length of 640x480 image maxr = floor(400*scale_factor); sigmax = 0.4; r_res = 0.2; th_res = 0.002; sigmatheta = 5.4*(pi/180); [kernels, kernels_flip, kernel_params] = precompute_kernels_sparse_res2(maxr, sigmax, sigmatheta, r_res, th_res); end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/lineSegmentation_HighRes.m ================================================ function [lines, fullLines] =lineSegmentation_HighRes(img,kernels, kernels_flip, kernel_params) %use 640x480 image as a reference. the diagonal size of this image is 800 %if image size 640x480 scale factor = 1 %if image size 1280x960 scale factor = 2 ... etc. %the lines variable contains the detected line segmentations it arranged as %[x1 y1 x2 y2 probability] %The fullLines are the detected lines. It is arranged as [rho theta probability] pp=[307.551305282635,251.454244960136]; %principle point sig_bound = 3; %threshold for the line detection r_res = 0.2; %the theshold for the rho th_res = 0.002; %the threshold for theta [m,n,~]=size(img); scale_factor = sqrt(m^2+n^2)/800; %800 is the diagnal length of 640x480 image %the kernel of the algorithm is calibrated on 640x480 image %rescale the principle point pp(1)=pp(1)*n/640; pp(2)=pp(2)*m/480; [lines, fullLines] = run_lineSegmentAlgorithm(kernels, kernels_flip, kernel_params, sig_bound, r_res, th_res, img, scale_factor,pp); end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/mexfiles/hmmParameters.m ================================================ function [alpha_t, obslik,T,DP_table, aux_table, z]=hmmParameters(exist_edge_on,exist_edge_off,ang_dev_on,... ang_dev_off,node_idx,Psi_t,pi_var,y_h,distances,range_dis,nexist_edge_on,... nexist_edge_off,prob_on,prob_off,prob_stay_on,prob_leave_off,prob_leave_on,... prob_stay_off,ang_dev,range_ang) node_idx_length=length(node_idx); DP_table = zeros(2, node_idx_length); aux_table = zeros(2, node_idx_length); % aux_table(1,1) = -Inf; % aux_table(2,1) = -Inf; z = zeros(node_idx_length,1); % E.A. List of log evidences: sum(log(z)) from 1:t. alpha_t = zeros(2,node_idx_length); %E.A. 2x1 vector (on/off) of posterior prob.: e.g. alpha_1 = [p(x=on|x); p(x=off|x)] obslik = zeros(2,node_idx_length); %E.A. 2x1 observation likelihood if y_h(1) [val, nn] = min(abs(distances(1) - range_dis)); [val, mm] = min(abs(ang_dev(1) - range_ang)); p_y_on_1 = exist_edge_on(nn); p_y_off_1 = exist_edge_off(nn); p_t_on_1 = ang_dev_on(mm); p_t_off_1 = ang_dev_off(mm); loc_on = p_y_on_1*p_t_on_1; %likelihood of y given x = on loc_off = p_y_off_1*p_t_off_1; %likelihood of y given x = off DP_table(1,1) = log(loc_on) + log(prob_on); DP_table(2,1) = log(loc_off) + log(prob_off); %Compute prob. of the evidence. E.A. obslik(:,1) = [loc_on; loc_off]; z(1) = sum(obslik(:,1) .* pi_var); alpha_t(:,1) = [ loc_on * pi_var(1); loc_off * pi_var(2)] / z(1); % if (round(sum(alpha_t(:,1))) ~= 1) % display('Error'); % end %% Compute log likelihood ration and evidenct -- E.A % log_like_ratio_list(1) = log((p_y_on_1*p_t_on_1)/(p_y_off_1*p_t_off_1)); %E.A. log likelihood ratio (1st position, edge) % evidence(1) = log(p_y_on_1*p_t_on_1*prob_on + p_y_off_1*p_t_off_1*prob_off); %% else [val, nn] = min(abs(distances(1) - range_dis)); loc_on = nexist_edge_on(nn); loc_off = nexist_edge_off(nn); DP_table(1,1) = log(loc_on) + log(prob_on); DP_table(2,1) = log(loc_off) + log(prob_off); %Compute prob. of the evidence. E.A. %psi = [loc_on; loc_off]; obslik(:,1) = [loc_on; loc_off]; z(1) = sum(obslik(:,1) .* pi_var); alpha_t(:,1) = [ loc_on * pi_var(1); loc_off * pi_var(2)] / z(1); %obslik(:,1) = [loc_on; loc_off]; % if (round(sum(alpha_t(:,1))) ~= 1) % display('Error'); % end % %% Compute log likelihood ration and evidenct -- E.A % log_like_ratio_list(1) = log(p_y_on_1/p_y_off_1); %E.A. log likelihood ratio (1st position, no edge) % evidence(1) = log(p_y_on_1*prob_on + p_y_off_1*prob_off); %% end % LOOP THROUGH for i =2:node_idx_length if y_h(i) [val, nn] = min(abs(distances(i) - range_dis)); [val, mm] = min(abs(ang_dev(i) - range_ang)); p_y_on_1 = exist_edge_on(nn); p_y_off_1 = exist_edge_off(nn); p_t_on_1 = ang_dev_on(mm); p_t_off_1 = ang_dev_off(mm); loc_on = p_y_on_1*p_t_on_1; %likelihood of y given x = on loc_off = p_y_off_1*p_t_off_1; %likelihood of y given x = off [DP_table(1,i), aux_table(1,i)] = max([log(loc_on) + log(prob_stay_on) + DP_table(1,i-1), log(loc_on) + log(prob_leave_off) + DP_table(2,i-1)]); [DP_table(2,i), aux_table(2,i)] = max([log(loc_off) + log(prob_leave_on) + DP_table(1,i-1), log(loc_off) + log(prob_stay_off) + DP_table(2,i-1)]); %Compute prob. of the evidence. E.A. %psi = [loc_on; loc_off]; obslik(:,i) = [loc_on; loc_off]; predict = Psi_t * alpha_t(:,i-1); z(i) = sum(obslik(:,i) .* predict); alpha_t(:,i) = [ loc_on * predict(1); loc_off * predict(2)] / z(i); %obslik(:,i) = [loc_on; loc_off]; % if (round(sum(alpha_t(:,1))) ~= 1) % display('Error'); % end %% Compute log likelihood ration and evidenct -- E.A % log_like_ratio_list(i) = log((p_y_on_1*p_t_on_1)/(p_y_off_1*p_t_off_1)); %E.A. store likelihood % evidence(i) = evidence(i-1) + log(p_y_on_1*p_t_on_1*prob_stay_on + p_y_on_1*p_t_on_1*prob_stay_off + ... % p_y_off_1*p_t_off_1*prob_leave_on + p_y_off_1*p_t_off_1*prob_stay_off); %E.A. log evidence 1..i %% else [val, nn] = min(abs(distances(i) - range_dis)); loc_on = nexist_edge_on(nn); loc_off = nexist_edge_off(nn); [DP_table(1,i), aux_table(1,i)] = max([log(loc_on) + log(prob_stay_on) + DP_table(1,i-1), log(loc_on) + log(prob_leave_off) + DP_table(2,i-1)]); [DP_table(2,i), aux_table(2,i)] = max([log(loc_off) + log(prob_leave_on) + DP_table(1,i-1), log(loc_off) + log(prob_stay_off) + DP_table(2,i-1)]); %Compute prob. of the evidence. E.A. obslik(:,i) = [loc_on; loc_off]; predict = Psi_t * alpha_t(:,i-1); z(i) = sum(obslik(:,i) .* predict); alpha_t(:,i) = [ loc_on * predict(1); loc_off * predict(2)] / z(i); % if (round(sum(alpha_t(:,1))) ~= 1) % display('Error'); % end %% Compute log likelihood ration and evidence -- E.A % log_like_ratio_list(i) = log(p_y_on_1/p_y_off_1); %E.A. store likelihood % evidence(i) = evidence(i-1) + log(p_y_on_1*prob_stay_on + p_y_on_1*prob_leave_off + ... % p_y_off_1*prob_leave_on + p_y_off_1*prob_stay_off); %E.A. log evidence 1..i %% end end T = size(DP_table,2); end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/mexfiles/hmmParameters.prj ================================================ false option.WorkingFolder.Project option.BuildFolder.Project true true true true option.GlobalDataSyncMethod.SyncAlways true option.DynamicMemoryAllocation.Threshold 65536 200000 option.FilePartitionMethod.MapMFileToCFile true false false true false false option.VerificationMode.None option.VerificationStatus.Passed false 40000 option.PreserveVariableNames.UserNames option.TargetLang.C true 10 200 4000 true 64 true true option.ConstantInputs.CheckValues false option.WorkingFolder.Project option.BuildFolder.Project true true option.DynamicMemoryAllocation.Threshold 65536 200000 option.FilePartitionMethod.MapMFileToCFile true false true false false false true Automatically locate an installed toolchain option.target.TargetType.MatlabHost Generic MATLAB Host Computer true 8 16 32 64 64 32 64 64 64 option.HardwareEndianness.Little true true option.HardwareAtomicIntegerSize.Char option.HardwareAtomicFloatSize.None option.HardwareDivisionRounding.Zero Generic MATLAB Host Computer false 8 16 32 64 64 32 64 64 64 option.HardwareEndianness.Little true true option.HardwareAtomicIntegerSize.Char option.HardwareAtomicFloatSize.None option.HardwareDivisionRounding.Zero 40000 option.PreserveVariableNames.UserNames option.TargetLang.C 10 200 4000 true 64 true true option.WorkingFolder.Project option.BuildFolder.Project true false option.objective.c generateCode demo_start_v2 option.UseGlobals.No ${PROJECT_ROOT}/hmmParameters_mex.mexmaci64 true true true 3530211709 false false true codegen/mex/hmmParameters 4179426945 codegen/mex/hmmParameters 1281319812 demo_start_v2 <?xml version="1.0" encoding="UTF-8" standalone="yes"?><checksum><includedFiles><file>/Users/yimingqian/Dropbox/My Publications/CVPR 2017/code/LineSegDet2017/code/mexfiles/hmmParameters.m</file></includedFiles><value>1634473109</value></checksum> <?xml version="1.0" encoding="UTF-8" standalone="yes"?><sourceModel><primarySourceFiles><file>/Users/yimingqian/Dropbox/My Publications/CVPR 2017/code/LineSegDet2017/code/mexfiles/hmmParameters.m</file></primarySourceFiles><fixedPointSourceFiles/><fixedPointSourceRegistered>false</fixedPointSourceRegistered><fixedPointSourceSelected>false</fixedPointSourceSelected></sourceModel> false false true hmmParameters_mex hmmParameters option.target.artifact.mex ${PROJECT_ROOT}/hmmParameters_mex.mexmaci64 true false option.FixedPointMode.None 16 4 0 fimath('RoundingMethod', 'Floor', 'OverflowAction', 'Wrap', 'ProductMode', 'FullPrecision', 'MaxProductWordLength', 128, 'SumMode', 'FullPrecision', 'MaxSumWordLength', 128) option.FixedPointTypeSource.SimAndDerived false false false false true true false _fixpt false false option.DefaultFixedPointSignedness.Automatic option.FixedPointTypeProposalMode.ProposeFractionLengths double 1 x 40 false false double 1 x 40 false false double 1 x 181 false false double 1 x 181 false false double :inf x 1 true false double 2 x 2 false false double 2 x 1 false false double :inf x 1 true false double :inf x 1 true false double 1 x 40 false false double 1 x 40 false false double 1 x 40 false false double 1 x 1 false false double 1 x 1 false false double 1 x 1 false false double 1 x 1 false false double 1 x 1 false false double 1 x 1 false false double :inf x 1 true false double 1 x 181 false false /Users/yimingqian/Dropbox/My Publications/CVPR 2017/code/LineSegDet2017/demo_start_v2.m /Users/yimingqian/Dropbox/My Publications/CVPR 2017/code/LineSegDet2017/code/mexfiles/hmmParameters_mex.mexmaci64 /Applications/MATLAB_R2015b.app true true true true true true false false false false false false 10.12.6 false true maci64 true ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/mexfiles/mexRemoveVotes_v3_scale.c ================================================ /* * Function: mexRemoveVote_v2 * * Input: Kernel value matrices (regular and flipped), and dimensional * arguments, along with the voting map * * Output: Updated voting map * * Author: Ron Tal * * * Usage: Compiled and called through Matlab * */ /* Include the following header files */ # include "mex.h" #include "matrix.h" #include #include #define PI 3.141 #define RMAX 400.0 /* Input Arguments */ extern mxArray *mxCreateSharedDataCopy(const mxArray *pr); #define EDG_L prhs[0] #define EDG_G prhs[1] #define KERN prhs[2] #define KERNF prhs[3] #define R_RES prhs[4] #define T_RES prhs[5] #define PP prhs[6] #define KMAX prhs[7] #define MAP prhs[8] #define SCALE prhs[9] /* Output Arguments */ #define NMAP plhs[0] /* STRUCTS */ typedef struct { int m; int n; } matPoint; typedef struct { double r; double th; } houghPoint; /* Global variables: */ mwSize mmap, nmap, m_edge_loc, n_edge_loc, m_edge_grad, n_edge_grad, m_kern, m_kern_f; double* edge_loc, * edge_grad, * pp, r_res, th_res; double* map, * scale; mxArray* kernels, *kernels_flip, * k_max; double *outMatrix; int round_f (double val) { return floor(val + 0.5); } double round2frac(double val, double res) { double lrg = val/res; double rnd = (double) round_f(lrg); return rnd*res; } matPoint hough2mat(double r, double th, double rres, double thres) { matPoint val; val.n = round_f((r + (double)RMAX**scale ) / rres + 1); val.m = round_f(th / thres + 1); return val; } houghPoint mat2hough(int m, int n, double rres, double thres) { houghPoint val; val.th = round2frac(m*thres, thres); val.r = round2frac(n*rres - (double)RMAX**scale, rres); return val; } void houghRemoveVotes(matPoint center, mxArray * k, mxArray * k_f, mxArray * k_m) { /* Get Kernel properties */ int i; int m = center.m; int n = center.n; int m_ker, n_max, m_max, n_lim_pos, n_lim_neg, m_lim_pos, m_lim_neg; double * kernel; double * kernel_flip; double * k_mx; double val; m_ker = mxGetM(k); kernel = mxGetPr(k); kernel_flip = mxGetPr(k_f); k_mx = mxGetPr(k_m); n_max = k_mx[0]; m_max = k_mx[1]; n_lim_pos = n + (n_max-1)/2 - 1; n_lim_neg = n - (n_max-1)/2 - 1; m_lim_pos = m + (m_max-1)/2 - 1; m_lim_neg = m - (m_max-1)/2 - 1; /* Vote for each valid kernel value */ for (i = 0; i < m_ker; i++) { int m_on_map; int n_on_map; m_on_map = m_lim_neg + (int)kernel[m_ker + i] - 1; n_on_map = n_lim_neg + (int)kernel[i] - 1; /* Out of R bounds: do nothing */ if (n_on_map <= 0 ||n_on_map >= nmap) continue; /* Handle wraparound in TH domain: to be added later: */ else if( m_on_map < 0) { m_on_map = mmap + m_on_map ; n_on_map = nmap - n_on_map ; if (n_on_map < 0 ||n_on_map >= nmap) continue; if(map[(n_on_map )*mmap + m_on_map] - kernel[2*m_ker + (m_ker - i - 1)] >= 0) map[(n_on_map )*mmap + m_on_map] -= kernel[2*m_ker + (m_ker - i - 1)]; }else if(m_on_map >= mmap) { m_on_map = m_on_map - mmap ; n_on_map = nmap - n_on_map ; if (map[(n_on_map )*mmap + m_on_map] - kernel[2*m_ker + (m_ker - i)] >= 0) map[(n_on_map )*mmap + m_on_map] -= kernel[2*m_ker + (m_ker - i)]; } /* No wraparound */ else { if(map[(n_on_map )*mmap + m_on_map] - kernel[2*m_ker + i] >= 0) map[(n_on_map )*mmap + m_on_map] -= kernel[2*m_ker + i]; } } } void loopThroughRemove() { int i = 0; for (i = 0; i < m_edge_loc;i++ ) { double r, mag; double * kernel, * kernel_flip, * k_m, * m_l; int r_th, ind; matPoint center; double x = (double)edge_loc[i] - (double)pp[0]; double y = (double)edge_loc[m_edge_loc + i] - (double)pp[1]; double th = edge_grad[i]; if (th == 4.0) continue; if (th < 0) th += PI; if (th > PI) th -= PI; th = PI - th; r = x * cos(th) + y * sin(th); th = round2frac(th, th_res); r = round2frac(r, r_res); r_th = round_f(- x * sin(th) + y * cos(th)); if (r_th > (int)(400**scale)) r_th = (int)(400**scale); else if(r_th < - (int)(400**scale)) r_th = -(int)(400**scale); if (r_th == 0) { ind = 0; } else { ind = r_th + (double)RMAX**scale; } kernel = mxGetCell(kernels, ind); kernel_flip = mxGetCell(kernels_flip, ind); k_m = mxGetCell(k_max, ind); /* Center of kernel on voting map */ center = hough2mat(r, th, r_res, th_res); houghRemoveVotes(center,kernel, kernel_flip, k_m); } } void mexFunction ( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) /* * Function: mexFunction * * Inputs: nrhs -> Integer representing the number of input arguments * sent from Matlab. * * prhs[] -> An mxArray structure of size nrhs holding pointers * to arguments sent from Matlab. * * nlhs -> Integer representing the number of output arguments * requested from Matlab. * * plhs[] -> An mxArray structure of size nlhs holding pointers * to the location of output arguments. * * Outputs: (void) * * Functionality: Analogous to a 'main' function. This function will * be activated by default when Matlab calls this C * function. Used to interface between C and Matlab, * as to ensure output is in the location and format * Matlab expecs. */ { /* Declerations and initializations */ /* Check for proper number of arguments */ if (nrhs != 10) { mexErrMsgTxt("Nine input arguments required."); } /* Get edge locations */ m_edge_loc = mxGetM(EDG_L); n_edge_loc = mxGetN(EDG_L); edge_loc = mxGetPr(EDG_L); if (n_edge_loc != 2) { mexErrMsgTxt("Wrong edge locations format."); } /* Get edge gradients */ m_edge_grad = mxGetM(EDG_G); n_edge_grad = mxGetN(EDG_G); if (n_edge_grad != 1) { mexErrMsgTxt("Wrong edge gradient format."); } if (m_edge_loc != m_edge_grad) { mexErrMsgTxt("Locations and gradients must correspond."); } edge_grad = mxGetPr(EDG_G); /* Get pp */ pp = mxGetPr(PP); scale=mxGetPr(SCALE); r_res = mxGetScalar(R_RES); th_res = mxGetScalar(T_RES); /* Get map*/ nmap = (int)(800.0**scale/r_res) + 1; mmap = (int)(3.141/th_res) + 1; map = mxGetPr(MAP); /* Get Kernels*/ m_kern = mxGetNumberOfElements(KERN); m_kern_f = mxGetNumberOfElements(KERNF); kernels = KERN; kernels_flip = KERNF; k_max = KMAX; loopThroughRemove(); NMAP=mxCreateSharedDataCopy(MAP); return; } /*end mexFunction*/ ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/mexfiles/mexVoteEdges_v3_scale.c ================================================ /* * Function: mexVoteEdges_v2 * * Input: Kernel value matrices (regular and flipped), and dimensional * arguments, along with the voting map * * Output: Updated voting map * * Author: Ron Tal * * * Usage: Compiled and called through Matlab * */ /* Include the following header files */ # include "mex.h" #include "matrix.h" #include #include #define PI 3.141 #define RMAX 400.0 /* Input Arguments */ #define EDG_L prhs[0] #define EDG_G prhs[1] #define KERN prhs[2] #define KERNF prhs[3] #define R_RES prhs[4] #define T_RES prhs[5] #define PP prhs[6] #define KMAX prhs[7] #define SCALE prhs[8] /* Output Arguments */ #define NMAP plhs[0] /* STRUCTS */ typedef struct { int m; int n; } matPoint; typedef struct { double r; double th; } houghPoint; /* Global variables: */ mwSize mmap, nmap, m_edge_loc, n_edge_loc, m_edge_grad, n_edge_grad, m_kern, m_kern_f; double* edge_loc, * edge_grad, * pp, r_res, th_res; double* map,*scale; mxArray* kernels, *kernels_flip, * k_max; int round_f (double val) { return floor(val + 0.5); } double round2frac(double val, double res) { double lrg = val/res; double rnd = (double) round_f(lrg); return rnd*res; } matPoint hough2mat(double r, double th, double rres, double thres) { matPoint val; val.n = round_f((r + (double)RMAX**scale ) / rres + 1); val.m = round_f(th / thres + 1); return val; } houghPoint mat2hough(int m, int n, double rres, double thres) { houghPoint val; val.th = round2frac(m*thres, thres); val.r = round2frac(n*rres - (double)RMAX**scale, rres); return val; } void houghVoteMap(matPoint center, mxArray * k, mxArray * k_f, mxArray * k_m, int x, int y, int r_th, int xd, int yd) { /* Get Kernel properties */ int i; int m = center.m; int n = center.n; int m_ker, n_max, m_max, n_lim_pos, n_lim_neg, m_lim_pos, m_lim_neg, n_ker; double * kernel; double * kernel_flip; double * k_mx; double val; double kvalue; int xx, yy; m_ker = mxGetM(k); n_ker = mxGetN(k); kernel = mxGetPr(k); kernel_flip = mxGetPr(k_f); k_mx = mxGetPr(k_m); n_max = k_mx[0]; m_max = k_mx[1]; n_lim_pos = n + (n_max-1)/2 - 1; n_lim_neg = n - (n_max-1)/2 - 1; m_lim_pos = m + (m_max-1)/2 - 1; m_lim_neg = m - (m_max-1)/2 - 1; xx = round_f(x + (double)pp[0]); yy = round_f(y + (double)pp[1]); /* Vote for each valid kernel value */ for (i = 0; i < m_ker; i++) { int m_on_map; int n_on_map; m_on_map = m_lim_neg + (int)kernel[m_ker + i] - 1; n_on_map = n_lim_neg + (int)kernel[i] - 1; /* Out of R bounds: do nothing */ if (n_on_map <= 0 ||n_on_map >= nmap) continue; /* Handle wraparound in TH domain: to be added later: */ else if( m_on_map < 0) { m_on_map = mmap + m_on_map ; n_on_map = nmap - n_on_map ; if (n_on_map < 0 ||n_on_map >= nmap) continue; kvalue = kernel[2*m_ker + (m_ker - i - 1)]; map[(n_on_map )*mmap + m_on_map] += kvalue; }else if(m_on_map >= mmap) { m_on_map = m_on_map - mmap ; n_on_map = nmap - n_on_map ; kvalue = kernel[2*m_ker + (m_ker - i)]; map[(n_on_map )*mmap + m_on_map] += kvalue; } /* No wraparound */ else { kvalue = kernel[2*m_ker + i]; map[(n_on_map )*mmap + m_on_map] += kvalue; } } } void loopThrough() { int xx, yy; int i = 0; for (i = 0; i < m_edge_loc;i++ ) { double r, th; double * kernel, * kernel_flip, * k_m, * m_l; int r_th; matPoint center; int xx, yy, ind; double x = (double)edge_loc[i] - (double)pp[0]; double y = (double)edge_loc[m_edge_loc + i] - (double)pp[1]; int xd = round_f((double)edge_loc[i]); int yd = round_f((double)edge_loc[m_edge_loc + i]); th = edge_grad[i]; if (th == 4.0) continue; if (th < 0) th += PI; if (th > PI) th -= PI; th = PI - th; r = x * cos(th) + y * sin(th); th = round2frac(th, th_res); r = round2frac(r, r_res); r_th = round_f(- x * sin(th) + y * cos(th)); if (r_th > (int)(400**scale)) r_th = (int)(400**scale); else if(r_th < - (int)(400**scale)) r_th = -(int)(400**scale); if (r_th == 0) { ind = 0; } else { ind = r_th + (double)RMAX**scale; } kernel = mxGetCell(kernels, ind); kernel_flip = mxGetCell(kernels_flip, ind); k_m = mxGetCell(k_max, ind); /* Center of kernel on voting map */ center = hough2mat(r, th, r_res, th_res); houghVoteMap(center,kernel, kernel_flip, k_m, x, y, r_th, xd, yd); } } void mexFunction ( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) /* * Function: mexFunction * * Inputs: nrhs -> Integer representing the number of input arguments * sent from Matlab. * * prhs[] -> An mxArray structure of size nrhs holding pointers * to arguments sent from Matlab. * * nlhs -> Integer representing the number of output arguments * requested from Matlab. * * plhs[] -> An mxArray structure of size nlhs holding pointers * to the location of output arguments. * * Outputs: (void) * * Functionality: Analogous to a 'main' function. This function will * be activated by default when Matlab calls this C * function. Used to interface between C and Matlab, * as to ensure output is in the location and format * Matlab expecs. */ { /* Check for proper number of arguments */ if (nrhs != 9) { mexErrMsgTxt("Eight input arguments required."); } printf("Inside C function_v2\n"); /* Get edge locations */ m_edge_loc = mxGetM(EDG_L); n_edge_loc = mxGetN(EDG_L); edge_loc = mxGetPr(EDG_L); if (n_edge_loc != 2) { mexErrMsgTxt("Wrong edge locations format."); } /* Get edge gradients */ m_edge_grad = mxGetM(EDG_G); n_edge_grad = mxGetN(EDG_G); if (n_edge_grad != 1) { mexErrMsgTxt("Wrong edge gradient format."); } if (m_edge_loc != m_edge_grad) { mexErrMsgTxt("Locations and gradients must correspond."); } edge_grad = mxGetPr(EDG_G); /* Get pp */ pp = mxGetPr(PP); r_res = mxGetScalar(R_RES); th_res = mxGetScalar(T_RES); scale=mxGetPr(SCALE); /* Get map*/ nmap = (int)(800**scale/r_res) + 1; mmap = (int)(3.141/th_res) + 1; NMAP = mxCreateDoubleMatrix(mmap, nmap, mxREAL); map = mxGetPr(NMAP); /* Get Kernels*/ m_kern = mxGetNumberOfElements(KERN); m_kern_f = mxGetNumberOfElements(KERNF); kernels = KERN; kernels_flip = KERNF; k_max = KMAX; loopThrough(); return; } /*end mexFunction*/ ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/mexfiles/returnLines.m ================================================ function [begin_points,end_points,lslength,startpositions,endpositions]=returnLines(points_proj,final_labels) count = 0; on_seg = false; begin_pointsT = zeros(20,2); counter_begin_points=1; end_pointsT = zeros(20,2); counter_end_points=1; lslengthT = zeros(20,1); counter_lslength=1; startpos = 0; startpositionsT = zeros(20,1); counter_startpositions=1; endpositionsT = zeros(20,1); counter_endpositions=1; for i = 1:length(final_labels); if ~on_seg if final_labels(i) == 1 begin_pointsT(counter_begin_points,:)=points_proj(i,:); counter_begin_points=counter_begin_points+1; startpositionsT(counter_startpositions) = i; counter_startpositions=counter_startpositions+1; startpos = i; on_seg = true; count = count + 1; end elseif i == length(final_labels) end_pointsT(counter_end_points,:) =points_proj(i,:); counter_end_points=counter_end_points+1; endpositionsT(counter_endpositions) = i; counter_endpositions=counter_endpositions+1; lslengthT(counter_lslength) = i-startpos; counter_lslength=counter_lslength+1; on_seg = false; elseif final_labels(i) == 0 end_pointsT(counter_end_points,:) = points_proj(i-1,:); counter_end_points=counter_end_points+1; endpositionsT(counter_endpositions) = i-1; counter_endpositions=counter_endpositions+1; lslengthT(counter_lslength) = i-startpos; counter_lslength=counter_lslength+1; on_seg = false; end end begin_points = begin_pointsT(1:counter_begin_points-1,:); end_points =end_pointsT(1:counter_end_points-1,:); lslength =lslengthT(1:counter_lslength-1); startpositions =startpositionsT(1:counter_startpositions); endpositions =endpositionsT(1:counter_endpositions-1); end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/mexfiles/returnLines.prj ================================================ option.BuildFolder.Project option.GlobalDataSyncMethod.SyncAlways option.VerificationMode.None option.VerificationStatus.Passed false false option.BuildFolder.Project true option.target.TargetType.MatlabHost Generic MATLAB Host Computer true 8 16 32 64 64 32 64 64 64 option.HardwareEndianness.Little true true option.HardwareAtomicIntegerSize.Char option.HardwareAtomicFloatSize.None option.HardwareDivisionRounding.Zero Generic MATLAB Host Computer false 8 16 32 64 64 32 64 64 64 option.HardwareEndianness.Little true true option.HardwareAtomicIntegerSize.Char option.HardwareAtomicFloatSize.None option.HardwareDivisionRounding.Zero option.BuildFolder.Project option.objective.c inputTypes demo_start_v2 option.UseGlobals.No ${PROJECT_ROOT}/returnLines_mex.mexmaci64 true true 354917700 false false true codegen/mex/returnLines 980166774 codegen/mex/returnLines 946828686 demo_start_v2 <?xml version="1.0" encoding="UTF-8" standalone="yes"?><checksum><includedFiles><file>/Users/yimingqian/Dropbox/My Publications/CVPR 2017/code/LineSegDet2017/code/mexfiles/returnLines.m</file></includedFiles><value>811592531</value></checksum> <?xml version="1.0" encoding="UTF-8" standalone="yes"?><sourceModel><primarySourceFiles><file>/Users/yimingqian/Dropbox/My Publications/CVPR 2017/code/LineSegDet2017/code/mexfiles/returnLines.m</file></primarySourceFiles><fixedPointSourceFiles/><fixedPointSourceRegistered>false</fixedPointSourceRegistered><fixedPointSourceSelected>false</fixedPointSourceSelected></sourceModel> false false true returnLines_mex returnLines option.target.artifact.mex ${PROJECT_ROOT}/returnLines_mex.mexmaci64 false option.FixedPointMode.None _fixpt double :inf x 2 true false double 1 x :inf true false /Users/yimingqian/Dropbox/My Publications/CVPR 2017/code/LineSegDet2017/demo_start_v2.m /Users/yimingqian/Dropbox/My Publications/CVPR 2017/code/LineSegDet2017/code/mexfiles/returnLines_mex.mexmaci64 /Applications/MATLAB_R2015b.app true true true true true true false false false false false false 10.12.6 false true maci64 true ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/mexfiles/sampleLine.m ================================================ function L = sampleLine(rho,theta,m,n,pp) %Returns locations of line samples together with the locations %of the associated pixels in the image. %(rho, theta) represents the line as per Fig. 1 of Tal (2012): %rho = x*cos(theta) + y*sin(theta) <--> ax + by + c = 0 where %a = cos(theta), b = sin(theta), c = -rho. %pp is the principal point, in pixels. %(m, n) is the width and height of the image in pixels. %The returned matrix L is N x 4, where N is the number of %samples on the line. The 4 columns represent (x,y,xp,yp) %where (x,y) indicates the real-valued location of the line %sample and (xp,yp) represents the integer-valued location %of the associated pixel. Note that the y index increases down. %Translate to standard representation of line a = cos(theta); b = sin(theta); c = -rho; %Location of centre of image x0 = pp(1); y0 = pp(2); %Find image bounds left = 1 - x0; right = m - x0; top = 1 - y0; bottom = n - y0; %Identify pixels within 2 pixels of line maxpts = round(5*sqrt(m^2+n^2)); %Pre-allocate for efficiency xp = zeros(maxpts,1);yp = zeros(maxpts,1); idx = 1; %Closer to horizontal - march along x. if theta > pi/4 && theta < 3*pi/4 x = left:right; yu = floor(min(bottom,(-c+2 - x*a)/b)); yl = ceil(max(top,(-c-2 - x*a)/b)); for i = 1:m npts = max(0,yu(i)-yl(i) + 1); xp(idx:idx + npts-1) = x(i); yp(idx:idx + npts-1) = yl(i):yu(i); idx = idx + npts; end else %Closer to vertical - march along y y = top:bottom; %if theta pi/4 & theta < 3*pi/4 % [x,idx] = sort(x); % else % [y,idx] = sort(y); % end % L = L(idx,:); % npts = size(L,1); % npts; % figure; % eps = endpoints(rho,theta,left,right,top,bottom); % plot(eps(:,1),eps(:,2),'r'); % hold on; % plot(xp,yp,'.'); % axis ij; % axis equal; % axis([left,right,top,bottom]); ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/mexfiles/sampleLine.prj ================================================ false option.WorkingFolder.Project option.BuildFolder.Project true true true true option.GlobalDataSyncMethod.SyncAlways true option.DynamicMemoryAllocation.Threshold 65536 200000 option.FilePartitionMethod.MapMFileToCFile true false false true false false option.VerificationMode.None option.VerificationStatus.Passed false 40000 option.PreserveVariableNames.UserNames option.TargetLang.C true 10 200 4000 true 64 true true option.ConstantInputs.CheckValues false option.WorkingFolder.Project option.BuildFolder.Project true true 65536 200000 option.FilePartitionMethod.MapMFileToCFile true false $M$N $M$N $M$N $M$N $M$N $M$N emxArray_$M$N true false false false true Automatically locate an installed toolchain option.target.TargetType.MatlabHost Generic MATLAB Host Computer true 8 16 32 64 64 32 64 64 64 option.HardwareEndianness.Little true true option.HardwareAtomicIntegerSize.Char option.HardwareAtomicFloatSize.None option.HardwareDivisionRounding.Zero Generic MATLAB Host Computer false 8 16 32 64 64 32 64 64 64 option.HardwareEndianness.Little true true option.HardwareAtomicIntegerSize.Char option.HardwareAtomicFloatSize.None option.HardwareDivisionRounding.Zero 40000 option.GenerateExampleMain.GenerateCodeOnly option.PreserveVariableNames.UserNames option.TargetLang.C 10 200 4000 true 64 true true option.WorkingFolder.Project option.BuildFolder.Project true false option.objective.c inputTypes demo_start_v2 option.UseGlobals.No ${PROJECT_ROOT}/sampleLine_mex.mexmaci64 true true true 1898965005 false false true codegen/mex/sampleLine 2341851798 codegen/mex/sampleLine 2739719242 demo_start_v2 false <?xml version="1.0" encoding="UTF-8" standalone="yes"?><checksum><includedFiles><file>/Users/yimingqian/Dropbox/My Publications/CVPR 2017/code/LineSegDet2017/code/mexfiles/sampleLine.m</file></includedFiles><value>1282936523</value></checksum> <?xml version="1.0" encoding="UTF-8" standalone="yes"?><sourceModel><primarySourceFiles/><fixedPointSourceFiles/><fixedPointSourceRegistered>false</fixedPointSourceRegistered><fixedPointSourceSelected>false</fixedPointSourceSelected></sourceModel> false false true sampleLine_mex sampleLine option.target.artifact.mex ${PROJECT_ROOT}/sampleLine_mex.mexmaci64 true false option.FixedPointMode.None 16 4 0 fimath('RoundingMethod', 'Floor', 'OverflowAction', 'Wrap', 'ProductMode', 'FullPrecision', 'MaxProductWordLength', 128, 'SumMode', 'FullPrecision', 'MaxSumWordLength', 128) option.FixedPointTypeSource.SimAndDerived false false false false true true false _fixpt false false option.DefaultFixedPointSignedness.Automatic option.FixedPointTypeProposalMode.ProposeFractionLengths double 1 x 1 false false double 1 x 1 false false double 1 x 1 false false double 1 x 1 false false double 1 x 2 false false /Users/yimingqian/Dropbox/My Publications/CVPR 2017/code/LineSegDet2017/demo_start_v2.m /Users/yimingqian/Dropbox/PhD/Road Evaluation Project/roadDetectionCode/code/LineSegDet2017/demo_start_v2.m /Users/yimingqian/Dropbox/My Publications/CVPR 2017/code/LineSegDet2017/code/mexfiles/sampleLine_mex.mexmaci64 /Applications/MATLAB_R2015b.app true true true true true true false false false false false false 10.12.6 false true maci64 true ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/precompute_kernels_sparse_res2.m ================================================ function [ kernels, kernels_flip, kernel_params] = precompute_kernels_sparse_res2(r_max, SIGMA_X, SIGMA_TH, r_res, th_res) %PRECOMPUTE_KERNELS Precomputes the kernels for Hough Transform % % Inputs: % r_max: Maximum value r_th can take % SIGMA_X: Variance of the distribution of position % SIGMA_TH: Variance of the distribution of angular % uncertainty % % Output: % kernels: Precomputed kernels for the ranges % % Author: % Ron Tal % % Date: % January 18, 2009 % % Description: % This function precomputes the kernels to be used in the % Hough Transform method. The kernels are computed for the % given range at the given resolutions, using the given sigma % values. % % Recommended value for SIGMA_TH: 0.1308 % Recommended value for SIGMA_X: 0.3933 % kernels = cell(1, r_max); kernels_flip = cell(1, r_max); kernel_params = cell(1, r_max); for e = -r_max:1:r_max [kern,ind]=computeKernel(e,r_max,SIGMA_X, SIGMA_TH, r_res, th_res); kernels(1, ind) = {kern}; kernels_flip(1, ind) = {kern}; kernel_params(1, ind) = {max(kern)}; end end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/project_point_to_line_segment_vec.m ================================================ function [q, d] = project_point_to_line_segment_vec(A,B,p) % returns q the closest point to p on the line segment from A to B % q = zeros(size(p)); % vector from A to B % Vectorize input [m, n] = size(p); A_v = repmat(A,m,1); B_v = repmat(B, m,1); AB = (B_v-A_v); % squared distance from A to B AB_squared = dot(AB(1,:),AB(1,:)); if(AB_squared == 0) % A and B are the same point q = A_v; else % vector from A to p Ap = (p-A_v); t = dot(Ap,AB, 2)/AB_squared; q = A_v + repmat(t,1,2).* AB; q(t < 0.0,:) = A_v(t < 0.0,:); q(t > 1.0,:) = B_v(t > 1.0,:); end diff = q-p; d = sqrt(diff(:,1).^2 + diff(:,2).^2); end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/run_lineSegmentAlgorithm.m ================================================ function [out, P] = run_lineSegmentAlgorithm(kernels, kernels_flip, kernel_params, sig_bound, r_res, th_res, img,scale_factor,pp) frac = 0.05; %the maximum number of lines that could be extract from the algorithm maxLine=5000; LIKE_MODEL = load(['parameters', filesep, 'likelihood_model.mat']); [P, edgeStruct] = determine_hough_lines_kernel_vote_remove(img, pp, kernels, kernels_flip, maxLine, kernel_params, r_res, th_res, sig_bound, frac,scale_factor); [begin_points, end_points,ls_likelihoods] = get_all_segments_assoc_edgeremoval( P, edgeStruct, pp, LIKE_MODEL, scale_factor); ttlLS = size(begin_points,1); out = zeros(ttlLS,5); for dd = 1:ttlLS out(dd,:) = [begin_points(dd,1), begin_points(dd,2), end_points(dd,1), end_points(dd,2),ls_likelihoods(dd)]; %E.A. end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/trace_Back.m ================================================ function [ lsjoint, lslogz, final_labels, on_nodes, likelihoods ] = trace_Back(DP_table, aux_table, z, node_idx, obsLike) % It traces back the dinamic programming results assigning labels to each % position (On, Off). It also computes the joint probability and the log % evidenct for each line segment. Additionally computes the sum of the % marginals of all locations along the detected segments % % Input % - DP_Table: Table that contains the partial results of the Dynamic % programing solution % - aux_table: table that contains the labels and it will be used to % unbound the results % - z: Normalization constant % - gamma: Marginals at each position along the line % - node_idx: Locations along the line to be considered % % Output: % - lsjoint: Joint probabilty at segment level % - lslogz: Evidence of line segments % - lsgamma: Sum of the marginals of the positions along segments % - final_labels: labels associated with the positions along the line % - on_nodes: list of indeces associated with a segment final_labels = zeros(1, length(node_idx)); [~, final_labels(1,end)] = max(DP_table(:,end)); on_nodes = []; lsjoint = []; lslogz = []; likelihoods = []; prev = 2; %control start and end line segments -- E.A. logz_tmp = 0; ctrl = 0; % used to control end of the line cases lsId = 1; for i = length(node_idx)-1:-1:1 ind = final_labels(i+1); final_labels(i) = aux_table(ind, i+1); %sum the log of the partial evidences. if ctrl == 1 && ind == 1 logz_tmp = logz_tmp + log(z(i+1)); % lsgamma(:,lsId) = lsgamma(:,lsId) + gamma(:,i+1); likelihoods(lsId) = likelihoods(lsId) + obsLike(1,i+1); on_nodes = [on_nodes; node_idx(i+1)]; end if ind == 1 && prev == 2 %begining of a segment endProb = DP_table(ind,i+1); logz_tmp = log(z(i+1)); % lsgamma(:,lsId) = gamma(:,i+1); likelihoods(lsId) = obsLike(1,i+1); on_nodes = [on_nodes; node_idx(i+1)]; ctrl = 1; elseif ind == 2 && prev == 1 startProb = DP_table(ind, i+1); lsjoint = [lsjoint; endProb - startProb]; lslogz = [lslogz; logz_tmp]; lsId = lsId + 1; logz_tmp = 0; ctrl = 0; elseif ind == 1 && i == 1 lsjoint = [lsjoint; endProb]; lslogz = [lslogz; logz_tmp]; end prev = ind; %% end %% E.A. Posterior prob. lsjoint = flipud(lsjoint); %E.A. To match the line segment output lslogz = flipud(lslogz); %E.A. To match the line segment output likelihoods = fliplr(likelihoods); end ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/utils/getDebug.m ================================================ function r = getDebug global debug r = debug; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/utils/getImg.m ================================================ function r = getImg global origImg r = origImg; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/utils/getLegend.m ================================================ function r = getLegend global legendStr r = legendStr; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/utils/setDebug.m ================================================ function setDebug(val) global debug debug = val; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/utils/setImg.m ================================================ function setImg(img) global origImg origImg = img; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/code/utils/setLegend.m ================================================ function setLegend(val) global legendStr legendStr = val; ================================================ FILE: thirdparty/MCMLSD/MCMLSD/demo_start_v2.m ================================================ clear clc close all addpath(genpath('code/')); addpath('Imgs/'); img = imread(['Imgs', filesep, 'P1040823hr.jpg']); img = imresize(img, [round(size(img,1)/4), round(size(img,2)/4)]); %compute the kernel for the image size %you only need to compute the kernal once for one an image size [kernels, kernels_flip, kernel_params] =kernelInitialization(img); ticId = tic; %the lines variable contains the detected line segmentations it arranged as %[x1 y1 x2 y2 probability] %The fullLines are the detected lines. It is arranged as [rho theta probability] [lines, fullLines] =lineSegmentation_HighRes(img,kernels, kernels_flip, kernel_params); display('Total time'); toc(ticId) fig = figure; imshow(img); hold all %Order lines by probability lines = sortrows(lines, -5); ttlLines = size(lines,1); for i = 1:90 %plot the top 90 lines line([lines(i,1) lines(i,3)], [lines(i,2) lines(i,4)],'Color', rand(1,3), 'LineWidth', 3); end %please use code in Evaluation code.zip to evaluate the performance of the line segmentation algorithm