From 6f6fb5f0d48878d8113a2303ad0655ed97646d39 Mon Sep 17 00:00:00 2001 From: ChaoWang1016 Date: Fri, 23 Feb 2024 15:33:47 +0800 Subject: [PATCH] New --- 1. Hierarchical Invariants/Functions/DIR.m | 50 +++ 1. Hierarchical Invariants/Functions/HI.m | 32 ++ .../Functions/MOMENT/getBF.m | 161 ++++++++ .../Functions/MOMENT/getBFM_RBF.m | 17 + .../Functions/MOMENT/getCHFM_RBF.m | 40 ++ .../Functions/MOMENT/getEFM_RBF.m | 6 + .../Functions/MOMENT/getFJFM_RBF.m | 38 ++ .../Functions/MOMENT/getGPCET_RBF.m | 6 + .../Functions/MOMENT/getGPCT_RBF.m | 10 + .../Functions/MOMENT/getGPST_RBF.m | 6 + .../Functions/MOMENT/getGRHFM_RBF.m | 12 + .../Functions/MOMENT/getJFM_RBF.m | 40 ++ .../Functions/MOMENT/getOFMM_RBF.m | 41 ++ .../Functions/MOMENT/getPCET_RBF.m | 6 + .../Functions/MOMENT/getPCT_RBF.m | 10 + .../Functions/MOMENT/getPJFM_RBF.m | 40 ++ .../Functions/MOMENT/getPST_RBF.m | 6 + .../Functions/MOMENT/getPZM_RBF.m | 44 ++ .../Functions/MOMENT/getRHFM_RBF.m | 12 + .../Functions/MOMENT/getZM_RBF.m | 48 +++ .../Functions/MOMENT/ro.m | 36 ++ .../Functions/addcolorplus.m | 384 ++++++++++++++++++ .../Functions/addnoise.m | 21 + .../Functions/bf_filter.m | 17 + .../Functions/bf_filter_fft.m | 13 + .../Functions/bf_filter_fft_scale.m | 6 + .../Functions/imattack.m | 53 +++ .../Functions/tight_subplot.m | 62 +++ 1. Hierarchical Invariants/Image/text.jpg | Bin 0 -> 229841 bytes 1. Hierarchical Invariants/main_demo.m | 47 +++ .../Krawtchouk_moments.m | 83 ++++ .../convolutional_neural_network.m | 144 +++++++ .../discrete_cosine_transform.m | 74 ++++ .../discrete_wavelet_transform.m | 75 ++++ .../2.1 Texture Classification/function/DIR.m | 49 +++ .../2.1 Texture Classification/function/HI.m | 32 ++ .../function/MOMENT/KM_BF.m | 52 +++ .../function/MOMENT/KM_D.m | 52 +++ .../function/MOMENT/getBF.m | 161 ++++++++ .../function/MOMENT/getBFM_RBF.m | 17 + .../function/MOMENT/getCHFM_RBF.m | 40 ++ .../function/MOMENT/getEFM_RBF.m | 6 + .../function/MOMENT/getFJFM_RBF.m | 38 ++ .../function/MOMENT/getGPCET_RBF.m | 6 + .../function/MOMENT/getGPCT_RBF.m | 10 + .../function/MOMENT/getGPST_RBF.m | 6 + .../function/MOMENT/getGRHFM_RBF.m | 12 + .../function/MOMENT/getJFM_RBF.m | 40 ++ .../function/MOMENT/getOFMM_RBF.m | 41 ++ .../function/MOMENT/getPCET_RBF.m | 6 + .../function/MOMENT/getPCT_RBF.m | 10 + .../function/MOMENT/getPJFM_RBF.m | 40 ++ .../function/MOMENT/getPST_RBF.m | 6 + .../function/MOMENT/getPZM_RBF.m | 44 ++ .../function/MOMENT/getRHFM_RBF.m | 12 + .../function/MOMENT/getZM_RBF.m | 48 +++ .../function/MOMENT/ro.m | 36 ++ .../function/PCAClassifier.m | 50 +++ .../function/PCAModel.m | 47 +++ .../function/bf_filter.m | 17 + .../function/bf_filter_fft.m | 13 + .../function/bf_filter_fft_scale.m | 6 + .../function/customreader_imgeo.m | 15 + .../function/customreader_imgeo_cnn.m | 15 + .../function/feature_extraction_dct.m | 9 + .../function/feature_extraction_dwt.m | 28 ++ .../function/feature_extraction_hi.m | 15 + .../function/feature_extraction_km.m | 16 + .../function/feature_extraction_scattering.m | 12 + .../function/multiclass_metrics_common.m | 93 +++++ .../function/multiclass_metrics_special.m | 161 ++++++++ .../function/ring_integral.m | 17 + .../function/tight_subplot.m | 62 +++ .../hierarchical_invariants.m | 93 +++++ .../scattering_network.m | 75 ++++ .../Krawtchouk_moments.m | 83 ++++ .../convolutional_neural_network.m | 145 +++++++ .../discrete_cosine_transform.m | 74 ++++ .../discrete_wavelet_transform.m | 75 ++++ .../2.2 Digit Classification/function/DIR.m | 49 +++ .../2.2 Digit Classification/function/HI.m | 32 ++ .../function/MOMENT/KM_BF.m | 52 +++ .../function/MOMENT/KM_D.m | 52 +++ .../function/MOMENT/getBF.m | 161 ++++++++ .../function/MOMENT/getBFM_RBF.m | 17 + .../function/MOMENT/getCHFM_RBF.m | 40 ++ .../function/MOMENT/getEFM_RBF.m | 6 + .../function/MOMENT/getFJFM_RBF.m | 38 ++ .../function/MOMENT/getGPCET_RBF.m | 6 + .../function/MOMENT/getGPCT_RBF.m | 10 + .../function/MOMENT/getGPST_RBF.m | 6 + .../function/MOMENT/getGRHFM_RBF.m | 12 + .../function/MOMENT/getJFM_RBF.m | 40 ++ .../function/MOMENT/getOFMM_RBF.m | 41 ++ .../function/MOMENT/getPCET_RBF.m | 6 + .../function/MOMENT/getPCT_RBF.m | 10 + .../function/MOMENT/getPJFM_RBF.m | 40 ++ .../function/MOMENT/getPST_RBF.m | 6 + .../function/MOMENT/getPZM_RBF.m | 44 ++ .../function/MOMENT/getRHFM_RBF.m | 12 + .../function/MOMENT/getZM_RBF.m | 48 +++ .../function/MOMENT/ro.m | 36 ++ .../function/PCAClassifier.m | 50 +++ .../function/PCAModel.m | 47 +++ .../function/bf_filter.m | 17 + .../function/bf_filter_fft.m | 13 + .../function/bf_filter_fft_scale.m | 6 + .../function/customreader_imgeo.m | 9 + .../function/customreader_imgeo_cnn.m | 10 + .../function/feature_extraction_dct.m | 9 + .../function/feature_extraction_dwt.m | 28 ++ .../function/feature_extraction_hi.m | 15 + .../function/feature_extraction_km.m | 16 + .../function/feature_extraction_scattering.m | 12 + .../function/multiclass_metrics_common.m | 93 +++++ .../function/multiclass_metrics_special.m | 161 ++++++++ .../function/ring_integral.m | 17 + .../function/tight_subplot.m | 62 +++ .../hierarchical_invariants.m | 94 +++++ .../scattering_network.m | 75 ++++ .../Krawtchouk_moments.m | 59 +++ .../convolutional_neural_network.m | 86 ++++ .../discrete_cosine_transform.m | 50 +++ .../discrete_wavelet_transform.m | 51 +++ .../function/DIR.m | 49 +++ .../2.3 Parasite Classification/function/HI.m | 32 ++ .../function/MOMENT/KM_BF.m | 52 +++ .../function/MOMENT/KM_D.m | 52 +++ .../function/MOMENT/getBF.m | 161 ++++++++ .../function/MOMENT/getBFM_RBF.m | 17 + .../function/MOMENT/getCHFM_RBF.m | 40 ++ .../function/MOMENT/getEFM_RBF.m | 6 + .../function/MOMENT/getFJFM_RBF.m | 38 ++ .../function/MOMENT/getGPCET_RBF.m | 6 + .../function/MOMENT/getGPCT_RBF.m | 10 + .../function/MOMENT/getGPST_RBF.m | 6 + .../function/MOMENT/getGRHFM_RBF.m | 12 + .../function/MOMENT/getJFM_RBF.m | 40 ++ .../function/MOMENT/getOFMM_RBF.m | 41 ++ .../function/MOMENT/getPCET_RBF.m | 6 + .../function/MOMENT/getPCT_RBF.m | 10 + .../function/MOMENT/getPJFM_RBF.m | 40 ++ .../function/MOMENT/getPST_RBF.m | 6 + .../function/MOMENT/getPZM_RBF.m | 44 ++ .../function/MOMENT/getRHFM_RBF.m | 12 + .../function/MOMENT/getZM_RBF.m | 48 +++ .../function/MOMENT/ro.m | 36 ++ .../function/PCAClassifier.m | 50 +++ .../function/PCAModel.m | 47 +++ .../function/bf_filter.m | 17 + .../function/bf_filter_fft.m | 13 + .../function/bf_filter_fft_scale.m | 6 + .../function/customreader_imnoi.m | 8 + .../function/customreader_imnoi_cnn.m | 8 + .../function/feature_extraction_dct.m | 9 + .../function/feature_extraction_dwt.m | 28 ++ .../function/feature_extraction_hi.m | 14 + .../function/feature_extraction_km.m | 16 + .../function/feature_extraction_scattering.m | 12 + .../function/multiclass_metrics_common.m | 93 +++++ .../function/multiclass_metrics_special.m | 161 ++++++++ .../function/ring_integral.m | 17 + .../function/tight_subplot.m | 62 +++ .../hierarchical_invariants.m | 69 ++++ .../scattering_network.m | 51 +++ .../Krawtchouk_moments.m | 73 ++++ .../convolutional_neural_network.m | 119 ++++++ .../discrete_cosine_transform.m | 64 +++ .../discrete_wavelet_transform.m | 65 +++ .../function/DIR.m | 49 +++ .../function/HI.m | 32 ++ .../function/MOMENT/KM_BF.m | 52 +++ .../function/MOMENT/KM_D.m | 52 +++ .../function/MOMENT/getBF.m | 161 ++++++++ .../function/MOMENT/getBFM_RBF.m | 17 + .../function/MOMENT/getCHFM_RBF.m | 40 ++ .../function/MOMENT/getEFM_RBF.m | 6 + .../function/MOMENT/getFJFM_RBF.m | 38 ++ .../function/MOMENT/getGPCET_RBF.m | 6 + .../function/MOMENT/getGPCT_RBF.m | 10 + .../function/MOMENT/getGPST_RBF.m | 6 + .../function/MOMENT/getGRHFM_RBF.m | 12 + .../function/MOMENT/getJFM_RBF.m | 40 ++ .../function/MOMENT/getOFMM_RBF.m | 41 ++ .../function/MOMENT/getPCET_RBF.m | 6 + .../function/MOMENT/getPCT_RBF.m | 10 + .../function/MOMENT/getPJFM_RBF.m | 40 ++ .../function/MOMENT/getPST_RBF.m | 6 + .../function/MOMENT/getPZM_RBF.m | 44 ++ .../function/MOMENT/getRHFM_RBF.m | 12 + .../function/MOMENT/getZM_RBF.m | 48 +++ .../function/MOMENT/ro.m | 36 ++ .../function/PCAClassifier.m | 50 +++ .../function/PCAModel.m | 47 +++ .../function/bf_filter.m | 17 + .../function/bf_filter_fft.m | 13 + .../function/bf_filter_fft_scale.m | 6 + .../function/customreader.m | 9 + .../function/feature_extraction_dct.m | 9 + .../function/feature_extraction_dwt.m | 28 ++ .../function/feature_extraction_hi.m | 15 + .../function/feature_extraction_km.m | 16 + .../function/feature_extraction_scattering.m | 12 + .../function/multiclass_metrics_common.m | 93 +++++ .../function/multiclass_metrics_special.m | 161 ++++++++ .../function/ring_integral.m | 17 + .../function/tight_subplot.m | 62 +++ .../hierarchical_invariants.m | 89 ++++ .../scattering_network.m | 65 +++ 4. AIGC Detection/Krawtchouk_moments.m | 100 +++++ .../convolutional_neural_network.m | 141 +++++++ 4. AIGC Detection/discrete_cosine_transform.m | 94 +++++ .../discrete_wavelet_transform.m | 95 +++++ 4. AIGC Detection/function/DIR.m | 49 +++ 4. AIGC Detection/function/HI.m | 32 ++ 4. AIGC Detection/function/MOMENT/KM_BF.m | 52 +++ 4. AIGC Detection/function/MOMENT/KM_D.m | 52 +++ 4. AIGC Detection/function/MOMENT/getBF.m | 161 ++++++++ .../function/MOMENT/getBFM_RBF.m | 17 + .../function/MOMENT/getCHFM_RBF.m | 40 ++ .../function/MOMENT/getEFM_RBF.m | 6 + .../function/MOMENT/getFJFM_RBF.m | 38 ++ .../function/MOMENT/getGPCET_RBF.m | 6 + .../function/MOMENT/getGPCT_RBF.m | 10 + .../function/MOMENT/getGPST_RBF.m | 6 + .../function/MOMENT/getGRHFM_RBF.m | 12 + .../function/MOMENT/getJFM_RBF.m | 40 ++ .../function/MOMENT/getOFMM_RBF.m | 41 ++ .../function/MOMENT/getPCET_RBF.m | 6 + .../function/MOMENT/getPCT_RBF.m | 10 + .../function/MOMENT/getPJFM_RBF.m | 40 ++ .../function/MOMENT/getPST_RBF.m | 6 + .../function/MOMENT/getPZM_RBF.m | 44 ++ .../function/MOMENT/getRHFM_RBF.m | 12 + 4. AIGC Detection/function/MOMENT/getZM_RBF.m | 48 +++ 4. AIGC Detection/function/MOMENT/ro.m | 36 ++ 4. AIGC Detection/function/PCAClassifier.m | 50 +++ 4. AIGC Detection/function/PCAModel.m | 47 +++ 4. AIGC Detection/function/bf_filter.m | 17 + 4. AIGC Detection/function/bf_filter_fft.m | 13 + .../function/bf_filter_fft_scale.m | 6 + 4. AIGC Detection/function/customreader.m | 9 + .../function/customreader_imgeo.m | 18 + .../function/feature_extraction_dct.m | 9 + .../function/feature_extraction_dwt.m | 28 ++ .../function/feature_extraction_hi.m | 15 + .../function/feature_extraction_km.m | 16 + .../function/feature_extraction_scattering.m | 12 + .../function/multiclass_metrics_common.m | 93 +++++ .../function/multiclass_metrics_special.m | 161 ++++++++ 4. AIGC Detection/function/ring_integral.m | 17 + 4. AIGC Detection/function/tight_subplot.m | 62 +++ 4. AIGC Detection/hierarchical_invariants.m | 117 ++++++ 4. AIGC Detection/scattering_network.m | 92 +++++ 254 files changed, 10484 insertions(+) create mode 100644 1. Hierarchical Invariants/Functions/DIR.m create mode 100644 1. Hierarchical Invariants/Functions/HI.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getBFM_RBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getCHFM_RBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getEFM_RBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getFJFM_RBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getGPCET_RBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getGPCT_RBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getGPST_RBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getGRHFM_RBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getJFM_RBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getOFMM_RBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getPCET_RBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getPCT_RBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getPJFM_RBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getPST_RBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getPZM_RBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getRHFM_RBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/getZM_RBF.m create mode 100644 1. Hierarchical Invariants/Functions/MOMENT/ro.m create mode 100644 1. Hierarchical Invariants/Functions/addcolorplus.m create mode 100644 1. Hierarchical Invariants/Functions/addnoise.m create mode 100644 1. Hierarchical Invariants/Functions/bf_filter.m create mode 100644 1. Hierarchical Invariants/Functions/bf_filter_fft.m create mode 100644 1. Hierarchical Invariants/Functions/bf_filter_fft_scale.m create mode 100644 1. Hierarchical Invariants/Functions/imattack.m create mode 100644 1. Hierarchical Invariants/Functions/tight_subplot.m create mode 100644 1. Hierarchical Invariants/Image/text.jpg create mode 100644 1. Hierarchical Invariants/main_demo.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/Krawtchouk_moments.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/convolutional_neural_network.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/discrete_cosine_transform.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/discrete_wavelet_transform.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/DIR.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/HI.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/KM_BF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/KM_D.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getBFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getCHFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getEFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getFJFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getGPCET_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getGPCT_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getGPST_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getGRHFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getJFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getOFMM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPCET_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPCT_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPJFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPST_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPZM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getRHFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getZM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/ro.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/PCAClassifier.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/PCAModel.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/bf_filter.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/bf_filter_fft.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/bf_filter_fft_scale.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/customreader_imgeo.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/customreader_imgeo_cnn.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_dct.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_dwt.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_hi.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_km.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_scattering.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/multiclass_metrics_common.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/multiclass_metrics_special.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/ring_integral.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/tight_subplot.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/hierarchical_invariants.m create mode 100644 2. Computer Vision and Pattern Recognition/2.1 Texture Classification/scattering_network.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/Krawtchouk_moments.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/convolutional_neural_network.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/discrete_cosine_transform.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/discrete_wavelet_transform.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/DIR.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/HI.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/KM_BF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/KM_D.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getBFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getCHFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getEFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getFJFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getGPCET_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getGPCT_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getGPST_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getGRHFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getJFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getOFMM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPCET_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPCT_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPJFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPST_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPZM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getRHFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getZM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/ro.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/PCAClassifier.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/PCAModel.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/bf_filter.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/bf_filter_fft.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/bf_filter_fft_scale.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/customreader_imgeo.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/customreader_imgeo_cnn.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_dct.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_dwt.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_hi.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_km.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_scattering.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/multiclass_metrics_common.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/multiclass_metrics_special.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/ring_integral.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/tight_subplot.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/hierarchical_invariants.m create mode 100644 2. Computer Vision and Pattern Recognition/2.2 Digit Classification/scattering_network.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/Krawtchouk_moments.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/convolutional_neural_network.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/discrete_cosine_transform.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/discrete_wavelet_transform.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/DIR.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/HI.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/KM_BF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/KM_D.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getBFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getCHFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getEFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getFJFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getGPCET_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getGPCT_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getGPST_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getGRHFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getJFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getOFMM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPCET_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPCT_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPJFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPST_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPZM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getRHFM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getZM_RBF.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/ro.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/PCAClassifier.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/PCAModel.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/bf_filter.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/bf_filter_fft.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/bf_filter_fft_scale.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/customreader_imnoi.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/customreader_imnoi_cnn.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_dct.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_dwt.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_hi.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_km.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_scattering.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/multiclass_metrics_common.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/multiclass_metrics_special.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/ring_integral.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/tight_subplot.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/hierarchical_invariants.m create mode 100644 2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/scattering_network.m create mode 100644 3. Adversarial Example Detection/Krawtchouk_moments.m create mode 100644 3. Adversarial Example Detection/convolutional_neural_network.m create mode 100644 3. Adversarial Example Detection/discrete_cosine_transform.m create mode 100644 3. Adversarial Example Detection/discrete_wavelet_transform.m create mode 100644 3. Adversarial Example Detection/function/DIR.m create mode 100644 3. Adversarial Example Detection/function/HI.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/KM_BF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/KM_D.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getBFM_RBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getCHFM_RBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getEFM_RBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getFJFM_RBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getGPCET_RBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getGPCT_RBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getGPST_RBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getGRHFM_RBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getJFM_RBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getOFMM_RBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getPCET_RBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getPCT_RBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getPJFM_RBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getPST_RBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getPZM_RBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getRHFM_RBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/getZM_RBF.m create mode 100644 3. Adversarial Example Detection/function/MOMENT/ro.m create mode 100644 3. Adversarial Example Detection/function/PCAClassifier.m create mode 100644 3. Adversarial Example Detection/function/PCAModel.m create mode 100644 3. Adversarial Example Detection/function/bf_filter.m create mode 100644 3. Adversarial Example Detection/function/bf_filter_fft.m create mode 100644 3. Adversarial Example Detection/function/bf_filter_fft_scale.m create mode 100644 3. Adversarial Example Detection/function/customreader.m create mode 100644 3. Adversarial Example Detection/function/feature_extraction_dct.m create mode 100644 3. Adversarial Example Detection/function/feature_extraction_dwt.m create mode 100644 3. Adversarial Example Detection/function/feature_extraction_hi.m create mode 100644 3. Adversarial Example Detection/function/feature_extraction_km.m create mode 100644 3. Adversarial Example Detection/function/feature_extraction_scattering.m create mode 100644 3. Adversarial Example Detection/function/multiclass_metrics_common.m create mode 100644 3. Adversarial Example Detection/function/multiclass_metrics_special.m create mode 100644 3. Adversarial Example Detection/function/ring_integral.m create mode 100644 3. Adversarial Example Detection/function/tight_subplot.m create mode 100644 3. Adversarial Example Detection/hierarchical_invariants.m create mode 100644 3. Adversarial Example Detection/scattering_network.m create mode 100644 4. AIGC Detection/Krawtchouk_moments.m create mode 100644 4. AIGC Detection/convolutional_neural_network.m create mode 100644 4. AIGC Detection/discrete_cosine_transform.m create mode 100644 4. AIGC Detection/discrete_wavelet_transform.m create mode 100644 4. AIGC Detection/function/DIR.m create mode 100644 4. AIGC Detection/function/HI.m create mode 100644 4. AIGC Detection/function/MOMENT/KM_BF.m create mode 100644 4. AIGC Detection/function/MOMENT/KM_D.m create mode 100644 4. AIGC Detection/function/MOMENT/getBF.m create mode 100644 4. AIGC Detection/function/MOMENT/getBFM_RBF.m create mode 100644 4. AIGC Detection/function/MOMENT/getCHFM_RBF.m create mode 100644 4. AIGC Detection/function/MOMENT/getEFM_RBF.m create mode 100644 4. AIGC Detection/function/MOMENT/getFJFM_RBF.m create mode 100644 4. AIGC Detection/function/MOMENT/getGPCET_RBF.m create mode 100644 4. AIGC Detection/function/MOMENT/getGPCT_RBF.m create mode 100644 4. AIGC Detection/function/MOMENT/getGPST_RBF.m create mode 100644 4. AIGC Detection/function/MOMENT/getGRHFM_RBF.m create mode 100644 4. AIGC Detection/function/MOMENT/getJFM_RBF.m create mode 100644 4. AIGC Detection/function/MOMENT/getOFMM_RBF.m create mode 100644 4. AIGC Detection/function/MOMENT/getPCET_RBF.m create mode 100644 4. AIGC Detection/function/MOMENT/getPCT_RBF.m create mode 100644 4. AIGC Detection/function/MOMENT/getPJFM_RBF.m create mode 100644 4. AIGC Detection/function/MOMENT/getPST_RBF.m create mode 100644 4. AIGC Detection/function/MOMENT/getPZM_RBF.m create mode 100644 4. AIGC Detection/function/MOMENT/getRHFM_RBF.m create mode 100644 4. AIGC Detection/function/MOMENT/getZM_RBF.m create mode 100644 4. AIGC Detection/function/MOMENT/ro.m create mode 100644 4. AIGC Detection/function/PCAClassifier.m create mode 100644 4. AIGC Detection/function/PCAModel.m create mode 100644 4. AIGC Detection/function/bf_filter.m create mode 100644 4. AIGC Detection/function/bf_filter_fft.m create mode 100644 4. AIGC Detection/function/bf_filter_fft_scale.m create mode 100644 4. AIGC Detection/function/customreader.m create mode 100644 4. AIGC Detection/function/customreader_imgeo.m create mode 100644 4. AIGC Detection/function/feature_extraction_dct.m create mode 100644 4. AIGC Detection/function/feature_extraction_dwt.m create mode 100644 4. AIGC Detection/function/feature_extraction_hi.m create mode 100644 4. AIGC Detection/function/feature_extraction_km.m create mode 100644 4. AIGC Detection/function/feature_extraction_scattering.m create mode 100644 4. AIGC Detection/function/multiclass_metrics_common.m create mode 100644 4. AIGC Detection/function/multiclass_metrics_special.m create mode 100644 4. AIGC Detection/function/ring_integral.m create mode 100644 4. AIGC Detection/function/tight_subplot.m create mode 100644 4. AIGC Detection/hierarchical_invariants.m create mode 100644 4. AIGC Detection/scattering_network.m diff --git a/1. Hierarchical Invariants/Functions/DIR.m b/1. Hierarchical Invariants/Functions/DIR.m new file mode 100644 index 0000000..e0955ca --- /dev/null +++ b/1. Hierarchical Invariants/Functions/DIR.m @@ -0,0 +1,50 @@ +function [featcell,time] = DIR(img,param) +%% input +if size(img,3) ~= 1 + img = rgb2gray(img); +end +img = double(img); +fprintf('START DIR\n'); drawnow(); +timestamp = tic; +%% get basis function data +bfdatacell = cell(1,param.numofscale); +for ns = 1:1:param.numofscale + sizeofbf = param.scales(ns); + if mod(sizeofbf,2) == 1 + sizeofbf = sizeofbf - 1; + end + if param.type_feat == 1 || param.type_feat == 2 + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.ZNM,param.alpha, param.p, param.q); + elseif param.type_feat == 11 || param.type_feat == 17 + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.SNM,param.alpha, param.p, param.q); + else + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.NM,param.alpha, param.p, param.q); + end +end +%% naive feature generation +% raggioU = ceil((sizeofbf-1)/2); +% raggioL = floor((sizeofbf-1)/2); +% featcell = cell(1,param.numofscale); +% for ns = 1:1:param.numofscale +% featcell{ns} = abs(bf_filter(img, bfdatacell{ns})); +% featcell{ns} = featcell{ns}((1+raggioU):(end-raggioL),(1+raggioU):(end-raggioL),:); +% end +%% fast feature generation by FFT (Convolution Theorem) +featcell = cell(1,param.numofscale); +fft_img = fft2(img); +nof = size(bfdatacell{1},3); +fft_img_cell = single(zeros([size(img), nof])); +for i = 1:1:nof + fft_img_cell(:,:,i) = fft_img; +end +featcell{param.numofscale} = abs(bf_filter_fft(img, fft_img_cell, bfdatacell{param.numofscale})); +unisize = size (featcell{param.numofscale}); +for ns = 1:1:param.numofscale-1 + temp = abs(bf_filter_fft(img, fft_img_cell, bfdatacell{ns})); + rr = (size(temp)-unisize)/2; + featcell{ns} = temp ((1+rr(1)):(end-rr(1)),(1+rr(2)):(end-rr(2)),:); +end +%% output +clc; +time = toc(timestamp); +end \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/HI.m b/1. Hierarchical Invariants/Functions/HI.m new file mode 100644 index 0000000..dbcb699 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/HI.m @@ -0,0 +1,32 @@ +function [ord,featcell] = HI(img,param) +K = max(max(param.XNM)); +idx = 1; +featcell = cell(1,1); +ord = zeros(1,1); +for x = 0:K + if x == 0 + param.NM = param.XNM(1,:); + [feat,~] = DIR(img,param); + featcell(1)=feat; + ord(1)=x; + else + param.NM = param.XNM(idx:idx+x,:); + inputfeat=img; + [feat,~] = DIR(inputfeat,param); + for z=1:size(feat{1},3) + featcell = [featcell, {feat{1}(:,:,z)}]; + ord =[ord, x]; + end + for y = idx-x:idx-1 + param.NM = param.XNM(idx:idx+x,:); + inputfeat=featcell{y}; + [feat,~] = DIR(inputfeat,param); + for z=1:size(feat{1},3) + featcell = [featcell, {feat{1}(:,:,z)}]; + ord =[ord, x]; + end + end + end + idx=idx+x+1; +end +end \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getBF.m new file mode 100644 index 0000000..e8c5291 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getBF.m @@ -0,0 +1,161 @@ +function [BF]=getBF(MODE,SZ,NM,alpha,p,q) +[rho,theta]=ro(SZ,SZ); +pz=rho>1; cnt=sum(pz(:));rho(pz)= 0.5; +L=size(NM,1); +BF=zeros(SZ,SZ,L); +%% ZM +if MODE==1 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getZM_RBF(order,repetition,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PZM +elseif MODE==2 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPZM_RBF(order,repetition,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% OFMM +elseif MODE==3 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getOFMM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% CHFM +elseif MODE==4 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getCHFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PJFM +elseif MODE==5 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPJFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% JFM +elseif MODE==6 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getJFM_RBF(order,rho,p,q); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% RHFM +elseif MODE==7 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getRHFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% EFM +elseif MODE==8 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getEFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PCET +elseif MODE==9 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPCET_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PCT +elseif MODE==10 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPCT_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PST +elseif MODE==11 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPST_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% BFM +elseif MODE==12 + v=1; + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getBFM_RBF(order,rho,v); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% FJFM +elseif MODE==13 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getFJFM_RBF(order,rho,p,q,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GRHFM +elseif MODE==14 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGRHFM_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPCET +elseif MODE==15 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPCET_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPCT +elseif MODE==16 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPCT_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPST +elseif MODE==17 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPST_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +end + diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getBFM_RBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getBFM_RBF.m new file mode 100644 index 0000000..7e78f83 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getBFM_RBF.m @@ -0,0 +1,17 @@ +%% REF +% Xiao B, Ma J, Wang X. Image analysis by Bessel¨CFourier moments. Pattern Recognition, 2010, 43(8): 2620-2629. +function [output] = getBFM_RBF(order,rho,v) +Roots=zeros(1,max(order)+2); +syms x; +Roots(1,1)=vpasolve(besselj(v, x) == 0, x); +for i=2:1:max(order)+2 + ST=Roots(1,i-1)+3; + Roots(1,i)=vpasolve(besselj(v, x) == 0, ST); +end +% obtain the order and repetition +n = order; +% compute the radial polynomial +rho=rho*Roots(n+2); +output=besselj(v,rho); +output=output*sqrt((1/(pi*(besselj(v+1,Roots(order+2)))^2))); +end % end getRadialPoly method \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getCHFM_RBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getCHFM_RBF.m new file mode 100644 index 0000000..cf6a8bc --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getCHFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +%¡¡Ping Z, Wu R, Sheng Y. Image description with Chebyshev¨CFourier moments. Journal of the Optical Society of America A, 2002, 19(9): 1748-1754. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getCHFM_RBF(order,rho) +% obtain the order +n = order; +p = 2; q = 1.5; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getEFM_RBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getEFM_RBF.m new file mode 100644 index 0000000..e60c98f --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getEFM_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hu H, Zhang Y, Shao C, et al. Orthogonal moments based on exponent functions: Exponent-Fourier moments. Pattern Recognition, 2014, 47(8): 2596-2606. +function [output] = getEFM_RBF(order,rho) +% compute the radial polynomial +output=sqrt(rho.^(-1)).*exp(1j*2*pi*order.*rho); +end \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getFJFM_RBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getFJFM_RBF.m new file mode 100644 index 0000000..a9d3022 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getFJFM_RBF.m @@ -0,0 +1,38 @@ +%% REF +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getFJFM_RBF(order,rho,p,q,alpha) +% obtain the order +n = order; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getGPCET_RBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getGPCET_RBF.m new file mode 100644 index 0000000..b2dd435 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getGPCET_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPCET_RBF(order,rho,alpha) +% compute the radial polynomial +output=sqrt(alpha*rho.^(alpha-2)).*exp(1j*2*pi*order.*(rho.^alpha)); +end % end getRadialPoly method diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getGPCT_RBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getGPCT_RBF.m new file mode 100644 index 0000000..27b2420 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getGPCT_RBF.m @@ -0,0 +1,10 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPCT_RBF(order,rho,alpha) +% compute the radial polynomial +if order==0 + output=sqrt(alpha*rho.^(alpha-2)); +else + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*cos(pi*order.*rho.^alpha); +end +end \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getGPST_RBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getGPST_RBF.m new file mode 100644 index 0000000..ef8c6d0 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getGPST_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPST_RBF(order,rho,alpha) +% compute the radial polynomial +output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*sin(pi*order.*rho.^alpha); +end % end getRadialPoly method diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getGRHFM_RBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getGRHFM_RBF.m new file mode 100644 index 0000000..f40ccf5 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getGRHFM_RBF.m @@ -0,0 +1,12 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGRHFM_RBF(order,rho,alpha) +% compute the radial polynomial +if order==0 + output=sqrt(alpha*rho.^(alpha-2)); +elseif mod(order,2)==1 + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*sin(pi*(order+1).*rho.^alpha); +else + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*cos(pi*order.*rho.^alpha); +end +end % end getRadialPoly method \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getJFM_RBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getJFM_RBF.m new file mode 100644 index 0000000..b7103d3 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getJFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +% Ping Z, Ren H, Zou J, et al. Generic orthogonal moments: Jacobi¨CFourier moments for invariant image description. Pattern Recognition, 2007, 40(4): 1245-1254. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getJFM_RBF(order,rho,p,q) +% obtain the order +n = order; +alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getOFMM_RBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getOFMM_RBF.m new file mode 100644 index 0000000..4c2fe59 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getOFMM_RBF.m @@ -0,0 +1,41 @@ +%% REF +% Sheng Y, Shen L. Orthogonal Fourier-Mellin moments for invariant pattern recognition. Journal of the Optical Society of America A, 1994, 11(6): 1748-1757. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getOFMM_RBF(order,rho) +% obtain the order +n = order; +p = 2; q = 2; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; + +end % end getRadialPoly method \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getPCET_RBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getPCET_RBF.m new file mode 100644 index 0000000..7700dd6 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getPCET_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPCET_RBF(order,rho) +% compute the radial polynomial +output=exp(1j*2*pi*order.*rho.^2); +end \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getPCT_RBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getPCT_RBF.m new file mode 100644 index 0000000..b67c9c3 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getPCT_RBF.m @@ -0,0 +1,10 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPCT_RBF(order,rho) +% compute the radial polynomial +if order==0 + output=rho.^0; +else + output=sqrt(2).*cos(pi*order.*rho.^2); +end +end \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getPJFM_RBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getPJFM_RBF.m new file mode 100644 index 0000000..4b87097 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getPJFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +%¡¡Amu G, Hasi S, Yang X, et al. Image analysis by pseudo-Jacobi (p=4, q=3)¨CFourier moments. Applied Optics, 2004, 43(10): 2093-2101. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getPJFM_RBF(order,rho) +% obtain the order +n = order; +p = 4; q = 3; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getPST_RBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getPST_RBF.m new file mode 100644 index 0000000..e71350c --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getPST_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPST_RBF(order,rho) +% compute the radial polynomial +output=sqrt(2).*sin(pi*order.*rho.^2); +end \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getPZM_RBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getPZM_RBF.m new file mode 100644 index 0000000..68e7305 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getPZM_RBF.m @@ -0,0 +1,44 @@ +%% REF +% Teh C H, Chin R T. On image analysis by the methods of moments. IEEE Transactions on Pattern Analysis and Machine Intelligence, 1988, 10(4): 496-513. +% Al-Rawi M S. Fast computation of pseudo Zernike moments. Journal of Real-Time Image Processing, 2010, 5(1): 3-10. +function [output] = getPZM_RBF(order,repetition,rho) +N=size(rho,1); M=size(rho,2); +repetition=abs(repetition); +rho=rho(:); +output = zeros(order+1, length(rho) ); +if rho==0 + if repetition==0 + output( (0:order)+1,:)= 1; + else + output( (0:order)+1,:) = 0; + end + output=reshape(output,N,M); + return; +end +q=repetition; p = order; +output(q +1,:) = rho.^q; +if q==p + output=output(end,:); + output=reshape(output,N,M); + return; +end +if q == p-1 + Rpp=rho.^p; + output(p +1,:)=(2*p+1)*Rpp - 2*p*rho.^q; + output=output(end,:); + output=reshape(output,N,M); + return; +end +p=q+1; +Rpp=rho.^p; +output(p +1,:)=(2*p+1)*Rpp - 2*p*rho.^q; +q2=q+2; +for p = q2:order + L1 = ((2*p+1)*2*p)/((p+q +1.0)*(p-q)); + L2 = -2*p + L1*((p+q)*(p-q-1))/(2.0*p-1); + L3 = (2*p-1)*(p-1)- L1*(p+q-1)*(p-q-2)/2.0 + 2*(p-1)*L2; + output(p +1,:) = (L1*rho+L2)'.*output(p-1 +1,:) + L3*output(p-2 +1,:); +end +output=output(end,:); +output=reshape(output,N,M); +end \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getRHFM_RBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getRHFM_RBF.m new file mode 100644 index 0000000..2a59186 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getRHFM_RBF.m @@ -0,0 +1,12 @@ +%% REF +% Ren H, Ping Z, Bo W, et al. Multidistortion-invariant image recognition with radial harmonic Fourier moments. Journal of the Optical Society of America A, 2003, 20(4): 631-637. +function [output] = getRHFM_RBF(order,rho) +% compute the radial polynomial +if order==0 + output=sqrt(rho.^(-1)); +elseif mod(order,2)==1 + output=sqrt(rho.^(-1)).*sqrt(2).*sin(pi*(order+1).*rho); +else + output=sqrt(rho.^(-1)).*sqrt(2).*cos(pi*order.*rho); +end +end \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/MOMENT/getZM_RBF.m b/1. Hierarchical Invariants/Functions/MOMENT/getZM_RBF.m new file mode 100644 index 0000000..e9e5f7f --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/getZM_RBF.m @@ -0,0 +1,48 @@ +%% REF +% Teague M R. Image analysis via the general theory of moments. Journal of the Optical Society of America, 1980, 70(8): 920-930. +% Chong C W, Raveendran P, Mukundan R. A comparative analysis of algorithms for fast computation of Zernike moments. Pattern Recognition, 2003, 36(3): 731-742. +function [output] = getZM_RBF(order,repetition,rho) +rr = rho.^2; +for p=0:1:order+1 + q = p-4; + while q>= 0 + H3mn(p+1,q+1) = -(4*(q + 2)*(q + 1))/((p+q+2)*(p-q)); + H2mn(p+1,q+1) = H3mn(p+1,q+1)*(p+q+4)*(p-q-2)/(4*(q+3))+(q+2); + H1mn(p+1,q+1) = (q+4)*(q+3)/2-H2mn(p+1,q+1)*(q+4)+H3mn(p+1,q+1)*(p+q+6)*(p-q-4)/8; + q = q-2; + end +end + +for p=0:1:order+1 + q = p; + Rn = rho.^p; + if p>1 + Rnm2 = rho.^(p-2); + end + while q>= 0 + if q == p + Rnm = Rn; + Rnmp4 = Rn; + elseif q == p-2 + Rnnm2 = p.*Rn-(p-1).*Rnm2; + Rnm = Rnnm2; + Rnmp2 = Rnnm2; + else + H3 = H3mn(p+1,q+1); + H2 = H2mn(p+1,q+1); + H1 = H1mn(p+1,q+1); + Rnm = H1.*Rnmp4+(H2+H3./rr).*Rnmp2; + Rnmp4 = Rnmp2; + Rnmp2 = Rnm; + end + if p == order && q == abs(repetition) + output = Rnm; + break; + end + q = q-2; + end + if p == order && q == abs(repetition) + break; + end +end +end \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/MOMENT/ro.m b/1. Hierarchical Invariants/Functions/MOMENT/ro.m new file mode 100644 index 0000000..17021fc --- /dev/null +++ b/1. Hierarchical Invariants/Functions/MOMENT/ro.m @@ -0,0 +1,36 @@ +function [r,o] = ro(n,m) +r = zeros(n,m); +o = zeros(n,m); +R = max((n-1)/2,(m-1)/2); +for x = 1:n + for y = 1:m + xx = x-1; + yy = y-1; + if (xx<=(n-1)/2) && (yy>=(m-1)/2) + p = yy-(m-1)/2; + q = (n-1)/2-xx; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = asin(q/sqrt(p^2+q^2)); + elseif (xx<=(n-1)/2) && (yy<(m-1)/2) + p = (m-1)/2-yy; + q = (n-1)/2-xx; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = pi-asin(q/sqrt(p^2+q^2)); + elseif (xx>(n-1)/2) && (yy<=(m-1)/2) + p = (m-1)/2-yy; + q = xx-(n-1)/2; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = pi+asin(q/sqrt(p^2+q^2)); + elseif (xx>(n-1)/2) && (yy>(m-1)/2) + p = yy-(m-1)/2; + q = xx-(n-1)/2; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = 2*pi-asin(q/sqrt(p^2+q^2)); + end + if r(x,y)==0 + o(x,y) = 0; + elseif r(x,y)>1 + r(x,y) = 10000; + end + end +end diff --git a/1. Hierarchical Invariants/Functions/addcolorplus.m b/1. Hierarchical Invariants/Functions/addcolorplus.m new file mode 100644 index 0000000..cf618a6 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/addcolorplus.m @@ -0,0 +1,384 @@ +function map = addcolorplus(wxk) +% Matlab ÅäÉ«²¹³ä +% ÊäÈë: +% wxk - ÑÕÉ«±àºÅ£¬¿ÉÒÔÊǵ¥¸öÊý×Ö£¬Ò²¿ÉÒÔÊÇÊý×飨ÿ¸öÊý×ÖСÓÚµÈÓÚ270£© +% +% Êä³ö: +% map - Nx3µÄRGBÑÕÉ«¾ØÕó +% +% Copyright 2021 Akun +% https://www.zhihu.com/people/hei-gou-52 +morecolor = [0 0 0 + 0.549019607843137 0.549019607843137 0.549019607843137 + 0.627450980392157 0.627450980392157 0.627450980392157 + 0.756862745098039 0.756862745098039 0.756862745098039 + 0.827450980392157 0.827450980392157 0.827450980392157 + 0.882352941176471 0.882352941176471 0.882352941176471 + 0.905882352941177 0.905882352941177 0.905882352941177 + 0.972549019607843 0.972549019607843 0.972549019607843 + 1 0.980392156862745 0.980392156862745 + 0.737254901960784 0.560784313725490 0.560784313725490 + 0.941176470588235 0.501960784313726 0.501960784313726 + 0.803921568627451 0.360784313725490 0.360784313725490 + 0.647058823529412 0.164705882352941 0.164705882352941 + 0.698039215686275 0.133333333333333 0.133333333333333 + 0.501960784313726 0 0 + 0.545098039215686 0 0 + 1 0 0 + 1 0.894117647058824 0.882352941176471 + 0.980392156862745 0.501960784313726 0.447058823529412 + 1 0.388235294117647 0.278431372549020 + 0.913725490196078 0.588235294117647 0.478431372549020 + 1 0.498039215686275 0.313725490196078 + 1 0.270588235294118 0 + 1 0.627450980392157 0.478431372549020 + 0.627450980392157 0.321568627450980 0.176470588235294 + 1 0.960784313725490 0.933333333333333 + 0.823529411764706 0.411764705882353 0.117647058823529 + 0.545098039215686 0.270588235294118 0.0745098039215686 + 0.956862745098039 0.643137254901961 0.376470588235294 + 1 0.854901960784314 0.725490196078431 + 0.803921568627451 0.521568627450980 0.247058823529412 + 0.980392156862745 0.941176470588235 0.901960784313726 + 1 0.894117647058824 0.768627450980392 + 1 0.549019607843137 0 + 0.870588235294118 0.721568627450980 0.529411764705882 + 0.980392156862745 0.921568627450980 0.843137254901961 + 0.823529411764706 0.705882352941177 0.549019607843137 + 1 0.870588235294118 0.678431372549020 + 1 0.921568627450980 0.803921568627451 + 1 0.937254901960784 0.835294117647059 + 1 0.894117647058824 0.709803921568628 + 1 0.647058823529412 0 + 0.960784313725490 0.870588235294118 0.701960784313725 + 0.992156862745098 0.960784313725490 0.901960784313726 + 1 0.980392156862745 0.941176470588235 + 0.721568627450980 0.525490196078431 0.0431372549019608 + 0.854901960784314 0.647058823529412 0.125490196078431 + 1 0.972549019607843 0.862745098039216 + 1 0.843137254901961 0 + 1 0.980392156862745 0.803921568627451 + 0.941176470588235 0.901960784313726 0.549019607843137 + 0.933333333333333 0.909803921568627 0.666666666666667 + 0.741176470588235 0.717647058823529 0.419607843137255 + 1 1 0.941176470588235 + 0.960784313725490 0.960784313725490 0.862745098039216 + 1 1 0.878431372549020 + 0.980392156862745 0.980392156862745 0.823529411764706 + 0.501960784313726 0.501960784313726 0 + 0.749019607843137 0.749019607843137 0 + 1 1 0 + 0.419607843137255 0.556862745098039 0.137254901960784 + 0.603921568627451 0.803921568627451 0.196078431372549 + 0.333333333333333 0.419607843137255 0.184313725490196 + 0.678431372549020 1 0.184313725490196 + 0.498039215686275 1 0 + 0.486274509803922 0.988235294117647 0 + 0.941176470588235 1 0.941176470588235 + 0.560784313725490 0.737254901960784 0.560784313725490 + 0.596078431372549 0.984313725490196 0.596078431372549 + 0.564705882352941 0.933333333333333 0.564705882352941 + 0.133333333333333 0.545098039215686 0.133333333333333 + 0.196078431372549 0.803921568627451 0.196078431372549 + 0 0.392156862745098 0 + 0 0.501960784313726 0 + 0 1 0 + 0.180392156862745 0.545098039215686 0.341176470588235 + 0.235294117647059 0.701960784313725 0.443137254901961 + 0 1 0.498039215686275 + 0.960784313725490 1 0.980392156862745 + 0 0.980392156862745 0.603921568627451 + 0.400000000000000 0.803921568627451 0.666666666666667 + 0.498039215686275 1 0.831372549019608 + 0.250980392156863 0.878431372549020 0.815686274509804 + 0.125490196078431 0.698039215686275 0.666666666666667 + 0.282352941176471 0.819607843137255 0.800000000000000 + 0.941176470588235 1 1 + 0.878431372549020 1 1 + 0.686274509803922 0.933333333333333 0.933333333333333 + 0.184313725490196 0.309803921568627 0.309803921568627 + 0 0.501960784313726 0.501960784313726 + 0 0.545098039215686 0.545098039215686 + 0 0.749019607843137 0.749019607843137 + 0 1 1 + 0 0.807843137254902 0.819607843137255 + 0.372549019607843 0.619607843137255 0.627450980392157 + 0.690196078431373 0.878431372549020 0.901960784313726 + 0.678431372549020 0.847058823529412 0.901960784313726 + 0 0.749019607843137 1 + 0.529411764705882 0.807843137254902 0.921568627450980 + 0.529411764705882 0.807843137254902 0.980392156862745 + 0.274509803921569 0.509803921568627 0.705882352941177 + 0.941176470588235 0.972549019607843 1 + 0.117647058823529 0.564705882352941 1 + 0.466666666666667 0.533333333333333 0.600000000000000 + 0.439215686274510 0.501960784313726 0.564705882352941 + 0.690196078431373 0.768627450980392 0.870588235294118 + 0.392156862745098 0.584313725490196 0.929411764705882 + 0.254901960784314 0.411764705882353 0.882352941176471 + 0.972549019607843 0.972549019607843 1 + 0.901960784313726 0.901960784313726 0.980392156862745 + 0.0980392156862745 0.0980392156862745 0.439215686274510 + 0 0 0.501960784313726 + 0 0 0.545098039215686 + 0 0 0.803921568627451 + 0 0 1 + 0.415686274509804 0.352941176470588 0.803921568627451 + 0.282352941176471 0.239215686274510 0.545098039215686 + 0.482352941176471 0.407843137254902 0.933333333333333 + 0.576470588235294 0.439215686274510 0.858823529411765 + 0.400000000000000 0.200000000000000 0.600000000000000 + 0.541176470588235 0.168627450980392 0.886274509803922 + 0.294117647058824 0 0.509803921568627 + 0.600000000000000 0.196078431372549 0.800000000000000 + 0.580392156862745 0 0.827450980392157 + 0.729411764705882 0.333333333333333 0.827450980392157 + 0.847058823529412 0.749019607843137 0.847058823529412 + 0.866666666666667 0.627450980392157 0.866666666666667 + 0.933333333333333 0.509803921568627 0.933333333333333 + 0.501960784313726 0 0.501960784313726 + 0.545098039215686 0 0.545098039215686 + 0.749019607843137 0 0.749019607843137 + 1 0 1 + 0.854901960784314 0.439215686274510 0.839215686274510 + 0.780392156862745 0.0823529411764706 0.521568627450980 + 1 0.0784313725490196 0.576470588235294 + 1 0.411764705882353 0.705882352941177 + 1 0.941176470588235 0.960784313725490 + 0.858823529411765 0.439215686274510 0.576470588235294 + 0.862745098039216 0.0784313725490196 0.235294117647059 + 1 0.752941176470588 0.796078431372549 + 1 0.713725490196078 0.756862745098039 + 0.984313725490196 0.705882352941177 0.682352941176471 + 0.701960784313725 0.803921568627451 0.890196078431373 + 0.800000000000000 0.921568627450980 0.772549019607843 + 0.870588235294118 0.796078431372549 0.894117647058824 + 0.996078431372549 0.850980392156863 0.650980392156863 + 1 1 0.800000000000000 + 0.898039215686275 0.847058823529412 0.741176470588235 + 0.992156862745098 0.854901960784314 0.925490196078431 + 0.949019607843137 0.949019607843137 0.949019607843137 + 0.800000000000000 0.800000000000000 0.800000000000000 + 0.945098039215686 0.886274509803922 0.800000000000000 + 1 0.949019607843137 0.682352941176471 + 0.901960784313726 0.960784313725490 0.788235294117647 + 0.956862745098039 0.792156862745098 0.894117647058824 + 0.796078431372549 0.835294117647059 0.909803921568627 + 0.992156862745098 0.803921568627451 0.674509803921569 + 0.701960784313725 0.886274509803922 0.803921568627451 + 0.650980392156863 0.807843137254902 0.890196078431373 + 0.121568627450980 0.470588235294118 0.705882352941177 + 0.698039215686275 0.874509803921569 0.541176470588235 + 0.200000000000000 0.627450980392157 0.172549019607843 + 0.984313725490196 0.603921568627451 0.600000000000000 + 0.890196078431373 0.101960784313725 0.109803921568627 + 0.992156862745098 0.749019607843137 0.435294117647059 + 1 0.498039215686275 0 + 0.792156862745098 0.698039215686275 0.839215686274510 + 0.415686274509804 0.239215686274510 0.603921568627451 + 1 1 0.600000000000000 + 0.694117647058824 0.349019607843137 0.156862745098039 + 0.498039215686275 0.788235294117647 0.498039215686275 + 0.745098039215686 0.682352941176471 0.831372549019608 + 0.992156862745098 0.752941176470588 0.525490196078431 + 0.219607843137255 0.423529411764706 0.690196078431373 + 0.941176470588235 0.00784313725490196 0.498039215686275 + 0.749019607843137 0.356862745098039 0.0862745098039216 + 0.400000000000000 0.400000000000000 0.400000000000000 + 0.105882352941176 0.619607843137255 0.466666666666667 + 0.850980392156863 0.372549019607843 0.00784313725490196 + 0.458823529411765 0.439215686274510 0.701960784313725 + 0.905882352941177 0.160784313725490 0.541176470588235 + 0.400000000000000 0.650980392156863 0.117647058823529 + 0.901960784313726 0.670588235294118 0.00784313725490196 + 0.650980392156863 0.462745098039216 0.113725490196078 + 0.894117647058824 0.101960784313725 0.109803921568627 + 0.215686274509804 0.494117647058824 0.721568627450980 + 0.301960784313725 0.686274509803922 0.290196078431373 + 0.596078431372549 0.305882352941177 0.639215686274510 + 1 1 0.200000000000000 + 0.650980392156863 0.337254901960784 0.156862745098039 + 0.968627450980392 0.505882352941176 0.749019607843137 + 0.600000000000000 0.600000000000000 0.600000000000000 + 0.400000000000000 0.760784313725490 0.647058823529412 + 0.988235294117647 0.552941176470588 0.384313725490196 + 0.552941176470588 0.627450980392157 0.796078431372549 + 0.905882352941177 0.541176470588235 0.764705882352941 + 0.650980392156863 0.847058823529412 0.329411764705882 + 1 0.850980392156863 0.184313725490196 + 0.898039215686275 0.768627450980392 0.580392156862745 + 0.701960784313725 0.701960784313725 0.701960784313725 + 0.552941176470588 0.827450980392157 0.780392156862745 + 1 1 0.701960784313725 + 0.745098039215686 0.729411764705882 0.854901960784314 + 0.984313725490196 0.501960784313726 0.447058823529412 + 0.501960784313726 0.694117647058824 0.827450980392157 + 0.992156862745098 0.705882352941177 0.384313725490196 + 0.701960784313725 0.870588235294118 0.411764705882353 + 0.988235294117647 0.803921568627451 0.898039215686275 + 0.850980392156863 0.850980392156863 0.850980392156863 + 0.737254901960784 0.501960784313726 0.741176470588235 + 1 0.929411764705882 0.435294117647059 + 0.121568627450980 0.466666666666667 0.705882352941177 + 1 0.498039215686275 0.0549019607843137 + 0.172549019607843 0.627450980392157 0.172549019607843 + 0.839215686274510 0.152941176470588 0.156862745098039 + 0.580392156862745 0.403921568627451 0.741176470588235 + 0.549019607843137 0.337254901960784 0.294117647058824 + 0.890196078431373 0.466666666666667 0.760784313725490 + 0.498039215686275 0.498039215686275 0.498039215686275 + 0.737254901960784 0.741176470588235 0.133333333333333 + 0.0901960784313726 0.745098039215686 0.811764705882353 + 0.682352941176471 0.780392156862745 0.909803921568627 + 1 0.733333333333333 0.470588235294118 + 0.596078431372549 0.874509803921569 0.541176470588235 + 1 0.596078431372549 0.588235294117647 + 0.772549019607843 0.690196078431373 0.835294117647059 + 0.768627450980392 0.611764705882353 0.580392156862745 + 0.968627450980392 0.713725490196078 0.823529411764706 + 0.780392156862745 0.780392156862745 0.780392156862745 + 0.858823529411765 0.858823529411765 0.552941176470588 + 0.619607843137255 0.854901960784314 0.898039215686275 + 0.223529411764706 0.231372549019608 0.474509803921569 + 0.321568627450980 0.329411764705882 0.639215686274510 + 0.419607843137255 0.431372549019608 0.811764705882353 + 0.611764705882353 0.619607843137255 0.870588235294118 + 0.388235294117647 0.474509803921569 0.223529411764706 + 0.549019607843137 0.635294117647059 0.321568627450980 + 0.709803921568628 0.811764705882353 0.419607843137255 + 0.807843137254902 0.858823529411765 0.611764705882353 + 0.549019607843137 0.427450980392157 0.192156862745098 + 0.741176470588235 0.619607843137255 0.223529411764706 + 0.905882352941177 0.729411764705882 0.321568627450980 + 0.905882352941177 0.796078431372549 0.580392156862745 + 0.517647058823530 0.235294117647059 0.223529411764706 + 0.678431372549020 0.286274509803922 0.290196078431373 + 0.839215686274510 0.380392156862745 0.419607843137255 + 0.905882352941177 0.588235294117647 0.611764705882353 + 0.482352941176471 0.254901960784314 0.450980392156863 + 0.647058823529412 0.317647058823529 0.580392156862745 + 0.807843137254902 0.427450980392157 0.741176470588235 + 0.870588235294118 0.619607843137255 0.839215686274510 + 0.192156862745098 0.509803921568627 0.741176470588235 + 0.419607843137255 0.682352941176471 0.839215686274510 + 0.619607843137255 0.792156862745098 0.882352941176471 + 0.776470588235294 0.858823529411765 0.937254901960784 + 0.901960784313726 0.333333333333333 0.0509803921568627 + 0.992156862745098 0.552941176470588 0.235294117647059 + 0.992156862745098 0.682352941176471 0.419607843137255 + 0.992156862745098 0.815686274509804 0.635294117647059 + 0.192156862745098 0.639215686274510 0.329411764705882 + 0.454901960784314 0.768627450980392 0.462745098039216 + 0.631372549019608 0.850980392156863 0.607843137254902 + 0.780392156862745 0.913725490196078 0.752941176470588 + 0.458823529411765 0.419607843137255 0.694117647058824 + 0.619607843137255 0.603921568627451 0.784313725490196 + 0.737254901960784 0.741176470588235 0.862745098039216 + 0.854901960784314 0.854901960784314 0.921568627450980 + 0.388235294117647 0.388235294117647 0.388235294117647 + 0.588235294117647 0.588235294117647 0.588235294117647 + 0.741176470588235 0.741176470588235 0.741176470588235]; +scheme = {[0.988235294117647,0.984313725490196,0.992156862745098;0.984313725490196,0.980392156862745,0.988235294117647;0.984313725490196,0.980392156862745,0.988235294117647;0.980392156862745,0.976470588235294,0.988235294117647;0.980392156862745,0.976470588235294,0.984313725490196;0.976470588235294,0.972549019607843,0.984313725490196;0.976470588235294,0.972549019607843,0.984313725490196;0.976470588235294,0.968627450980392,0.984313725490196;0.972549019607843,0.968627450980392,0.980392156862745;0.972549019607843,0.968627450980392,0.980392156862745;0.968627450980392,0.964705882352941,0.980392156862745;0.968627450980392,0.964705882352941,0.980392156862745;0.968627450980392,0.960784313725490,0.976470588235294;0.964705882352941,0.960784313725490,0.976470588235294;0.964705882352941,0.956862745098039,0.976470588235294;0.960784313725490,0.952941176470588,0.972549019607843;0.960784313725490,0.952941176470588,0.972549019607843;0.956862745098039,0.952941176470588,0.972549019607843;0.956862745098039,0.949019607843137,0.972549019607843;0.956862745098039,0.949019607843137,0.972549019607843;0.952941176470588,0.945098039215686,0.968627450980392;0.952941176470588,0.945098039215686,0.968627450980392;0.949019607843137,0.941176470588235,0.968627450980392;0.949019607843137,0.941176470588235,0.964705882352941;0.945098039215686,0.941176470588235,0.964705882352941;0.945098039215686,0.937254901960784,0.964705882352941;0.941176470588235,0.937254901960784,0.964705882352941;0.941176470588235,0.933333333333333,0.960784313725490;0.941176470588235,0.933333333333333,0.960784313725490;0.937254901960784,0.929411764705882,0.960784313725490;0.937254901960784,0.929411764705882,0.960784313725490;0.933333333333333,0.925490196078431,0.956862745098039;0.933333333333333,0.925490196078431,0.956862745098039;0.929411764705882,0.921568627450980,0.956862745098039;0.925490196078431,0.921568627450980,0.956862745098039;0.925490196078431,0.917647058823529,0.952941176470588;0.921568627450980,0.913725490196078,0.952941176470588;0.917647058823529,0.909803921568627,0.949019607843137;0.917647058823529,0.909803921568627,0.949019607843137;0.909803921568627,0.905882352941177,0.949019607843137;0.909803921568627,0.905882352941177,0.949019607843137;0.905882352941177,0.901960784313726,0.945098039215686;0.905882352941177,0.898039215686275,0.945098039215686;0.905882352941177,0.898039215686275,0.945098039215686;0.898039215686275,0.894117647058824,0.941176470588235;0.898039215686275,0.890196078431373,0.941176470588235;0.894117647058824,0.890196078431373,0.937254901960784;0.890196078431373,0.886274509803922,0.937254901960784;0.890196078431373,0.886274509803922,0.937254901960784;0.886274509803922,0.882352941176471,0.937254901960784;0.882352941176471,0.882352941176471,0.933333333333333;0.882352941176471,0.878431372549020,0.933333333333333;0.878431372549020,0.874509803921569,0.933333333333333;0.874509803921569,0.874509803921569,0.929411764705882;0.874509803921569,0.870588235294118,0.929411764705882;0.870588235294118,0.870588235294118,0.929411764705882;0.866666666666667,0.866666666666667,0.925490196078431;0.866666666666667,0.862745098039216,0.925490196078431;0.862745098039216,0.862745098039216,0.925490196078431;0.858823529411765,0.858823529411765,0.921568627450980;0.858823529411765,0.858823529411765,0.921568627450980;0.850980392156863,0.850980392156863,0.917647058823529;0.850980392156863,0.850980392156863,0.917647058823529;0.843137254901961,0.843137254901961,0.913725490196078;0.843137254901961,0.843137254901961,0.913725490196078;0.839215686274510,0.839215686274510,0.913725490196078;0.835294117647059,0.835294117647059,0.909803921568627;0.835294117647059,0.835294117647059,0.909803921568627;0.827450980392157,0.827450980392157,0.905882352941177;0.823529411764706,0.823529411764706,0.905882352941177;0.819607843137255,0.819607843137255,0.901960784313726;0.815686274509804,0.815686274509804,0.901960784313726;0.811764705882353,0.811764705882353,0.898039215686275;0.807843137254902,0.807843137254902,0.898039215686275;0.803921568627451,0.803921568627451,0.894117647058824;0.800000000000000,0.803921568627451,0.894117647058824;0.796078431372549,0.800000000000000,0.890196078431373;0.792156862745098,0.796078431372549,0.890196078431373;0.788235294117647,0.792156862745098,0.886274509803922;0.784313725490196,0.788235294117647,0.886274509803922;0.780392156862745,0.784313725490196,0.882352941176471;0.776470588235294,0.780392156862745,0.882352941176471;0.776470588235294,0.776470588235294,0.882352941176471;0.772549019607843,0.772549019607843,0.878431372549020;0.768627450980392,0.768627450980392,0.878431372549020;0.760784313725490,0.764705882352941,0.874509803921569;0.760784313725490,0.764705882352941,0.874509803921569;0.752941176470588,0.756862745098039,0.870588235294118;0.752941176470588,0.756862745098039,0.870588235294118;0.745098039215686,0.749019607843137,0.866666666666667;0.741176470588235,0.745098039215686,0.862745098039216;0.741176470588235,0.745098039215686,0.862745098039216;0.733333333333333,0.737254901960784,0.858823529411765;0.729411764705882,0.733333333333333,0.858823529411765;0.725490196078431,0.729411764705882,0.854901960784314;0.721568627450980,0.725490196078431,0.850980392156863;0.717647058823529,0.721568627450980,0.850980392156863;0.713725490196078,0.717647058823529,0.847058823529412;0.713725490196078,0.713725490196078,0.847058823529412;0.709803921568628,0.705882352941177,0.843137254901961;0.705882352941177,0.701960784313725,0.839215686274510;0.701960784313725,0.698039215686275,0.839215686274510;0.698039215686275,0.694117647058824,0.835294117647059;0.694117647058824,0.690196078431373,0.831372549019608;0.686274509803922,0.682352941176471,0.827450980392157;0.686274509803922,0.682352941176471,0.827450980392157;0.678431372549020,0.674509803921569,0.823529411764706;0.678431372549020,0.674509803921569,0.823529411764706;0.674509803921569,0.670588235294118,0.819607843137255;0.666666666666667,0.658823529411765,0.815686274509804;0.666666666666667,0.658823529411765,0.815686274509804;0.658823529411765,0.650980392156863,0.811764705882353;0.654901960784314,0.647058823529412,0.807843137254902;0.650980392156863,0.643137254901961,0.803921568627451;0.650980392156863,0.639215686274510,0.803921568627451;0.650980392156863,0.639215686274510,0.803921568627451;0.643137254901961,0.631372549019608,0.800000000000000;0.639215686274510,0.627450980392157,0.796078431372549;0.635294117647059,0.619607843137255,0.792156862745098;0.631372549019608,0.615686274509804,0.792156862745098;0.627450980392157,0.611764705882353,0.788235294117647;0.623529411764706,0.607843137254902,0.784313725490196;0.619607843137255,0.603921568627451,0.784313725490196;0.615686274509804,0.600000000000000,0.780392156862745;0.611764705882353,0.596078431372549,0.780392156862745;0.607843137254902,0.592156862745098,0.776470588235294;0.603921568627451,0.588235294117647,0.776470588235294;0.600000000000000,0.584313725490196,0.776470588235294;0.592156862745098,0.580392156862745,0.772549019607843;0.592156862745098,0.580392156862745,0.772549019607843;0.588235294117647,0.572549019607843,0.768627450980392;0.588235294117647,0.572549019607843,0.768627450980392;0.584313725490196,0.568627450980392,0.764705882352941;0.576470588235294,0.560784313725490,0.760784313725490;0.576470588235294,0.560784313725490,0.760784313725490;0.568627450980392,0.552941176470588,0.760784313725490;0.564705882352941,0.549019607843137,0.756862745098039;0.560784313725490,0.545098039215686,0.756862745098039;0.556862745098039,0.541176470588235,0.752941176470588;0.552941176470588,0.541176470588235,0.752941176470588;0.549019607843137,0.537254901960784,0.749019607843137;0.545098039215686,0.533333333333333,0.749019607843137;0.541176470588235,0.529411764705882,0.745098039215686;0.537254901960784,0.525490196078431,0.745098039215686;0.533333333333333,0.521568627450980,0.745098039215686;0.529411764705882,0.517647058823530,0.741176470588235;0.525490196078431,0.513725490196078,0.741176470588235;0.525490196078431,0.509803921568627,0.737254901960784;0.521568627450980,0.505882352941176,0.737254901960784;0.517647058823530,0.501960784313726,0.733333333333333;0.513725490196078,0.501960784313726,0.733333333333333;0.509803921568627,0.498039215686275,0.733333333333333;0.501960784313726,0.490196078431373,0.729411764705882;0.501960784313726,0.490196078431373,0.729411764705882;0.494117647058824,0.478431372549020,0.721568627450980;0.494117647058824,0.478431372549020,0.721568627450980;0.494117647058824,0.474509803921569,0.721568627450980;0.486274509803922,0.462745098039216,0.713725490196078;0.486274509803922,0.462745098039216,0.713725490196078;0.482352941176471,0.450980392156863,0.709803921568628;0.478431372549020,0.447058823529412,0.705882352941177;0.478431372549020,0.443137254901961,0.701960784313725;0.474509803921569,0.435294117647059,0.701960784313725;0.470588235294118,0.431372549019608,0.698039215686275;0.466666666666667,0.423529411764706,0.694117647058824;0.466666666666667,0.419607843137255,0.690196078431373;0.462745098039216,0.415686274509804,0.690196078431373;0.458823529411765,0.407843137254902,0.686274509803922;0.458823529411765,0.403921568627451,0.682352941176471;0.454901960784314,0.400000000000000,0.682352941176471;0.450980392156863,0.392156862745098,0.678431372549020;0.450980392156863,0.388235294117647,0.674509803921569;0.447058823529412,0.380392156862745,0.670588235294118;0.443137254901961,0.376470588235294,0.670588235294118;0.443137254901961,0.372549019607843,0.666666666666667;0.439215686274510,0.364705882352941,0.662745098039216;0.435294117647059,0.356862745098039,0.658823529411765;0.435294117647059,0.356862745098039,0.658823529411765;0.427450980392157,0.345098039215686,0.650980392156863;0.423529411764706,0.341176470588235,0.650980392156863;0.423529411764706,0.337254901960784,0.650980392156863;0.419607843137255,0.329411764705882,0.643137254901961;0.419607843137255,0.329411764705882,0.643137254901961;0.415686274509804,0.317647058823529,0.639215686274510;0.411764705882353,0.313725490196078,0.635294117647059;0.407843137254902,0.305882352941177,0.631372549019608;0.407843137254902,0.301960784313725,0.631372549019608;0.403921568627451,0.298039215686275,0.627450980392157;0.400000000000000,0.290196078431373,0.627450980392157;0.400000000000000,0.286274509803922,0.623529411764706;0.396078431372549,0.282352941176471,0.619607843137255;0.392156862745098,0.274509803921569,0.619607843137255;0.388235294117647,0.270588235294118,0.615686274509804;0.388235294117647,0.266666666666667,0.611764705882353;0.384313725490196,0.258823529411765,0.611764705882353;0.380392156862745,0.250980392156863,0.607843137254902;0.380392156862745,0.250980392156863,0.607843137254902;0.376470588235294,0.243137254901961,0.603921568627451;0.372549019607843,0.239215686274510,0.600000000000000;0.372549019607843,0.235294117647059,0.600000000000000;0.364705882352941,0.223529411764706,0.592156862745098;0.364705882352941,0.223529411764706,0.592156862745098;0.360784313725490,0.211764705882353,0.588235294117647;0.356862745098039,0.207843137254902,0.584313725490196;0.356862745098039,0.207843137254902,0.584313725490196;0.352941176470588,0.200000000000000,0.580392156862745;0.352941176470588,0.196078431372549,0.580392156862745;0.345098039215686,0.188235294117647,0.576470588235294;0.345098039215686,0.184313725490196,0.572549019607843;0.341176470588235,0.176470588235294,0.572549019607843;0.337254901960784,0.172549019607843,0.568627450980392;0.337254901960784,0.168627450980392,0.564705882352941;0.333333333333333,0.160784313725490,0.564705882352941;0.329411764705882,0.156862745098039,0.560784313725490;0.329411764705882,0.152941176470588,0.560784313725490;0.325490196078431,0.145098039215686,0.556862745098039;0.321568627450980,0.141176470588235,0.552941176470588;0.321568627450980,0.137254901960784,0.552941176470588;0.317647058823529,0.133333333333333,0.549019607843137;0.313725490196078,0.125490196078431,0.545098039215686;0.313725490196078,0.121568627450980,0.545098039215686;0.309803921568627,0.117647058823529,0.545098039215686;0.305882352941177,0.113725490196078,0.541176470588235;0.305882352941177,0.109803921568627,0.537254901960784;0.298039215686275,0.0980392156862745,0.533333333333333;0.298039215686275,0.0980392156862745,0.533333333333333;0.294117647058824,0.0901960784313726,0.529411764705882;0.290196078431373,0.0862745098039216,0.529411764705882;0.290196078431373,0.0862745098039216,0.529411764705882;0.286274509803922,0.0745098039215686,0.525490196078431;0.286274509803922,0.0745098039215686,0.525490196078431;0.282352941176471,0.0666666666666667,0.517647058823530;0.278431372549020,0.0588235294117647,0.517647058823530;0.274509803921569,0.0549019607843137,0.513725490196078;0.274509803921569,0.0509803921568627,0.513725490196078;0.270588235294118,0.0470588235294118,0.509803921568627;0.266666666666667,0.0431372549019608,0.509803921568627;0.266666666666667,0.0352941176470588,0.505882352941176;0.262745098039216,0.0313725490196078,0.501960784313726;0.258823529411765,0.0274509803921569,0.501960784313726;0.258823529411765,0.0235294117647059,0.498039215686275;0.254901960784314,0.0156862745098039,0.498039215686275;0.250980392156863,0.0117647058823529,0.494117647058824;0.247058823529412,0.00392156862745098,0.490196078431373;0.247058823529412,0.00392156862745098,0.490196078431373;0.247058823529412,0,0.490196078431373]; + [0.968627450980392,0.984313725490196,1;0.964705882352941,0.980392156862745,0.996078431372549;0.960784313725490,0.976470588235294,0.996078431372549;0.956862745098039,0.976470588235294,0.996078431372549;0.952941176470588,0.972549019607843,0.992156862745098;0.952941176470588,0.972549019607843,0.992156862745098;0.949019607843137,0.968627450980392,0.992156862745098;0.945098039215686,0.968627450980392,0.992156862745098;0.941176470588235,0.964705882352941,0.988235294117647;0.937254901960784,0.964705882352941,0.988235294117647;0.937254901960784,0.960784313725490,0.988235294117647;0.933333333333333,0.960784313725490,0.988235294117647;0.929411764705882,0.956862745098039,0.984313725490196;0.925490196078431,0.956862745098039,0.984313725490196;0.925490196078431,0.952941176470588,0.984313725490196;0.917647058823529,0.949019607843137,0.980392156862745;0.917647058823529,0.949019607843137,0.980392156862745;0.909803921568627,0.945098039215686,0.980392156862745;0.909803921568627,0.945098039215686,0.980392156862745;0.909803921568627,0.945098039215686,0.980392156862745;0.901960784313726,0.941176470588235,0.976470588235294;0.901960784313726,0.941176470588235,0.976470588235294;0.894117647058824,0.937254901960784,0.976470588235294;0.894117647058824,0.933333333333333,0.972549019607843;0.890196078431373,0.933333333333333,0.972549019607843;0.886274509803922,0.929411764705882,0.972549019607843;0.882352941176471,0.929411764705882,0.972549019607843;0.882352941176471,0.925490196078431,0.968627450980392;0.878431372549020,0.925490196078431,0.968627450980392;0.874509803921569,0.921568627450980,0.968627450980392;0.870588235294118,0.921568627450980,0.968627450980392;0.866666666666667,0.917647058823529,0.964705882352941;0.866666666666667,0.917647058823529,0.964705882352941;0.862745098039216,0.913725490196078,0.964705882352941;0.858823529411765,0.913725490196078,0.964705882352941;0.854901960784314,0.909803921568627,0.960784313725490;0.854901960784314,0.909803921568627,0.960784313725490;0.847058823529412,0.905882352941177,0.960784313725490;0.847058823529412,0.905882352941177,0.960784313725490;0.843137254901961,0.901960784313726,0.956862745098039;0.843137254901961,0.901960784313726,0.956862745098039;0.835294117647059,0.898039215686275,0.956862745098039;0.831372549019608,0.894117647058824,0.952941176470588;0.831372549019608,0.894117647058824,0.952941176470588;0.827450980392157,0.890196078431373,0.952941176470588;0.823529411764706,0.890196078431373,0.952941176470588;0.819607843137255,0.886274509803922,0.949019607843137;0.819607843137255,0.886274509803922,0.949019607843137;0.815686274509804,0.882352941176471,0.949019607843137;0.811764705882353,0.882352941176471,0.949019607843137;0.807843137254902,0.878431372549020,0.945098039215686;0.807843137254902,0.878431372549020,0.945098039215686;0.803921568627451,0.874509803921569,0.945098039215686;0.800000000000000,0.874509803921569,0.945098039215686;0.796078431372549,0.870588235294118,0.941176470588235;0.796078431372549,0.870588235294118,0.941176470588235;0.792156862745098,0.866666666666667,0.941176470588235;0.788235294117647,0.866666666666667,0.941176470588235;0.784313725490196,0.862745098039216,0.937254901960784;0.784313725490196,0.862745098039216,0.937254901960784;0.780392156862745,0.858823529411765,0.937254901960784;0.772549019607843,0.854901960784314,0.933333333333333;0.772549019607843,0.854901960784314,0.933333333333333;0.764705882352941,0.850980392156863,0.933333333333333;0.760784313725490,0.850980392156863,0.933333333333333;0.752941176470588,0.847058823529412,0.929411764705882;0.749019607843137,0.847058823529412,0.925490196078431;0.749019607843137,0.847058823529412,0.925490196078431;0.737254901960784,0.843137254901961,0.921568627450980;0.733333333333333,0.839215686274510,0.921568627450980;0.729411764705882,0.839215686274510,0.917647058823529;0.725490196078431,0.835294117647059,0.917647058823529;0.717647058823529,0.831372549019608,0.917647058823529;0.713725490196078,0.831372549019608,0.913725490196078;0.709803921568628,0.827450980392157,0.913725490196078;0.705882352941177,0.827450980392157,0.909803921568627;0.698039215686275,0.823529411764706,0.909803921568627;0.694117647058824,0.823529411764706,0.905882352941177;0.690196078431373,0.819607843137255,0.905882352941177;0.686274509803922,0.819607843137255,0.901960784313726;0.678431372549020,0.815686274509804,0.901960784313726;0.674509803921569,0.815686274509804,0.901960784313726;0.670588235294118,0.811764705882353,0.898039215686275;0.666666666666667,0.811764705882353,0.898039215686275;0.658823529411765,0.807843137254902,0.894117647058824;0.650980392156863,0.803921568627451,0.890196078431373;0.650980392156863,0.803921568627451,0.890196078431373;0.639215686274510,0.800000000000000,0.890196078431373;0.639215686274510,0.800000000000000,0.890196078431373;0.631372549019608,0.796078431372549,0.886274509803922;0.627450980392157,0.792156862745098,0.882352941176471;0.627450980392157,0.792156862745098,0.882352941176471;0.615686274509804,0.788235294117647,0.878431372549020;0.607843137254902,0.784313725490196,0.878431372549020;0.603921568627451,0.780392156862745,0.878431372549020;0.596078431372549,0.780392156862745,0.874509803921569;0.592156862745098,0.776470588235294,0.874509803921569;0.584313725490196,0.772549019607843,0.874509803921569;0.576470588235294,0.768627450980392,0.870588235294118;0.572549019607843,0.764705882352941,0.870588235294118;0.564705882352941,0.760784313725490,0.870588235294118;0.560784313725490,0.756862745098039,0.866666666666667;0.552941176470588,0.752941176470588,0.866666666666667;0.545098039215686,0.752941176470588,0.866666666666667;0.537254901960784,0.745098039215686,0.862745098039216;0.533333333333333,0.745098039215686,0.862745098039216;0.521568627450980,0.737254901960784,0.858823529411765;0.521568627450980,0.737254901960784,0.858823529411765;0.513725490196078,0.733333333333333,0.858823529411765;0.501960784313726,0.725490196078431,0.854901960784314;0.501960784313726,0.725490196078431,0.854901960784314;0.490196078431373,0.721568627450980,0.850980392156863;0.486274509803922,0.717647058823529,0.850980392156863;0.478431372549020,0.713725490196078,0.850980392156863;0.470588235294118,0.709803921568628,0.847058823529412;0.470588235294118,0.709803921568628,0.847058823529412;0.458823529411765,0.701960784313725,0.847058823529412;0.450980392156863,0.698039215686275,0.843137254901961;0.447058823529412,0.694117647058824,0.843137254901961;0.439215686274510,0.694117647058824,0.843137254901961;0.435294117647059,0.690196078431373,0.839215686274510;0.427450980392157,0.686274509803922,0.839215686274510;0.419607843137255,0.682352941176471,0.839215686274510;0.415686274509804,0.678431372549020,0.835294117647059;0.411764705882353,0.674509803921569,0.835294117647059;0.403921568627451,0.670588235294118,0.831372549019608;0.400000000000000,0.666666666666667,0.831372549019608;0.396078431372549,0.666666666666667,0.827450980392157;0.384313725490196,0.658823529411765,0.823529411764706;0.384313725490196,0.658823529411765,0.823529411764706;0.376470588235294,0.650980392156863,0.819607843137255;0.372549019607843,0.650980392156863,0.819607843137255;0.368627450980392,0.647058823529412,0.819607843137255;0.360784313725490,0.639215686274510,0.815686274509804;0.360784313725490,0.639215686274510,0.815686274509804;0.349019607843137,0.635294117647059,0.811764705882353;0.345098039215686,0.631372549019608,0.807843137254902;0.341176470588235,0.627450980392157,0.807843137254902;0.333333333333333,0.623529411764706,0.803921568627451;0.329411764705882,0.619607843137255,0.803921568627451;0.325490196078431,0.615686274509804,0.800000000000000;0.317647058823529,0.611764705882353,0.800000000000000;0.313725490196078,0.607843137254902,0.796078431372549;0.309803921568627,0.607843137254902,0.796078431372549;0.305882352941177,0.603921568627451,0.792156862745098;0.298039215686275,0.600000000000000,0.792156862745098;0.294117647058824,0.596078431372549,0.788235294117647;0.290196078431373,0.592156862745098,0.788235294117647;0.282352941176471,0.588235294117647,0.784313725490196;0.278431372549020,0.584313725490196,0.784313725490196;0.274509803921569,0.580392156862745,0.780392156862745;0.270588235294118,0.580392156862745,0.780392156862745;0.258823529411765,0.572549019607843,0.776470588235294;0.258823529411765,0.572549019607843,0.776470588235294;0.250980392156863,0.564705882352941,0.772549019607843;0.250980392156863,0.564705882352941,0.772549019607843;0.247058823529412,0.560784313725490,0.768627450980392;0.239215686274510,0.552941176470588,0.764705882352941;0.239215686274510,0.552941176470588,0.764705882352941;0.231372549019608,0.545098039215686,0.760784313725490;0.227450980392157,0.541176470588235,0.756862745098039;0.223529411764706,0.537254901960784,0.756862745098039;0.219607843137255,0.533333333333333,0.752941176470588;0.215686274509804,0.529411764705882,0.752941176470588;0.207843137254902,0.521568627450980,0.749019607843137;0.203921568627451,0.517647058823530,0.749019607843137;0.200000000000000,0.513725490196078,0.745098039215686;0.196078431372549,0.509803921568627,0.745098039215686;0.192156862745098,0.505882352941176,0.741176470588235;0.188235294117647,0.501960784313726,0.741176470588235;0.184313725490196,0.498039215686275,0.737254901960784;0.180392156862745,0.494117647058824,0.737254901960784;0.176470588235294,0.490196078431373,0.733333333333333;0.172549019607843,0.486274509803922,0.733333333333333;0.168627450980392,0.482352941176471,0.729411764705882;0.164705882352941,0.478431372549020,0.725490196078431;0.156862745098039,0.470588235294118,0.721568627450980;0.156862745098039,0.470588235294118,0.721568627450980;0.149019607843137,0.462745098039216,0.717647058823529;0.145098039215686,0.458823529411765,0.717647058823529;0.145098039215686,0.458823529411765,0.717647058823529;0.137254901960784,0.450980392156863,0.713725490196078;0.137254901960784,0.450980392156863,0.713725490196078;0.129411764705882,0.443137254901961,0.709803921568628;0.125490196078431,0.439215686274510,0.705882352941177;0.121568627450980,0.435294117647059,0.701960784313725;0.117647058823529,0.431372549019608,0.698039215686275;0.117647058823529,0.427450980392157,0.698039215686275;0.113725490196078,0.423529411764706,0.694117647058824;0.109803921568627,0.419607843137255,0.690196078431373;0.105882352941176,0.415686274509804,0.686274509803922;0.101960784313725,0.411764705882353,0.682352941176471;0.101960784313725,0.407843137254902,0.682352941176471;0.0980392156862745,0.403921568627451,0.678431372549020;0.0941176470588235,0.400000000000000,0.674509803921569;0.0901960784313726,0.392156862745098,0.670588235294118;0.0901960784313726,0.392156862745098,0.670588235294118;0.0862745098039216,0.388235294117647,0.666666666666667;0.0823529411764706,0.384313725490196,0.662745098039216;0.0784313725490196,0.380392156862745,0.658823529411765;0.0745098039215686,0.372549019607843,0.654901960784314;0.0745098039215686,0.372549019607843,0.654901960784314;0.0666666666666667,0.364705882352941,0.647058823529412;0.0627450980392157,0.360784313725490,0.643137254901961;0.0627450980392157,0.360784313725490,0.643137254901961;0.0588235294117647,0.352941176470588,0.639215686274510;0.0588235294117647,0.352941176470588,0.639215686274510;0.0509803921568627,0.345098039215686,0.631372549019608;0.0470588235294118,0.341176470588235,0.627450980392157;0.0470588235294118,0.337254901960784,0.627450980392157;0.0431372549019608,0.333333333333333,0.623529411764706;0.0392156862745098,0.329411764705882,0.619607843137255;0.0352941176470588,0.325490196078431,0.615686274509804;0.0313725490196078,0.321568627450980,0.611764705882353;0.0313725490196078,0.317647058823529,0.611764705882353;0.0313725490196078,0.313725490196078,0.603921568627451;0.0313725490196078,0.309803921568627,0.600000000000000;0.0313725490196078,0.305882352941177,0.592156862745098;0.0313725490196078,0.298039215686275,0.588235294117647;0.0313725490196078,0.290196078431373,0.576470588235294;0.0313725490196078,0.290196078431373,0.572549019607843;0.0313725490196078,0.286274509803922,0.568627450980392;0.0313725490196078,0.282352941176471,0.560784313725490;0.0313725490196078,0.278431372549020,0.556862745098039;0.0313725490196078,0.270588235294118,0.545098039215686;0.0313725490196078,0.270588235294118,0.545098039215686;0.0313725490196078,0.262745098039216,0.533333333333333;0.0313725490196078,0.258823529411765,0.529411764705882;0.0313725490196078,0.258823529411765,0.525490196078431;0.0313725490196078,0.250980392156863,0.513725490196078;0.0313725490196078,0.250980392156863,0.513725490196078;0.0313725490196078,0.243137254901961,0.501960784313726;0.0313725490196078,0.239215686274510,0.494117647058824;0.0313725490196078,0.235294117647059,0.490196078431373;0.0313725490196078,0.231372549019608,0.482352941176471;0.0313725490196078,0.227450980392157,0.478431372549020;0.0313725490196078,0.223529411764706,0.470588235294118;0.0313725490196078,0.219607843137255,0.466666666666667;0.0313725490196078,0.215686274509804,0.458823529411765;0.0313725490196078,0.211764705882353,0.454901960784314;0.0313725490196078,0.207843137254902,0.447058823529412;0.0313725490196078,0.203921568627451,0.443137254901961;0.0313725490196078,0.200000000000000,0.435294117647059;0.0313725490196078,0.192156862745098,0.423529411764706;0.0313725490196078,0.192156862745098,0.423529411764706;0.0313725490196078,0.192156862745098,0.423529411764706]; + [0.964705882352941,0.984313725490196,0.956862745098039;0.960784313725490,0.984313725490196,0.952941176470588;0.960784313725490,0.984313725490196,0.952941176470588;0.956862745098039,0.984313725490196,0.949019607843137;0.956862745098039,0.980392156862745,0.945098039215686;0.952941176470588,0.980392156862745,0.945098039215686;0.952941176470588,0.980392156862745,0.941176470588235;0.949019607843137,0.980392156862745,0.937254901960784;0.945098039215686,0.980392156862745,0.937254901960784;0.945098039215686,0.976470588235294,0.933333333333333;0.941176470588235,0.976470588235294,0.929411764705882;0.941176470588235,0.976470588235294,0.929411764705882;0.937254901960784,0.976470588235294,0.925490196078431;0.937254901960784,0.972549019607843,0.921568627450980;0.929411764705882,0.972549019607843,0.917647058823529;0.929411764705882,0.972549019607843,0.917647058823529;0.925490196078431,0.972549019607843,0.913725490196078;0.925490196078431,0.968627450980392,0.909803921568627;0.925490196078431,0.968627450980392,0.909803921568627;0.921568627450980,0.968627450980392,0.905882352941177;0.921568627450980,0.968627450980392,0.905882352941177;0.917647058823529,0.964705882352941,0.898039215686275;0.913725490196078,0.964705882352941,0.898039215686275;0.909803921568627,0.964705882352941,0.894117647058824;0.909803921568627,0.964705882352941,0.890196078431373;0.905882352941177,0.964705882352941,0.890196078431373;0.905882352941177,0.960784313725490,0.886274509803922;0.901960784313726,0.960784313725490,0.882352941176471;0.901960784313726,0.960784313725490,0.882352941176471;0.898039215686275,0.960784313725490,0.878431372549020;0.894117647058824,0.956862745098039,0.874509803921569;0.890196078431373,0.956862745098039,0.870588235294118;0.890196078431373,0.956862745098039,0.866666666666667;0.886274509803922,0.952941176470588,0.862745098039216;0.882352941176471,0.952941176470588,0.858823529411765;0.878431372549020,0.952941176470588,0.854901960784314;0.870588235294118,0.949019607843137,0.847058823529412;0.870588235294118,0.949019607843137,0.847058823529412;0.862745098039216,0.945098039215686,0.839215686274510;0.862745098039216,0.945098039215686,0.839215686274510;0.854901960784314,0.941176470588235,0.831372549019608;0.850980392156863,0.941176470588235,0.827450980392157;0.850980392156863,0.941176470588235,0.827450980392157;0.843137254901961,0.937254901960784,0.819607843137255;0.839215686274510,0.937254901960784,0.815686274509804;0.835294117647059,0.933333333333333,0.811764705882353;0.831372549019608,0.933333333333333,0.807843137254902;0.827450980392157,0.933333333333333,0.803921568627451;0.827450980392157,0.929411764705882,0.800000000000000;0.823529411764706,0.929411764705882,0.796078431372549;0.819607843137255,0.929411764705882,0.792156862745098;0.815686274509804,0.925490196078431,0.788235294117647;0.811764705882353,0.925490196078431,0.784313725490196;0.807843137254902,0.921568627450980,0.780392156862745;0.803921568627451,0.921568627450980,0.776470588235294;0.800000000000000,0.921568627450980,0.772549019607843;0.796078431372549,0.917647058823529,0.768627450980392;0.792156862745098,0.917647058823529,0.764705882352941;0.788235294117647,0.917647058823529,0.760784313725490;0.784313725490196,0.913725490196078,0.756862745098039;0.776470588235294,0.909803921568627,0.749019607843137;0.776470588235294,0.909803921568627,0.749019607843137;0.768627450980392,0.905882352941177,0.741176470588235;0.768627450980392,0.905882352941177,0.741176470588235;0.756862745098039,0.901960784313726,0.733333333333333;0.752941176470588,0.901960784313726,0.725490196078431;0.752941176470588,0.901960784313726,0.725490196078431;0.745098039215686,0.898039215686275,0.717647058823529;0.741176470588235,0.894117647058824,0.713725490196078;0.733333333333333,0.894117647058824,0.709803921568628;0.729411764705882,0.890196078431373,0.705882352941177;0.725490196078431,0.890196078431373,0.698039215686275;0.721568627450980,0.886274509803922,0.694117647058824;0.717647058823529,0.886274509803922,0.690196078431373;0.713725490196078,0.882352941176471,0.686274509803922;0.705882352941177,0.882352941176471,0.682352941176471;0.701960784313725,0.878431372549020,0.678431372549020;0.698039215686275,0.878431372549020,0.670588235294118;0.694117647058824,0.874509803921569,0.666666666666667;0.686274509803922,0.874509803921569,0.662745098039216;0.682352941176471,0.870588235294118,0.658823529411765;0.678431372549020,0.870588235294118,0.654901960784314;0.674509803921569,0.866666666666667,0.650980392156863;0.670588235294118,0.866666666666667,0.647058823529412;0.662745098039216,0.862745098039216,0.635294117647059;0.658823529411765,0.862745098039216,0.635294117647059;0.650980392156863,0.858823529411765,0.627450980392157;0.650980392156863,0.858823529411765,0.627450980392157;0.643137254901961,0.854901960784314,0.619607843137255;0.635294117647059,0.850980392156863,0.611764705882353;0.635294117647059,0.850980392156863,0.611764705882353;0.627450980392157,0.847058823529412,0.603921568627451;0.623529411764706,0.847058823529412,0.600000000000000;0.615686274509804,0.843137254901961,0.596078431372549;0.611764705882353,0.839215686274510,0.592156862745098;0.603921568627451,0.839215686274510,0.584313725490196;0.600000000000000,0.835294117647059,0.580392156862745;0.596078431372549,0.831372549019608,0.576470588235294;0.588235294117647,0.831372549019608,0.572549019607843;0.584313725490196,0.827450980392157,0.568627450980392;0.576470588235294,0.823529411764706,0.564705882352941;0.572549019607843,0.823529411764706,0.556862745098039;0.564705882352941,0.819607843137255,0.552941176470588;0.556862745098039,0.815686274509804,0.545098039215686;0.556862745098039,0.815686274509804,0.545098039215686;0.545098039215686,0.807843137254902,0.537254901960784;0.545098039215686,0.807843137254902,0.537254901960784;0.537254901960784,0.807843137254902,0.529411764705882;0.529411764705882,0.800000000000000,0.521568627450980;0.529411764705882,0.800000000000000,0.521568627450980;0.517647058823530,0.796078431372549,0.513725490196078;0.513725490196078,0.792156862745098,0.509803921568627;0.505882352941176,0.792156862745098,0.505882352941176;0.501960784313726,0.788235294117647,0.498039215686275;0.501960784313726,0.788235294117647,0.498039215686275;0.490196078431373,0.784313725490196,0.490196078431373;0.482352941176471,0.780392156862745,0.486274509803922;0.478431372549020,0.776470588235294,0.482352941176471;0.470588235294118,0.776470588235294,0.478431372549020;0.466666666666667,0.772549019607843,0.470588235294118;0.462745098039216,0.768627450980392,0.466666666666667;0.454901960784314,0.768627450980392,0.462745098039216;0.450980392156863,0.764705882352941,0.458823529411765;0.443137254901961,0.760784313725490,0.454901960784314;0.439215686274510,0.760784313725490,0.454901960784314;0.431372549019608,0.756862745098039,0.450980392156863;0.423529411764706,0.752941176470588,0.447058823529412;0.415686274509804,0.745098039215686,0.439215686274510;0.411764705882353,0.745098039215686,0.439215686274510;0.400000000000000,0.741176470588235,0.435294117647059;0.396078431372549,0.741176470588235,0.435294117647059;0.392156862745098,0.737254901960784,0.431372549019608;0.380392156862745,0.729411764705882,0.423529411764706;0.380392156862745,0.729411764705882,0.423529411764706;0.368627450980392,0.725490196078431,0.419607843137255;0.364705882352941,0.721568627450980,0.415686274509804;0.356862745098039,0.717647058823529,0.411764705882353;0.349019607843137,0.717647058823529,0.411764705882353;0.345098039215686,0.713725490196078,0.407843137254902;0.337254901960784,0.709803921568628,0.403921568627451;0.329411764705882,0.705882352941177,0.400000000000000;0.325490196078431,0.701960784313725,0.396078431372549;0.317647058823529,0.701960784313725,0.396078431372549;0.313725490196078,0.698039215686275,0.392156862745098;0.305882352941177,0.694117647058824,0.388235294117647;0.298039215686275,0.690196078431373,0.384313725490196;0.294117647058824,0.690196078431373,0.380392156862745;0.286274509803922,0.686274509803922,0.380392156862745;0.282352941176471,0.682352941176471,0.376470588235294;0.274509803921569,0.678431372549020,0.372549019607843;0.266666666666667,0.674509803921569,0.368627450980392;0.258823529411765,0.670588235294118,0.364705882352941;0.254901960784314,0.670588235294118,0.364705882352941;0.247058823529412,0.662745098039216,0.356862745098039;0.247058823529412,0.662745098039216,0.356862745098039;0.243137254901961,0.658823529411765,0.356862745098039;0.235294117647059,0.650980392156863,0.349019607843137;0.235294117647059,0.650980392156863,0.349019607843137;0.227450980392157,0.643137254901961,0.345098039215686;0.223529411764706,0.639215686274510,0.341176470588235;0.219607843137255,0.635294117647059,0.337254901960784;0.215686274509804,0.631372549019608,0.333333333333333;0.215686274509804,0.627450980392157,0.333333333333333;0.211764705882353,0.623529411764706,0.329411764705882;0.207843137254902,0.619607843137255,0.325490196078431;0.203921568627451,0.615686274509804,0.321568627450980;0.200000000000000,0.611764705882353,0.317647058823529;0.196078431372549,0.607843137254902,0.317647058823529;0.192156862745098,0.603921568627451,0.313725490196078;0.188235294117647,0.600000000000000,0.309803921568627;0.184313725490196,0.596078431372549,0.305882352941177;0.180392156862745,0.592156862745098,0.305882352941177;0.176470588235294,0.588235294117647,0.301960784313725;0.172549019607843,0.584313725490196,0.298039215686275;0.168627450980392,0.580392156862745,0.294117647058824;0.160784313725490,0.572549019607843,0.290196078431373;0.160784313725490,0.572549019607843,0.290196078431373;0.152941176470588,0.564705882352941,0.282352941176471;0.152941176470588,0.560784313725490,0.282352941176471;0.152941176470588,0.560784313725490,0.282352941176471;0.145098039215686,0.552941176470588,0.274509803921569;0.145098039215686,0.552941176470588,0.274509803921569;0.137254901960784,0.545098039215686,0.270588235294118;0.133333333333333,0.541176470588235,0.266666666666667;0.129411764705882,0.537254901960784,0.262745098039216;0.121568627450980,0.533333333333333,0.258823529411765;0.117647058823529,0.529411764705882,0.258823529411765;0.113725490196078,0.525490196078431,0.254901960784314;0.109803921568627,0.521568627450980,0.250980392156863;0.105882352941176,0.517647058823530,0.247058823529412;0.101960784313725,0.513725490196078,0.243137254901961;0.0980392156862745,0.509803921568627,0.243137254901961;0.0941176470588235,0.505882352941176,0.239215686274510;0.0901960784313726,0.501960784313726,0.235294117647059;0.0823529411764706,0.494117647058824,0.227450980392157;0.0823529411764706,0.494117647058824,0.227450980392157;0.0745098039215686,0.494117647058824,0.227450980392157;0.0705882352941177,0.490196078431373,0.223529411764706;0.0666666666666667,0.486274509803922,0.219607843137255;0.0588235294117647,0.478431372549020,0.215686274509804;0.0588235294117647,0.478431372549020,0.215686274509804;0.0509803921568627,0.470588235294118,0.207843137254902;0.0470588235294118,0.466666666666667,0.203921568627451;0.0470588235294118,0.466666666666667,0.203921568627451;0.0392156862745098,0.458823529411765,0.200000000000000;0.0352941176470588,0.458823529411765,0.200000000000000;0.0274509803921569,0.450980392156863,0.192156862745098;0.0235294117647059,0.447058823529412,0.188235294117647;0.0196078431372549,0.443137254901961,0.188235294117647;0.0156862745098039,0.439215686274510,0.184313725490196;0.0117647058823529,0.435294117647059,0.180392156862745;0.00784313725490196,0.435294117647059,0.176470588235294;0.00392156862745098,0.431372549019608,0.172549019607843;0,0.427450980392157,0.172549019607843;0,0.419607843137255,0.168627450980392;0,0.415686274509804,0.168627450980392;0,0.411764705882353,0.164705882352941;0,0.407843137254902,0.160784313725490;0,0.396078431372549,0.156862745098039;0,0.396078431372549,0.156862745098039;0,0.392156862745098,0.156862745098039;0,0.384313725490196,0.152941176470588;0,0.380392156862745,0.152941176470588;0,0.372549019607843,0.149019607843137;0,0.372549019607843,0.149019607843137;0,0.360784313725490,0.145098039215686;0,0.356862745098039,0.141176470588235;0,0.356862745098039,0.141176470588235;0,0.345098039215686,0.137254901960784;0,0.345098039215686,0.137254901960784;0,0.337254901960784,0.133333333333333;0,0.329411764705882,0.129411764705882;0,0.325490196078431,0.129411764705882;0,0.321568627450980,0.125490196078431;0,0.313725490196078,0.125490196078431;0,0.309803921568627,0.121568627450980;0,0.305882352941177,0.121568627450980;0,0.301960784313725,0.117647058823529;0,0.294117647058824,0.117647058823529;0,0.290196078431373,0.113725490196078;0,0.286274509803922,0.113725490196078;0,0.278431372549020,0.109803921568627;0,0.270588235294118,0.105882352941176;0,0.270588235294118,0.105882352941176;0,0.270588235294118,0.105882352941176]; + [0.996078431372549,0.956862745098039,0.917647058823529;0.996078431372549,0.956862745098039,0.913725490196078;0.996078431372549,0.952941176470588,0.909803921568627;0.996078431372549,0.952941176470588,0.905882352941177;0.996078431372549,0.949019607843137,0.901960784313726;0.996078431372549,0.949019607843137,0.898039215686275;0.996078431372549,0.945098039215686,0.894117647058824;0.996078431372549,0.945098039215686,0.890196078431373;0.996078431372549,0.941176470588235,0.886274509803922;0.996078431372549,0.941176470588235,0.882352941176471;0.996078431372549,0.937254901960784,0.878431372549020;0.996078431372549,0.937254901960784,0.878431372549020;0.996078431372549,0.933333333333333,0.874509803921569;0.996078431372549,0.933333333333333,0.870588235294118;0.996078431372549,0.929411764705882,0.862745098039216;0.996078431372549,0.929411764705882,0.862745098039216;0.996078431372549,0.925490196078431,0.854901960784314;0.996078431372549,0.925490196078431,0.850980392156863;0.996078431372549,0.925490196078431,0.850980392156863;0.996078431372549,0.921568627450980,0.843137254901961;0.996078431372549,0.921568627450980,0.843137254901961;0.996078431372549,0.917647058823529,0.839215686274510;0.996078431372549,0.913725490196078,0.835294117647059;0.996078431372549,0.913725490196078,0.831372549019608;0.996078431372549,0.909803921568627,0.827450980392157;0.996078431372549,0.909803921568627,0.823529411764706;0.996078431372549,0.905882352941177,0.819607843137255;0.996078431372549,0.905882352941177,0.815686274509804;0.996078431372549,0.901960784313726,0.811764705882353;0.996078431372549,0.901960784313726,0.807843137254902;0.992156862745098,0.898039215686275,0.803921568627451;0.992156862745098,0.898039215686275,0.800000000000000;0.992156862745098,0.894117647058824,0.796078431372549;0.992156862745098,0.890196078431373,0.788235294117647;0.992156862745098,0.890196078431373,0.784313725490196;0.992156862745098,0.886274509803922,0.776470588235294;0.992156862745098,0.882352941176471,0.768627450980392;0.992156862745098,0.882352941176471,0.768627450980392;0.992156862745098,0.874509803921569,0.756862745098039;0.992156862745098,0.874509803921569,0.756862745098039;0.992156862745098,0.870588235294118,0.745098039215686;0.992156862745098,0.866666666666667,0.741176470588235;0.992156862745098,0.866666666666667,0.741176470588235;0.992156862745098,0.862745098039216,0.729411764705882;0.992156862745098,0.858823529411765,0.725490196078431;0.992156862745098,0.854901960784314,0.717647058823529;0.992156862745098,0.854901960784314,0.713725490196078;0.992156862745098,0.850980392156863,0.705882352941177;0.992156862745098,0.847058823529412,0.701960784313725;0.992156862745098,0.847058823529412,0.698039215686275;0.992156862745098,0.843137254901961,0.690196078431373;0.992156862745098,0.839215686274510,0.686274509803922;0.992156862745098,0.839215686274510,0.682352941176471;0.992156862745098,0.835294117647059,0.674509803921569;0.992156862745098,0.831372549019608,0.670588235294118;0.992156862745098,0.827450980392157,0.662745098039216;0.992156862745098,0.827450980392157,0.658823529411765;0.992156862745098,0.823529411764706,0.654901960784314;0.992156862745098,0.819607843137255,0.647058823529412;0.992156862745098,0.819607843137255,0.643137254901961;0.992156862745098,0.811764705882353,0.635294117647059;0.992156862745098,0.811764705882353,0.631372549019608;0.992156862745098,0.803921568627451,0.619607843137255;0.992156862745098,0.803921568627451,0.615686274509804;0.992156862745098,0.796078431372549,0.603921568627451;0.992156862745098,0.792156862745098,0.596078431372549;0.992156862745098,0.792156862745098,0.596078431372549;0.992156862745098,0.784313725490196,0.584313725490196;0.992156862745098,0.780392156862745,0.580392156862745;0.992156862745098,0.776470588235294,0.572549019607843;0.992156862745098,0.772549019607843,0.564705882352941;0.992156862745098,0.768627450980392,0.556862745098039;0.992156862745098,0.760784313725490,0.549019607843137;0.992156862745098,0.756862745098039,0.545098039215686;0.992156862745098,0.752941176470588,0.537254901960784;0.992156862745098,0.749019607843137,0.529411764705882;0.992156862745098,0.745098039215686,0.521568627450980;0.992156862745098,0.741176470588235,0.517647058823530;0.992156862745098,0.737254901960784,0.509803921568627;0.992156862745098,0.733333333333333,0.501960784313726;0.992156862745098,0.729411764705882,0.498039215686275;0.992156862745098,0.725490196078431,0.490196078431373;0.992156862745098,0.721568627450980,0.482352941176471;0.992156862745098,0.717647058823529,0.474509803921569;0.992156862745098,0.709803921568628,0.466666666666667;0.992156862745098,0.709803921568628,0.462745098039216;0.992156862745098,0.698039215686275,0.447058823529412;0.992156862745098,0.698039215686275,0.447058823529412;0.992156862745098,0.690196078431373,0.435294117647059;0.992156862745098,0.686274509803922,0.427450980392157;0.992156862745098,0.686274509803922,0.427450980392157;0.992156862745098,0.678431372549020,0.415686274509804;0.992156862745098,0.674509803921569,0.407843137254902;0.992156862745098,0.670588235294118,0.403921568627451;0.992156862745098,0.666666666666667,0.400000000000000;0.992156862745098,0.662745098039216,0.392156862745098;0.992156862745098,0.658823529411765,0.388235294117647;0.992156862745098,0.654901960784314,0.380392156862745;0.992156862745098,0.650980392156863,0.376470588235294;0.992156862745098,0.647058823529412,0.368627450980392;0.992156862745098,0.643137254901961,0.364705882352941;0.992156862745098,0.639215686274510,0.356862745098039;0.992156862745098,0.635294117647059,0.352941176470588;0.992156862745098,0.627450980392157,0.341176470588235;0.992156862745098,0.627450980392157,0.341176470588235;0.992156862745098,0.619607843137255,0.329411764705882;0.992156862745098,0.619607843137255,0.329411764705882;0.992156862745098,0.615686274509804,0.321568627450980;0.992156862745098,0.603921568627451,0.309803921568627;0.992156862745098,0.603921568627451,0.309803921568627;0.992156862745098,0.596078431372549,0.298039215686275;0.992156862745098,0.592156862745098,0.294117647058824;0.992156862745098,0.588235294117647,0.290196078431373;0.992156862745098,0.584313725490196,0.282352941176471;0.992156862745098,0.584313725490196,0.282352941176471;0.992156862745098,0.576470588235294,0.270588235294118;0.992156862745098,0.572549019607843,0.266666666666667;0.992156862745098,0.568627450980392,0.258823529411765;0.992156862745098,0.564705882352941,0.254901960784314;0.992156862745098,0.560784313725490,0.247058823529412;0.992156862745098,0.556862745098039,0.243137254901961;0.992156862745098,0.552941176470588,0.235294117647059;0.988235294117647,0.549019607843137,0.231372549019608;0.988235294117647,0.545098039215686,0.227450980392157;0.988235294117647,0.541176470588235,0.219607843137255;0.984313725490196,0.537254901960784,0.215686274509804;0.984313725490196,0.529411764705882,0.211764705882353;0.980392156862745,0.521568627450980,0.200000000000000;0.980392156862745,0.521568627450980,0.200000000000000;0.976470588235294,0.513725490196078,0.192156862745098;0.976470588235294,0.513725490196078,0.188235294117647;0.976470588235294,0.509803921568627,0.184313725490196;0.972549019607843,0.501960784313726,0.176470588235294;0.972549019607843,0.501960784313726,0.176470588235294;0.968627450980392,0.490196078431373,0.164705882352941;0.968627450980392,0.486274509803922,0.160784313725490;0.968627450980392,0.482352941176471,0.156862745098039;0.964705882352941,0.478431372549020,0.149019607843137;0.964705882352941,0.474509803921569,0.145098039215686;0.964705882352941,0.470588235294118,0.141176470588235;0.960784313725490,0.462745098039216,0.133333333333333;0.960784313725490,0.458823529411765,0.129411764705882;0.956862745098039,0.454901960784314,0.125490196078431;0.956862745098039,0.450980392156863,0.121568627450980;0.956862745098039,0.447058823529412,0.113725490196078;0.952941176470588,0.443137254901961,0.109803921568627;0.952941176470588,0.439215686274510,0.105882352941176;0.952941176470588,0.435294117647059,0.0980392156862745;0.949019607843137,0.427450980392157,0.0941176470588235;0.949019607843137,0.423529411764706,0.0901960784313726;0.945098039215686,0.419607843137255,0.0862745098039216;0.945098039215686,0.411764705882353,0.0745098039215686;0.945098039215686,0.411764705882353,0.0745098039215686;0.937254901960784,0.403921568627451,0.0705882352941177;0.937254901960784,0.403921568627451,0.0705882352941177;0.937254901960784,0.400000000000000,0.0666666666666667;0.929411764705882,0.392156862745098,0.0627450980392157;0.929411764705882,0.392156862745098,0.0627450980392157;0.925490196078431,0.384313725490196,0.0588235294117647;0.921568627450980,0.380392156862745,0.0549019607843137;0.917647058823529,0.376470588235294,0.0549019607843137;0.913725490196078,0.372549019607843,0.0509803921568627;0.913725490196078,0.364705882352941,0.0509803921568627;0.909803921568627,0.360784313725490,0.0470588235294118;0.905882352941177,0.356862745098039,0.0431372549019608;0.901960784313726,0.352941176470588,0.0431372549019608;0.898039215686275,0.349019607843137,0.0392156862745098;0.898039215686275,0.345098039215686,0.0392156862745098;0.894117647058824,0.341176470588235,0.0352941176470588;0.890196078431373,0.337254901960784,0.0352941176470588;0.886274509803922,0.333333333333333,0.0313725490196078;0.886274509803922,0.329411764705882,0.0274509803921569;0.882352941176471,0.325490196078431,0.0274509803921569;0.878431372549020,0.321568627450980,0.0235294117647059;0.874509803921569,0.317647058823529,0.0235294117647059;0.870588235294118,0.309803921568627,0.0196078431372549;0.870588235294118,0.309803921568627,0.0196078431372549;0.862745098039216,0.301960784313725,0.0117647058823529;0.862745098039216,0.298039215686275,0.0117647058823529;0.862745098039216,0.298039215686275,0.0117647058823529;0.854901960784314,0.290196078431373,0.00784313725490196;0.854901960784314,0.290196078431373,0.00784313725490196;0.850980392156863,0.282352941176471,0.00392156862745098;0.843137254901961,0.278431372549020,0.00392156862745098;0.839215686274510,0.278431372549020,0.00392156862745098;0.831372549019608,0.274509803921569,0.00392156862745098;0.827450980392157,0.270588235294118,0.00392156862745098;0.819607843137255,0.270588235294118,0.00392156862745098;0.811764705882353,0.266666666666667,0.00392156862745098;0.807843137254902,0.266666666666667,0.00392156862745098;0.800000000000000,0.262745098039216,0.00392156862745098;0.796078431372549,0.262745098039216,0.00392156862745098;0.788235294117647,0.258823529411765,0.00392156862745098;0.780392156862745,0.254901960784314,0.00392156862745098;0.772549019607843,0.250980392156863,0.00392156862745098;0.768627450980392,0.250980392156863,0.00392156862745098;0.764705882352941,0.250980392156863,0.00392156862745098;0.752941176470588,0.247058823529412,0.00392156862745098;0.749019607843137,0.247058823529412,0.00392156862745098;0.737254901960784,0.239215686274510,0.00784313725490196;0.737254901960784,0.239215686274510,0.00784313725490196;0.725490196078431,0.235294117647059,0.00784313725490196;0.721568627450980,0.235294117647059,0.00784313725490196;0.717647058823529,0.235294117647059,0.00784313725490196;0.705882352941177,0.231372549019608,0.00784313725490196;0.705882352941177,0.231372549019608,0.00784313725490196;0.694117647058824,0.227450980392157,0.00784313725490196;0.686274509803922,0.223529411764706,0.00784313725490196;0.682352941176471,0.219607843137255,0.00784313725490196;0.674509803921569,0.219607843137255,0.00784313725490196;0.670588235294118,0.215686274509804,0.00784313725490196;0.662745098039216,0.215686274509804,0.00784313725490196;0.654901960784314,0.211764705882353,0.00784313725490196;0.650980392156863,0.211764705882353,0.00784313725490196;0.643137254901961,0.207843137254902,0.0117647058823529;0.639215686274510,0.207843137254902,0.0117647058823529;0.635294117647059,0.203921568627451,0.0117647058823529;0.631372549019608,0.203921568627451,0.0117647058823529;0.623529411764706,0.200000000000000,0.0117647058823529;0.619607843137255,0.200000000000000,0.0117647058823529;0.615686274509804,0.196078431372549,0.0117647058823529;0.611764705882353,0.196078431372549,0.0117647058823529;0.607843137254902,0.192156862745098,0.0117647058823529;0.596078431372549,0.188235294117647,0.0117647058823529;0.596078431372549,0.188235294117647,0.0117647058823529;0.588235294117647,0.184313725490196,0.0117647058823529;0.584313725490196,0.184313725490196,0.0117647058823529;0.584313725490196,0.184313725490196,0.0117647058823529;0.572549019607843,0.180392156862745,0.0117647058823529;0.572549019607843,0.180392156862745,0.0117647058823529;0.564705882352941,0.176470588235294,0.0117647058823529;0.556862745098039,0.176470588235294,0.0117647058823529;0.552941176470588,0.172549019607843,0.0117647058823529;0.549019607843137,0.172549019607843,0.0117647058823529;0.545098039215686,0.168627450980392,0.0117647058823529;0.541176470588235,0.168627450980392,0.0117647058823529;0.533333333333333,0.164705882352941,0.0117647058823529;0.529411764705882,0.164705882352941,0.0117647058823529;0.525490196078431,0.160784313725490,0.0117647058823529;0.521568627450980,0.160784313725490,0.0117647058823529;0.513725490196078,0.156862745098039,0.0117647058823529;0.509803921568627,0.156862745098039,0.0117647058823529;0.501960784313726,0.152941176470588,0.0117647058823529;0.501960784313726,0.152941176470588,0.0117647058823529;0.501960784313726,0.152941176470588,0.0117647058823529]; + [1,0.960784313725490,0.941176470588235;0.996078431372549,0.956862745098039,0.937254901960784;0.996078431372549,0.952941176470588,0.933333333333333;0.996078431372549,0.952941176470588,0.929411764705882;0.996078431372549,0.945098039215686,0.921568627450980;0.996078431372549,0.945098039215686,0.921568627450980;0.996078431372549,0.941176470588235,0.913725490196078;0.996078431372549,0.937254901960784,0.909803921568627;0.996078431372549,0.937254901960784,0.905882352941177;0.996078431372549,0.933333333333333,0.901960784313726;0.996078431372549,0.933333333333333,0.901960784313726;0.996078431372549,0.929411764705882,0.894117647058824;0.996078431372549,0.925490196078431,0.890196078431373;0.996078431372549,0.921568627450980,0.886274509803922;0.996078431372549,0.921568627450980,0.882352941176471;0.996078431372549,0.917647058823529,0.878431372549020;0.996078431372549,0.913725490196078,0.878431372549020;0.996078431372549,0.913725490196078,0.874509803921569;0.996078431372549,0.909803921568627,0.870588235294118;0.996078431372549,0.905882352941177,0.866666666666667;0.996078431372549,0.905882352941177,0.862745098039216;0.996078431372549,0.901960784313726,0.858823529411765;0.996078431372549,0.898039215686275,0.854901960784314;0.996078431372549,0.894117647058824,0.847058823529412;0.996078431372549,0.894117647058824,0.847058823529412;0.996078431372549,0.890196078431373,0.843137254901961;0.996078431372549,0.890196078431373,0.839215686274510;0.996078431372549,0.886274509803922,0.835294117647059;0.996078431372549,0.882352941176471,0.827450980392157;0.996078431372549,0.882352941176471,0.827450980392157;0.992156862745098,0.874509803921569,0.819607843137255;0.992156862745098,0.870588235294118,0.815686274509804;0.992156862745098,0.866666666666667,0.807843137254902;0.992156862745098,0.862745098039216,0.803921568627451;0.992156862745098,0.862745098039216,0.800000000000000;0.992156862745098,0.854901960784314,0.792156862745098;0.992156862745098,0.847058823529412,0.784313725490196;0.992156862745098,0.843137254901961,0.780392156862745;0.992156862745098,0.839215686274510,0.772549019607843;0.992156862745098,0.835294117647059,0.764705882352941;0.992156862745098,0.831372549019608,0.760784313725490;0.992156862745098,0.827450980392157,0.752941176470588;0.992156862745098,0.819607843137255,0.749019607843137;0.992156862745098,0.815686274509804,0.741176470588235;0.992156862745098,0.811764705882353,0.737254901960784;0.992156862745098,0.807843137254902,0.729411764705882;0.988235294117647,0.803921568627451,0.725490196078431;0.988235294117647,0.796078431372549,0.713725490196078;0.988235294117647,0.792156862745098,0.713725490196078;0.988235294117647,0.788235294117647,0.705882352941177;0.988235294117647,0.784313725490196,0.698039215686275;0.988235294117647,0.780392156862745,0.694117647058824;0.988235294117647,0.772549019607843,0.682352941176471;0.988235294117647,0.772549019607843,0.682352941176471;0.988235294117647,0.760784313725490,0.670588235294118;0.988235294117647,0.756862745098039,0.662745098039216;0.988235294117647,0.752941176470588,0.658823529411765;0.988235294117647,0.749019607843137,0.650980392156863;0.988235294117647,0.749019607843137,0.650980392156863;0.988235294117647,0.741176470588235,0.639215686274510;0.988235294117647,0.733333333333333,0.635294117647059;0.988235294117647,0.729411764705882,0.627450980392157;0.988235294117647,0.725490196078431,0.623529411764706;0.988235294117647,0.721568627450980,0.615686274509804;0.988235294117647,0.713725490196078,0.611764705882353;0.988235294117647,0.709803921568628,0.603921568627451;0.988235294117647,0.705882352941177,0.600000000000000;0.988235294117647,0.698039215686275,0.592156862745098;0.988235294117647,0.694117647058824,0.588235294117647;0.988235294117647,0.690196078431373,0.580392156862745;0.988235294117647,0.686274509803922,0.576470588235294;0.988235294117647,0.674509803921569,0.564705882352941;0.988235294117647,0.674509803921569,0.564705882352941;0.988235294117647,0.662745098039216,0.552941176470588;0.988235294117647,0.658823529411765,0.549019607843137;0.988235294117647,0.658823529411765,0.545098039215686;0.988235294117647,0.650980392156863,0.537254901960784;0.988235294117647,0.650980392156863,0.537254901960784;0.988235294117647,0.639215686274510,0.525490196078431;0.988235294117647,0.635294117647059,0.517647058823530;0.988235294117647,0.627450980392157,0.513725490196078;0.988235294117647,0.623529411764706,0.505882352941176;0.988235294117647,0.619607843137255,0.501960784313726;0.988235294117647,0.615686274509804,0.494117647058824;0.988235294117647,0.607843137254902,0.490196078431373;0.988235294117647,0.603921568627451,0.482352941176471;0.988235294117647,0.600000000000000,0.478431372549020;0.988235294117647,0.592156862745098,0.470588235294118;0.988235294117647,0.588235294117647,0.466666666666667;0.988235294117647,0.584313725490196,0.458823529411765;0.988235294117647,0.580392156862745,0.454901960784314;0.988235294117647,0.572549019607843,0.447058823529412;0.984313725490196,0.568627450980392,0.443137254901961;0.984313725490196,0.564705882352941,0.439215686274510;0.984313725490196,0.560784313725490,0.435294117647059;0.984313725490196,0.549019607843137,0.423529411764706;0.984313725490196,0.549019607843137,0.423529411764706;0.984313725490196,0.541176470588235,0.415686274509804;0.984313725490196,0.537254901960784,0.411764705882353;0.984313725490196,0.533333333333333,0.407843137254902;0.984313725490196,0.525490196078431,0.400000000000000;0.984313725490196,0.521568627450980,0.396078431372549;0.984313725490196,0.513725490196078,0.388235294117647;0.984313725490196,0.509803921568627,0.384313725490196;0.984313725490196,0.505882352941176,0.380392156862745;0.984313725490196,0.498039215686275,0.372549019607843;0.984313725490196,0.494117647058824,0.368627450980392;0.984313725490196,0.490196078431373,0.364705882352941;0.984313725490196,0.486274509803922,0.360784313725490;0.984313725490196,0.478431372549020,0.352941176470588;0.984313725490196,0.474509803921569,0.349019607843137;0.984313725490196,0.470588235294118,0.345098039215686;0.984313725490196,0.466666666666667,0.341176470588235;0.984313725490196,0.458823529411765,0.333333333333333;0.984313725490196,0.454901960784314,0.329411764705882;0.984313725490196,0.450980392156863,0.325490196078431;0.984313725490196,0.447058823529412,0.321568627450980;0.984313725490196,0.439215686274510,0.313725490196078;0.984313725490196,0.435294117647059,0.309803921568627;0.984313725490196,0.427450980392157,0.301960784313725;0.984313725490196,0.427450980392157,0.301960784313725;0.984313725490196,0.415686274509804,0.290196078431373;0.980392156862745,0.411764705882353,0.286274509803922;0.980392156862745,0.411764705882353,0.286274509803922;0.980392156862745,0.400000000000000,0.278431372549020;0.980392156862745,0.396078431372549,0.278431372549020;0.976470588235294,0.388235294117647,0.270588235294118;0.972549019607843,0.380392156862745,0.266666666666667;0.972549019607843,0.376470588235294,0.262745098039216;0.972549019607843,0.368627450980392,0.258823529411765;0.968627450980392,0.364705882352941,0.258823529411765;0.968627450980392,0.356862745098039,0.254901960784314;0.968627450980392,0.352941176470588,0.250980392156863;0.964705882352941,0.349019607843137,0.247058823529412;0.964705882352941,0.341176470588235,0.243137254901961;0.960784313725490,0.337254901960784,0.239215686274510;0.960784313725490,0.329411764705882,0.235294117647059;0.960784313725490,0.325490196078431,0.231372549019608;0.956862745098039,0.313725490196078,0.223529411764706;0.956862745098039,0.313725490196078,0.223529411764706;0.956862745098039,0.305882352941177,0.219607843137255;0.952941176470588,0.298039215686275,0.211764705882353;0.952941176470588,0.294117647058824,0.211764705882353;0.949019607843137,0.282352941176471,0.203921568627451;0.949019607843137,0.282352941176471,0.203921568627451;0.945098039215686,0.270588235294118,0.196078431372549;0.945098039215686,0.266666666666667,0.196078431372549;0.945098039215686,0.266666666666667,0.196078431372549;0.941176470588235,0.254901960784314,0.188235294117647;0.941176470588235,0.250980392156863,0.184313725490196;0.937254901960784,0.243137254901961,0.180392156862745;0.937254901960784,0.239215686274510,0.176470588235294;0.937254901960784,0.231372549019608,0.172549019607843;0.933333333333333,0.227450980392157,0.168627450980392;0.929411764705882,0.223529411764706,0.168627450980392;0.925490196078431,0.219607843137255,0.164705882352941;0.917647058823529,0.215686274509804,0.164705882352941;0.913725490196078,0.207843137254902,0.160784313725490;0.909803921568627,0.203921568627451,0.160784313725490;0.905882352941177,0.200000000000000,0.156862745098039;0.901960784313726,0.196078431372549,0.156862745098039;0.898039215686275,0.192156862745098,0.152941176470588;0.890196078431373,0.184313725490196,0.152941176470588;0.890196078431373,0.184313725490196,0.152941176470588;0.882352941176471,0.180392156862745,0.149019607843137;0.874509803921569,0.172549019607843,0.145098039215686;0.874509803921569,0.172549019607843,0.145098039215686;0.866666666666667,0.160784313725490,0.141176470588235;0.866666666666667,0.160784313725490,0.141176470588235;0.858823529411765,0.152941176470588,0.137254901960784;0.850980392156863,0.149019607843137,0.137254901960784;0.850980392156863,0.149019607843137,0.137254901960784;0.843137254901961,0.141176470588235,0.133333333333333;0.839215686274510,0.137254901960784,0.129411764705882;0.835294117647059,0.133333333333333,0.129411764705882;0.831372549019608,0.129411764705882,0.125490196078431;0.827450980392157,0.121568627450980,0.125490196078431;0.823529411764706,0.117647058823529,0.121568627450980;0.815686274509804,0.113725490196078,0.121568627450980;0.811764705882353,0.109803921568627,0.121568627450980;0.807843137254902,0.105882352941176,0.117647058823529;0.803921568627451,0.101960784313725,0.117647058823529;0.800000000000000,0.0980392156862745,0.113725490196078;0.796078431372549,0.0941176470588235,0.113725490196078;0.788235294117647,0.0901960784313726,0.109803921568627;0.784313725490196,0.0901960784313726,0.109803921568627;0.776470588235294,0.0862745098039216,0.109803921568627;0.776470588235294,0.0862745098039216,0.109803921568627;0.772549019607843,0.0862745098039216,0.105882352941176;0.764705882352941,0.0862745098039216,0.105882352941176;0.760784313725490,0.0862745098039216,0.105882352941176;0.752941176470588,0.0823529411764706,0.101960784313725;0.752941176470588,0.0823529411764706,0.101960784313725;0.745098039215686,0.0784313725490196,0.101960784313725;0.737254901960784,0.0784313725490196,0.101960784313725;0.733333333333333,0.0784313725490196,0.0980392156862745;0.729411764705882,0.0784313725490196,0.0980392156862745;0.725490196078431,0.0745098039215686,0.0980392156862745;0.721568627450980,0.0745098039215686,0.0980392156862745;0.717647058823529,0.0745098039215686,0.0941176470588235;0.709803921568628,0.0705882352941177,0.0941176470588235;0.705882352941177,0.0705882352941177,0.0941176470588235;0.701960784313725,0.0705882352941177,0.0941176470588235;0.698039215686275,0.0705882352941177,0.0901960784313726;0.694117647058824,0.0666666666666667,0.0901960784313726;0.686274509803922,0.0666666666666667,0.0901960784313726;0.682352941176471,0.0666666666666667,0.0901960784313726;0.678431372549020,0.0666666666666667,0.0862745098039216;0.674509803921569,0.0627450980392157,0.0862745098039216;0.670588235294118,0.0627450980392157,0.0862745098039216;0.658823529411765,0.0588235294117647,0.0823529411764706;0.658823529411765,0.0588235294117647,0.0823529411764706;0.654901960784314,0.0588235294117647,0.0823529411764706;0.647058823529412,0.0588235294117647,0.0823529411764706;0.647058823529412,0.0588235294117647,0.0823529411764706;0.631372549019608,0.0549019607843137,0.0784313725490196;0.627450980392157,0.0509803921568627,0.0784313725490196;0.615686274509804,0.0509803921568627,0.0784313725490196;0.607843137254902,0.0470588235294118,0.0745098039215686;0.600000000000000,0.0470588235294118,0.0745098039215686;0.592156862745098,0.0431372549019608,0.0745098039215686;0.584313725490196,0.0431372549019608,0.0745098039215686;0.576470588235294,0.0392156862745098,0.0705882352941177;0.568627450980392,0.0392156862745098,0.0705882352941177;0.560784313725490,0.0352941176470588,0.0705882352941177;0.552941176470588,0.0352941176470588,0.0705882352941177;0.545098039215686,0.0313725490196078,0.0666666666666667;0.541176470588235,0.0313725490196078,0.0666666666666667;0.533333333333333,0.0313725490196078,0.0666666666666667;0.525490196078431,0.0274509803921569,0.0666666666666667;0.517647058823530,0.0274509803921569,0.0627450980392157;0.509803921568627,0.0235294117647059,0.0627450980392157;0.498039215686275,0.0196078431372549,0.0627450980392157;0.494117647058824,0.0196078431372549,0.0627450980392157;0.478431372549020,0.0156862745098039,0.0588235294117647;0.474509803921569,0.0156862745098039,0.0588235294117647;0.470588235294118,0.0156862745098039,0.0588235294117647;0.454901960784314,0.0117647058823529,0.0549019607843137;0.454901960784314,0.0117647058823529,0.0549019607843137;0.439215686274510,0.00784313725490196,0.0549019607843137;0.435294117647059,0.00392156862745098,0.0549019607843137;0.423529411764706,0.00392156862745098,0.0509803921568627;0.415686274509804,0,0.0509803921568627;0.407843137254902,0,0.0509803921568627;0.407843137254902,0,0.0509803921568627]; + [1,0.996078431372549,0.890196078431373;1,0.996078431372549,0.886274509803922;1,0.996078431372549,0.882352941176471;1,0.992156862745098,0.874509803921569;1,0.992156862745098,0.870588235294118;1,0.992156862745098,0.866666666666667;1,0.992156862745098,0.858823529411765;1,0.988235294117647,0.854901960784314;1,0.988235294117647,0.850980392156863;1,0.988235294117647,0.847058823529412;1,0.988235294117647,0.839215686274510;1,0.984313725490196,0.835294117647059;1,0.984313725490196,0.827450980392157;1,0.984313725490196,0.823529411764706;1,0.980392156862745,0.815686274509804;1,0.980392156862745,0.815686274509804;1,0.980392156862745,0.803921568627451;1,0.980392156862745,0.800000000000000;1,0.980392156862745,0.800000000000000;1,0.976470588235294,0.788235294117647;1,0.976470588235294,0.788235294117647;1,0.976470588235294,0.780392156862745;1,0.972549019607843,0.776470588235294;1,0.972549019607843,0.768627450980392;1,0.972549019607843,0.764705882352941;1,0.972549019607843,0.760784313725490;1,0.968627450980392,0.752941176470588;1,0.968627450980392,0.749019607843137;1,0.968627450980392,0.745098039215686;1,0.968627450980392,0.741176470588235;0.996078431372549,0.964705882352941,0.733333333333333;0.996078431372549,0.964705882352941,0.729411764705882;0.996078431372549,0.960784313725490,0.725490196078431;0.996078431372549,0.960784313725490,0.717647058823529;0.996078431372549,0.956862745098039,0.713725490196078;0.996078431372549,0.952941176470588,0.709803921568628;0.996078431372549,0.949019607843137,0.698039215686275;0.996078431372549,0.949019607843137,0.698039215686275;0.996078431372549,0.945098039215686,0.686274509803922;0.996078431372549,0.945098039215686,0.686274509803922;0.996078431372549,0.941176470588235,0.674509803921569;0.996078431372549,0.937254901960784,0.670588235294118;0.996078431372549,0.937254901960784,0.670588235294118;0.996078431372549,0.933333333333333,0.658823529411765;0.996078431372549,0.929411764705882,0.654901960784314;0.996078431372549,0.925490196078431,0.650980392156863;0.996078431372549,0.925490196078431,0.643137254901961;0.996078431372549,0.921568627450980,0.639215686274510;0.996078431372549,0.921568627450980,0.635294117647059;0.996078431372549,0.917647058823529,0.627450980392157;0.996078431372549,0.913725490196078,0.623529411764706;0.996078431372549,0.913725490196078,0.619607843137255;0.996078431372549,0.909803921568627,0.611764705882353;0.996078431372549,0.905882352941177,0.607843137254902;0.996078431372549,0.905882352941177,0.603921568627451;0.996078431372549,0.901960784313726,0.596078431372549;0.996078431372549,0.898039215686275,0.592156862745098;0.996078431372549,0.898039215686275,0.588235294117647;0.996078431372549,0.894117647058824,0.580392156862745;0.996078431372549,0.894117647058824,0.576470588235294;0.996078431372549,0.886274509803922,0.568627450980392;0.996078431372549,0.886274509803922,0.564705882352941;0.996078431372549,0.878431372549020,0.549019607843137;0.996078431372549,0.878431372549020,0.545098039215686;0.996078431372549,0.870588235294118,0.533333333333333;0.996078431372549,0.866666666666667,0.525490196078431;0.996078431372549,0.866666666666667,0.525490196078431;0.996078431372549,0.858823529411765,0.505882352941176;0.996078431372549,0.854901960784314,0.501960784313726;0.996078431372549,0.854901960784314,0.490196078431373;0.996078431372549,0.850980392156863,0.482352941176471;0.996078431372549,0.847058823529412,0.474509803921569;0.996078431372549,0.843137254901961,0.466666666666667;0.996078431372549,0.839215686274510,0.458823529411765;0.996078431372549,0.835294117647059,0.450980392156863;0.996078431372549,0.831372549019608,0.443137254901961;0.996078431372549,0.827450980392157,0.435294117647059;0.996078431372549,0.823529411764706,0.427450980392157;0.996078431372549,0.819607843137255,0.419607843137255;0.996078431372549,0.815686274509804,0.407843137254902;0.996078431372549,0.811764705882353,0.403921568627451;0.996078431372549,0.807843137254902,0.396078431372549;0.996078431372549,0.803921568627451,0.384313725490196;0.996078431372549,0.800000000000000,0.376470588235294;0.996078431372549,0.792156862745098,0.364705882352941;0.996078431372549,0.792156862745098,0.360784313725490;0.996078431372549,0.784313725490196,0.345098039215686;0.996078431372549,0.784313725490196,0.341176470588235;0.996078431372549,0.776470588235294,0.329411764705882;0.996078431372549,0.772549019607843,0.321568627450980;0.996078431372549,0.772549019607843,0.321568627450980;0.996078431372549,0.764705882352941,0.305882352941177;0.996078431372549,0.760784313725490,0.301960784313725;0.996078431372549,0.752941176470588,0.298039215686275;0.996078431372549,0.749019607843137,0.290196078431373;0.996078431372549,0.745098039215686,0.286274509803922;0.996078431372549,0.737254901960784,0.282352941176471;0.996078431372549,0.733333333333333,0.278431372549020;0.996078431372549,0.729411764705882,0.274509803921569;0.996078431372549,0.721568627450980,0.270588235294118;0.996078431372549,0.717647058823529,0.262745098039216;0.996078431372549,0.713725490196078,0.258823529411765;0.996078431372549,0.705882352941177,0.254901960784314;0.996078431372549,0.698039215686275,0.247058823529412;0.996078431372549,0.694117647058824,0.247058823529412;0.996078431372549,0.686274509803922,0.235294117647059;0.996078431372549,0.686274509803922,0.235294117647059;0.996078431372549,0.678431372549020,0.231372549019608;0.996078431372549,0.670588235294118,0.223529411764706;0.996078431372549,0.670588235294118,0.223529411764706;0.996078431372549,0.658823529411765,0.211764705882353;0.996078431372549,0.654901960784314,0.207843137254902;0.996078431372549,0.647058823529412,0.203921568627451;0.996078431372549,0.643137254901961,0.200000000000000;0.996078431372549,0.643137254901961,0.200000000000000;0.996078431372549,0.631372549019608,0.188235294117647;0.996078431372549,0.627450980392157,0.184313725490196;0.996078431372549,0.623529411764706,0.180392156862745;0.996078431372549,0.615686274509804,0.176470588235294;0.996078431372549,0.611764705882353,0.168627450980392;0.996078431372549,0.607843137254902,0.164705882352941;0.996078431372549,0.600000000000000,0.160784313725490;0.992156862745098,0.596078431372549,0.156862745098039;0.992156862745098,0.592156862745098,0.156862745098039;0.988235294117647,0.584313725490196,0.152941176470588;0.988235294117647,0.580392156862745,0.149019607843137;0.984313725490196,0.576470588235294,0.149019607843137;0.980392156862745,0.564705882352941,0.141176470588235;0.980392156862745,0.564705882352941,0.141176470588235;0.976470588235294,0.556862745098039,0.137254901960784;0.976470588235294,0.552941176470588,0.137254901960784;0.972549019607843,0.549019607843137,0.133333333333333;0.968627450980392,0.541176470588235,0.129411764705882;0.968627450980392,0.541176470588235,0.129411764705882;0.964705882352941,0.529411764705882,0.125490196078431;0.960784313725490,0.525490196078431,0.121568627450980;0.960784313725490,0.521568627450980,0.117647058823529;0.956862745098039,0.513725490196078,0.117647058823529;0.956862745098039,0.509803921568627,0.113725490196078;0.952941176470588,0.505882352941176,0.109803921568627;0.949019607843137,0.498039215686275,0.109803921568627;0.949019607843137,0.494117647058824,0.105882352941176;0.945098039215686,0.490196078431373,0.101960784313725;0.945098039215686,0.486274509803922,0.101960784313725;0.941176470588235,0.478431372549020,0.0980392156862745;0.941176470588235,0.474509803921569,0.0941176470588235;0.937254901960784,0.470588235294118,0.0941176470588235;0.937254901960784,0.462745098039216,0.0901960784313726;0.933333333333333,0.458823529411765,0.0862745098039216;0.929411764705882,0.454901960784314,0.0862745098039216;0.929411764705882,0.450980392156863,0.0823529411764706;0.925490196078431,0.439215686274510,0.0784313725490196;0.925490196078431,0.439215686274510,0.0784313725490196;0.917647058823529,0.431372549019608,0.0745098039215686;0.917647058823529,0.431372549019608,0.0745098039215686;0.913725490196078,0.427450980392157,0.0705882352941177;0.905882352941177,0.415686274509804,0.0666666666666667;0.905882352941177,0.415686274509804,0.0666666666666667;0.898039215686275,0.407843137254902,0.0627450980392157;0.894117647058824,0.403921568627451,0.0588235294117647;0.890196078431373,0.400000000000000,0.0588235294117647;0.886274509803922,0.396078431372549,0.0549019607843137;0.882352941176471,0.392156862745098,0.0549019607843137;0.878431372549020,0.384313725490196,0.0509803921568627;0.874509803921569,0.380392156862745,0.0470588235294118;0.870588235294118,0.376470588235294,0.0470588235294118;0.866666666666667,0.372549019607843,0.0431372549019608;0.862745098039216,0.368627450980392,0.0431372549019608;0.858823529411765,0.364705882352941,0.0392156862745098;0.854901960784314,0.360784313725490,0.0392156862745098;0.850980392156863,0.352941176470588,0.0352941176470588;0.847058823529412,0.349019607843137,0.0313725490196078;0.843137254901961,0.345098039215686,0.0313725490196078;0.839215686274510,0.341176470588235,0.0274509803921569;0.835294117647059,0.337254901960784,0.0274509803921569;0.827450980392157,0.329411764705882,0.0235294117647059;0.827450980392157,0.329411764705882,0.0235294117647059;0.819607843137255,0.317647058823529,0.0156862745098039;0.815686274509804,0.313725490196078,0.0156862745098039;0.815686274509804,0.313725490196078,0.0156862745098039;0.807843137254902,0.305882352941177,0.0117647058823529;0.807843137254902,0.305882352941177,0.0117647058823529;0.800000000000000,0.298039215686275,0.00784313725490196;0.792156862745098,0.294117647058824,0.00784313725490196;0.788235294117647,0.290196078431373,0.00784313725490196;0.780392156862745,0.286274509803922,0.00784313725490196;0.776470588235294,0.286274509803922,0.00784313725490196;0.768627450980392,0.282352941176471,0.00784313725490196;0.760784313725490,0.278431372549020,0.00784313725490196;0.756862745098039,0.274509803921569,0.00784313725490196;0.749019607843137,0.274509803921569,0.00784313725490196;0.745098039215686,0.270588235294118,0.00784313725490196;0.737254901960784,0.266666666666667,0.00784313725490196;0.729411764705882,0.262745098039216,0.00784313725490196;0.721568627450980,0.258823529411765,0.00784313725490196;0.717647058823529,0.258823529411765,0.00784313725490196;0.713725490196078,0.254901960784314,0.00784313725490196;0.701960784313725,0.250980392156863,0.00784313725490196;0.698039215686275,0.250980392156863,0.00784313725490196;0.686274509803922,0.243137254901961,0.0117647058823529;0.686274509803922,0.243137254901961,0.0117647058823529;0.674509803921569,0.239215686274510,0.0117647058823529;0.670588235294118,0.235294117647059,0.0117647058823529;0.666666666666667,0.235294117647059,0.0117647058823529;0.654901960784314,0.227450980392157,0.0117647058823529;0.654901960784314,0.227450980392157,0.0117647058823529;0.643137254901961,0.223529411764706,0.0117647058823529;0.635294117647059,0.219607843137255,0.0117647058823529;0.631372549019608,0.215686274509804,0.0117647058823529;0.623529411764706,0.215686274509804,0.0117647058823529;0.619607843137255,0.211764705882353,0.0117647058823529;0.611764705882353,0.207843137254902,0.0117647058823529;0.603921568627451,0.203921568627451,0.0117647058823529;0.600000000000000,0.203921568627451,0.0117647058823529;0.592156862745098,0.200000000000000,0.0156862745098039;0.588235294117647,0.200000000000000,0.0156862745098039;0.580392156862745,0.196078431372549,0.0156862745098039;0.572549019607843,0.196078431372549,0.0156862745098039;0.564705882352941,0.192156862745098,0.0156862745098039;0.560784313725490,0.192156862745098,0.0156862745098039;0.556862745098039,0.188235294117647,0.0156862745098039;0.545098039215686,0.188235294117647,0.0156862745098039;0.541176470588235,0.184313725490196,0.0156862745098039;0.529411764705882,0.180392156862745,0.0156862745098039;0.529411764705882,0.180392156862745,0.0156862745098039;0.517647058823530,0.176470588235294,0.0156862745098039;0.513725490196078,0.176470588235294,0.0156862745098039;0.509803921568627,0.176470588235294,0.0156862745098039;0.498039215686275,0.172549019607843,0.0156862745098039;0.498039215686275,0.172549019607843,0.0156862745098039;0.486274509803922,0.168627450980392,0.0196078431372549;0.478431372549020,0.168627450980392,0.0196078431372549;0.474509803921569,0.164705882352941,0.0196078431372549;0.466666666666667,0.164705882352941,0.0196078431372549;0.462745098039216,0.160784313725490,0.0196078431372549;0.454901960784314,0.160784313725490,0.0196078431372549;0.447058823529412,0.156862745098039,0.0196078431372549;0.443137254901961,0.156862745098039,0.0196078431372549;0.435294117647059,0.152941176470588,0.0196078431372549;0.431372549019608,0.152941176470588,0.0196078431372549;0.423529411764706,0.149019607843137,0.0196078431372549;0.415686274509804,0.149019607843137,0.0196078431372549;0.403921568627451,0.145098039215686,0.0196078431372549;0.403921568627451,0.145098039215686,0.0196078431372549;0.403921568627451,0.145098039215686,0.0196078431372549]; + [1,0.996078431372549,0.792156862745098;1,0.992156862745098,0.788235294117647;1,0.992156862745098,0.780392156862745;1,0.988235294117647,0.776470588235294;1,0.988235294117647,0.772549019607843;1,0.984313725490196,0.764705882352941;1,0.984313725490196,0.760784313725490;1,0.980392156862745,0.752941176470588;1,0.976470588235294,0.749019607843137;1,0.976470588235294,0.745098039215686;1,0.972549019607843,0.737254901960784;1,0.972549019607843,0.733333333333333;1,0.968627450980392,0.725490196078431;1,0.968627450980392,0.721568627450980;1,0.960784313725490,0.709803921568628;1,0.960784313725490,0.709803921568628;1,0.956862745098039,0.701960784313725;1,0.956862745098039,0.694117647058824;1,0.956862745098039,0.694117647058824;1,0.952941176470588,0.686274509803922;1,0.952941176470588,0.682352941176471;1,0.949019607843137,0.674509803921569;1,0.945098039215686,0.666666666666667;1,0.941176470588235,0.662745098039216;1,0.941176470588235,0.658823529411765;1,0.937254901960784,0.650980392156863;1,0.937254901960784,0.647058823529412;1,0.933333333333333,0.639215686274510;1,0.933333333333333,0.635294117647059;1,0.929411764705882,0.631372549019608;0.996078431372549,0.925490196078431,0.623529411764706;0.996078431372549,0.925490196078431,0.619607843137255;0.996078431372549,0.921568627450980,0.615686274509804;0.996078431372549,0.921568627450980,0.607843137254902;0.996078431372549,0.917647058823529,0.603921568627451;0.996078431372549,0.913725490196078,0.600000000000000;0.996078431372549,0.909803921568627,0.588235294117647;0.996078431372549,0.909803921568627,0.588235294117647;0.996078431372549,0.905882352941177,0.576470588235294;0.996078431372549,0.905882352941177,0.576470588235294;0.996078431372549,0.901960784313726,0.568627450980392;0.996078431372549,0.898039215686275,0.564705882352941;0.996078431372549,0.898039215686275,0.564705882352941;0.996078431372549,0.894117647058824,0.552941176470588;0.996078431372549,0.890196078431373,0.549019607843137;0.996078431372549,0.886274509803922,0.541176470588235;0.996078431372549,0.886274509803922,0.537254901960784;0.996078431372549,0.882352941176471,0.533333333333333;0.996078431372549,0.882352941176471,0.525490196078431;0.996078431372549,0.878431372549020,0.521568627450980;0.996078431372549,0.874509803921569,0.517647058823530;0.996078431372549,0.874509803921569,0.509803921568627;0.996078431372549,0.870588235294118,0.505882352941176;0.996078431372549,0.866666666666667,0.501960784313726;0.996078431372549,0.866666666666667,0.494117647058824;0.996078431372549,0.862745098039216,0.490196078431373;0.996078431372549,0.858823529411765,0.486274509803922;0.996078431372549,0.858823529411765,0.478431372549020;0.996078431372549,0.854901960784314,0.474509803921569;0.996078431372549,0.854901960784314,0.470588235294118;0.996078431372549,0.847058823529412,0.458823529411765;0.996078431372549,0.847058823529412,0.458823529411765;0.996078431372549,0.839215686274510,0.450980392156863;0.996078431372549,0.839215686274510,0.447058823529412;0.996078431372549,0.827450980392157,0.439215686274510;0.996078431372549,0.823529411764706,0.435294117647059;0.996078431372549,0.823529411764706,0.435294117647059;0.996078431372549,0.815686274509804,0.423529411764706;0.996078431372549,0.811764705882353,0.419607843137255;0.996078431372549,0.803921568627451,0.411764705882353;0.996078431372549,0.800000000000000,0.407843137254902;0.996078431372549,0.796078431372549,0.403921568627451;0.996078431372549,0.792156862745098,0.396078431372549;0.996078431372549,0.784313725490196,0.392156862745098;0.996078431372549,0.780392156862745,0.388235294117647;0.996078431372549,0.776470588235294,0.380392156862745;0.996078431372549,0.772549019607843,0.376470588235294;0.996078431372549,0.764705882352941,0.372549019607843;0.996078431372549,0.760784313725490,0.364705882352941;0.996078431372549,0.756862745098039,0.360784313725490;0.996078431372549,0.752941176470588,0.356862745098039;0.996078431372549,0.749019607843137,0.352941176470588;0.996078431372549,0.741176470588235,0.345098039215686;0.996078431372549,0.737254901960784,0.341176470588235;0.996078431372549,0.729411764705882,0.333333333333333;0.996078431372549,0.729411764705882,0.329411764705882;0.996078431372549,0.717647058823529,0.321568627450980;0.996078431372549,0.717647058823529,0.317647058823529;0.996078431372549,0.709803921568628,0.309803921568627;0.996078431372549,0.701960784313725,0.305882352941177;0.996078431372549,0.701960784313725,0.305882352941177;0.992156862745098,0.694117647058824,0.294117647058824;0.992156862745098,0.690196078431373,0.294117647058824;0.992156862745098,0.686274509803922,0.290196078431373;0.992156862745098,0.682352941176471,0.290196078431373;0.992156862745098,0.674509803921569,0.286274509803922;0.992156862745098,0.670588235294118,0.286274509803922;0.992156862745098,0.666666666666667,0.282352941176471;0.992156862745098,0.662745098039216,0.282352941176471;0.992156862745098,0.658823529411765,0.278431372549020;0.992156862745098,0.654901960784314,0.278431372549020;0.992156862745098,0.647058823529412,0.274509803921569;0.992156862745098,0.643137254901961,0.274509803921569;0.992156862745098,0.635294117647059,0.270588235294118;0.992156862745098,0.635294117647059,0.270588235294118;0.992156862745098,0.627450980392157,0.266666666666667;0.992156862745098,0.627450980392157,0.266666666666667;0.992156862745098,0.619607843137255,0.262745098039216;0.992156862745098,0.611764705882353,0.258823529411765;0.992156862745098,0.611764705882353,0.258823529411765;0.992156862745098,0.603921568627451,0.254901960784314;0.992156862745098,0.600000000000000,0.254901960784314;0.992156862745098,0.596078431372549,0.250980392156863;0.992156862745098,0.588235294117647,0.250980392156863;0.992156862745098,0.588235294117647,0.250980392156863;0.992156862745098,0.580392156862745,0.247058823529412;0.992156862745098,0.576470588235294,0.243137254901961;0.992156862745098,0.572549019607843,0.243137254901961;0.992156862745098,0.568627450980392,0.239215686274510;0.992156862745098,0.560784313725490,0.239215686274510;0.992156862745098,0.556862745098039,0.235294117647059;0.992156862745098,0.552941176470588,0.235294117647059;0.988235294117647,0.549019607843137,0.231372549019608;0.988235294117647,0.541176470588235,0.231372549019608;0.988235294117647,0.533333333333333,0.227450980392157;0.988235294117647,0.525490196078431,0.227450980392157;0.988235294117647,0.517647058823530,0.223529411764706;0.988235294117647,0.505882352941176,0.219607843137255;0.988235294117647,0.501960784313726,0.219607843137255;0.988235294117647,0.486274509803922,0.215686274509804;0.988235294117647,0.482352941176471,0.215686274509804;0.988235294117647,0.478431372549020,0.211764705882353;0.988235294117647,0.462745098039216,0.207843137254902;0.988235294117647,0.462745098039216,0.207843137254902;0.988235294117647,0.447058823529412,0.203921568627451;0.988235294117647,0.443137254901961,0.200000000000000;0.988235294117647,0.431372549019608,0.200000000000000;0.988235294117647,0.423529411764706,0.196078431372549;0.988235294117647,0.415686274509804,0.196078431372549;0.988235294117647,0.407843137254902,0.192156862745098;0.988235294117647,0.400000000000000,0.188235294117647;0.988235294117647,0.392156862745098,0.188235294117647;0.988235294117647,0.384313725490196,0.184313725490196;0.988235294117647,0.376470588235294,0.184313725490196;0.988235294117647,0.368627450980392,0.180392156862745;0.988235294117647,0.360784313725490,0.180392156862745;0.988235294117647,0.352941176470588,0.176470588235294;0.988235294117647,0.345098039215686,0.176470588235294;0.988235294117647,0.337254901960784,0.172549019607843;0.988235294117647,0.329411764705882,0.168627450980392;0.988235294117647,0.321568627450980,0.168627450980392;0.988235294117647,0.309803921568627,0.164705882352941;0.988235294117647,0.305882352941177,0.164705882352941;0.980392156862745,0.294117647058824,0.160784313725490;0.980392156862745,0.290196078431373,0.160784313725490;0.976470588235294,0.286274509803922,0.156862745098039;0.972549019607843,0.274509803921569,0.152941176470588;0.972549019607843,0.274509803921569,0.152941176470588;0.964705882352941,0.262745098039216,0.152941176470588;0.964705882352941,0.258823529411765,0.149019607843137;0.960784313725490,0.247058823529412,0.149019607843137;0.956862745098039,0.243137254901961,0.145098039215686;0.952941176470588,0.235294117647059,0.145098039215686;0.949019607843137,0.231372549019608,0.141176470588235;0.949019607843137,0.223529411764706,0.141176470588235;0.945098039215686,0.215686274509804,0.141176470588235;0.941176470588235,0.211764705882353,0.137254901960784;0.937254901960784,0.203921568627451,0.137254901960784;0.933333333333333,0.196078431372549,0.133333333333333;0.933333333333333,0.192156862745098,0.133333333333333;0.929411764705882,0.184313725490196,0.129411764705882;0.925490196078431,0.176470588235294,0.129411764705882;0.921568627450980,0.172549019607843,0.125490196078431;0.921568627450980,0.164705882352941,0.125490196078431;0.917647058823529,0.160784313725490,0.125490196078431;0.909803921568627,0.145098039215686,0.121568627450980;0.909803921568627,0.145098039215686,0.121568627450980;0.905882352941177,0.133333333333333,0.117647058823529;0.901960784313726,0.129411764705882,0.113725490196078;0.901960784313726,0.125490196078431,0.113725490196078;0.894117647058824,0.113725490196078,0.109803921568627;0.894117647058824,0.113725490196078,0.109803921568627;0.890196078431373,0.101960784313725,0.109803921568627;0.886274509803922,0.0980392156862745,0.109803921568627;0.878431372549020,0.0941176470588235,0.109803921568627;0.874509803921569,0.0901960784313726,0.109803921568627;0.870588235294118,0.0862745098039216,0.113725490196078;0.866666666666667,0.0862745098039216,0.113725490196078;0.862745098039216,0.0823529411764706,0.113725490196078;0.854901960784314,0.0784313725490196,0.117647058823529;0.850980392156863,0.0745098039215686,0.117647058823529;0.847058823529412,0.0705882352941177,0.117647058823529;0.843137254901961,0.0705882352941177,0.121568627450980;0.839215686274510,0.0666666666666667,0.121568627450980;0.827450980392157,0.0588235294117647,0.125490196078431;0.827450980392157,0.0588235294117647,0.125490196078431;0.823529411764706,0.0549019607843137,0.125490196078431;0.819607843137255,0.0509803921568627,0.125490196078431;0.815686274509804,0.0509803921568627,0.125490196078431;0.803921568627451,0.0431372549019608,0.129411764705882;0.803921568627451,0.0431372549019608,0.129411764705882;0.796078431372549,0.0352941176470588,0.133333333333333;0.792156862745098,0.0352941176470588,0.133333333333333;0.792156862745098,0.0352941176470588,0.133333333333333;0.780392156862745,0.0274509803921569,0.137254901960784;0.780392156862745,0.0274509803921569,0.137254901960784;0.772549019607843,0.0196078431372549,0.137254901960784;0.768627450980392,0.0156862745098039,0.141176470588235;0.764705882352941,0.0156862745098039,0.141176470588235;0.756862745098039,0.0117647058823529,0.141176470588235;0.752941176470588,0.00784313725490196,0.145098039215686;0.749019607843137,0.00392156862745098,0.145098039215686;0.745098039215686,0,0.145098039215686;0.741176470588235,0,0.145098039215686;0.733333333333333,0,0.149019607843137;0.725490196078431,0,0.149019607843137;0.717647058823529,0,0.149019607843137;0.709803921568628,0,0.149019607843137;0.698039215686275,0,0.149019607843137;0.694117647058824,0,0.149019607843137;0.686274509803922,0,0.149019607843137;0.678431372549020,0,0.149019607843137;0.674509803921569,0,0.149019607843137;0.658823529411765,0,0.149019607843137;0.658823529411765,0,0.149019607843137;0.643137254901961,0,0.149019607843137;0.639215686274510,0,0.149019607843137;0.635294117647059,0,0.149019607843137;0.619607843137255,0,0.149019607843137;0.615686274509804,0,0.149019607843137;0.603921568627451,0,0.149019607843137;0.596078431372549,0,0.149019607843137;0.588235294117647,0,0.149019607843137;0.584313725490196,0,0.149019607843137;0.576470588235294,0,0.149019607843137;0.568627450980392,0,0.149019607843137;0.560784313725490,0,0.149019607843137;0.552941176470588,0,0.149019607843137;0.545098039215686,0,0.149019607843137;0.537254901960784,0,0.149019607843137;0.529411764705882,0,0.149019607843137;0.521568627450980,0,0.149019607843137;0.505882352941176,0,0.149019607843137;0.505882352941176,0,0.149019607843137;0.505882352941176,0,0.149019607843137]; + [1,0.968627450980392,0.925490196078431;0.996078431372549,0.964705882352941,0.917647058823529;0.996078431372549,0.964705882352941,0.913725490196078;0.996078431372549,0.960784313725490,0.909803921568627;0.996078431372549,0.956862745098039,0.901960784313726;0.996078431372549,0.956862745098039,0.901960784313726;0.996078431372549,0.952941176470588,0.894117647058824;0.996078431372549,0.952941176470588,0.890196078431373;0.996078431372549,0.949019607843137,0.882352941176471;0.996078431372549,0.949019607843137,0.878431372549020;0.996078431372549,0.949019607843137,0.878431372549020;0.996078431372549,0.945098039215686,0.870588235294118;0.996078431372549,0.941176470588235,0.866666666666667;0.996078431372549,0.941176470588235,0.862745098039216;0.996078431372549,0.937254901960784,0.858823529411765;0.996078431372549,0.937254901960784,0.850980392156863;0.996078431372549,0.937254901960784,0.847058823529412;0.996078431372549,0.933333333333333,0.843137254901961;0.996078431372549,0.933333333333333,0.839215686274510;0.996078431372549,0.929411764705882,0.835294117647059;0.996078431372549,0.929411764705882,0.831372549019608;0.996078431372549,0.925490196078431,0.827450980392157;0.996078431372549,0.925490196078431,0.823529411764706;0.996078431372549,0.921568627450980,0.811764705882353;0.996078431372549,0.921568627450980,0.811764705882353;0.996078431372549,0.917647058823529,0.807843137254902;0.996078431372549,0.917647058823529,0.803921568627451;0.996078431372549,0.913725490196078,0.800000000000000;0.996078431372549,0.909803921568627,0.792156862745098;0.996078431372549,0.909803921568627,0.792156862745098;0.992156862745098,0.905882352941177,0.780392156862745;0.992156862745098,0.905882352941177,0.776470588235294;0.992156862745098,0.901960784313726,0.772549019607843;0.992156862745098,0.901960784313726,0.764705882352941;0.992156862745098,0.901960784313726,0.764705882352941;0.992156862745098,0.894117647058824,0.756862745098039;0.992156862745098,0.894117647058824,0.749019607843137;0.992156862745098,0.890196078431373,0.745098039215686;0.992156862745098,0.886274509803922,0.741176470588235;0.992156862745098,0.886274509803922,0.733333333333333;0.992156862745098,0.882352941176471,0.729411764705882;0.992156862745098,0.882352941176471,0.725490196078431;0.992156862745098,0.878431372549020,0.721568627450980;0.992156862745098,0.874509803921569,0.713725490196078;0.992156862745098,0.874509803921569,0.709803921568628;0.992156862745098,0.870588235294118,0.705882352941177;0.992156862745098,0.866666666666667,0.698039215686275;0.992156862745098,0.862745098039216,0.690196078431373;0.992156862745098,0.862745098039216,0.690196078431373;0.992156862745098,0.862745098039216,0.682352941176471;0.992156862745098,0.858823529411765,0.678431372549020;0.992156862745098,0.854901960784314,0.674509803921569;0.992156862745098,0.850980392156863,0.662745098039216;0.992156862745098,0.850980392156863,0.662745098039216;0.992156862745098,0.847058823529412,0.650980392156863;0.992156862745098,0.843137254901961,0.647058823529412;0.992156862745098,0.839215686274510,0.643137254901961;0.992156862745098,0.839215686274510,0.635294117647059;0.992156862745098,0.839215686274510,0.635294117647059;0.992156862745098,0.835294117647059,0.627450980392157;0.992156862745098,0.831372549019608,0.619607843137255;0.992156862745098,0.827450980392157,0.615686274509804;0.992156862745098,0.827450980392157,0.611764705882353;0.992156862745098,0.823529411764706,0.611764705882353;0.992156862745098,0.819607843137255,0.607843137254902;0.992156862745098,0.815686274509804,0.603921568627451;0.992156862745098,0.811764705882353,0.600000000000000;0.992156862745098,0.811764705882353,0.596078431372549;0.992156862745098,0.807843137254902,0.596078431372549;0.992156862745098,0.803921568627451,0.592156862745098;0.992156862745098,0.800000000000000,0.588235294117647;0.992156862745098,0.796078431372549,0.580392156862745;0.992156862745098,0.796078431372549,0.580392156862745;0.992156862745098,0.788235294117647,0.576470588235294;0.992156862745098,0.784313725490196,0.572549019607843;0.992156862745098,0.784313725490196,0.572549019607843;0.992156862745098,0.780392156862745,0.564705882352941;0.992156862745098,0.780392156862745,0.564705882352941;0.992156862745098,0.772549019607843,0.560784313725490;0.992156862745098,0.768627450980392,0.556862745098039;0.992156862745098,0.768627450980392,0.552941176470588;0.992156862745098,0.764705882352941,0.549019607843137;0.992156862745098,0.760784313725490,0.545098039215686;0.992156862745098,0.756862745098039,0.545098039215686;0.992156862745098,0.752941176470588,0.541176470588235;0.992156862745098,0.752941176470588,0.537254901960784;0.992156862745098,0.749019607843137,0.533333333333333;0.992156862745098,0.745098039215686,0.529411764705882;0.992156862745098,0.741176470588235,0.525490196078431;0.992156862745098,0.741176470588235,0.525490196078431;0.992156862745098,0.737254901960784,0.521568627450980;0.992156862745098,0.733333333333333,0.517647058823530;0.988235294117647,0.729411764705882,0.513725490196078;0.988235294117647,0.721568627450980,0.505882352941176;0.988235294117647,0.717647058823529,0.501960784313726;0.988235294117647,0.705882352941177,0.494117647058824;0.988235294117647,0.705882352941177,0.494117647058824;0.988235294117647,0.694117647058824,0.482352941176471;0.988235294117647,0.690196078431373,0.478431372549020;0.988235294117647,0.690196078431373,0.478431372549020;0.988235294117647,0.678431372549020,0.466666666666667;0.988235294117647,0.678431372549020,0.466666666666667;0.988235294117647,0.666666666666667,0.454901960784314;0.988235294117647,0.662745098039216,0.450980392156863;0.988235294117647,0.654901960784314,0.443137254901961;0.988235294117647,0.650980392156863,0.439215686274510;0.988235294117647,0.643137254901961,0.435294117647059;0.988235294117647,0.639215686274510,0.427450980392157;0.988235294117647,0.631372549019608,0.423529411764706;0.988235294117647,0.627450980392157,0.419607843137255;0.988235294117647,0.623529411764706,0.411764705882353;0.988235294117647,0.615686274509804,0.407843137254902;0.988235294117647,0.611764705882353,0.403921568627451;0.988235294117647,0.603921568627451,0.396078431372549;0.988235294117647,0.600000000000000,0.392156862745098;0.988235294117647,0.592156862745098,0.388235294117647;0.988235294117647,0.588235294117647,0.380392156862745;0.988235294117647,0.580392156862745,0.376470588235294;0.988235294117647,0.576470588235294,0.372549019607843;0.988235294117647,0.564705882352941,0.360784313725490;0.988235294117647,0.564705882352941,0.360784313725490;0.988235294117647,0.552941176470588,0.349019607843137;0.984313725490196,0.549019607843137,0.345098039215686;0.984313725490196,0.549019607843137,0.345098039215686;0.980392156862745,0.537254901960784,0.341176470588235;0.980392156862745,0.537254901960784,0.341176470588235;0.980392156862745,0.529411764705882,0.337254901960784;0.976470588235294,0.525490196078431,0.337254901960784;0.976470588235294,0.517647058823530,0.333333333333333;0.972549019607843,0.513725490196078,0.333333333333333;0.972549019607843,0.509803921568627,0.329411764705882;0.972549019607843,0.505882352941176,0.325490196078431;0.968627450980392,0.498039215686275,0.325490196078431;0.968627450980392,0.494117647058824,0.321568627450980;0.964705882352941,0.490196078431373,0.321568627450980;0.964705882352941,0.486274509803922,0.317647058823529;0.964705882352941,0.478431372549020,0.317647058823529;0.960784313725490,0.474509803921569,0.313725490196078;0.956862745098039,0.466666666666667,0.309803921568627;0.956862745098039,0.466666666666667,0.309803921568627;0.956862745098039,0.458823529411765,0.309803921568627;0.952941176470588,0.450980392156863,0.305882352941177;0.952941176470588,0.450980392156863,0.305882352941177;0.949019607843137,0.439215686274510,0.301960784313725;0.949019607843137,0.439215686274510,0.301960784313725;0.949019607843137,0.431372549019608,0.294117647058824;0.945098039215686,0.427450980392157,0.294117647058824;0.945098039215686,0.427450980392157,0.294117647058824;0.941176470588235,0.415686274509804,0.290196078431373;0.941176470588235,0.411764705882353,0.286274509803922;0.937254901960784,0.403921568627451,0.286274509803922;0.937254901960784,0.400000000000000,0.282352941176471;0.937254901960784,0.396078431372549,0.282352941176471;0.933333333333333,0.388235294117647,0.278431372549020;0.929411764705882,0.384313725490196,0.270588235294118;0.929411764705882,0.376470588235294,0.266666666666667;0.925490196078431,0.368627450980392,0.262745098039216;0.921568627450980,0.364705882352941,0.258823529411765;0.917647058823529,0.356862745098039,0.250980392156863;0.917647058823529,0.349019607843137,0.247058823529412;0.913725490196078,0.341176470588235,0.239215686274510;0.909803921568627,0.337254901960784,0.235294117647059;0.905882352941177,0.325490196078431,0.227450980392157;0.905882352941177,0.325490196078431,0.227450980392157;0.901960784313726,0.317647058823529,0.223529411764706;0.894117647058824,0.309803921568627,0.211764705882353;0.894117647058824,0.305882352941177,0.211764705882353;0.890196078431373,0.294117647058824,0.200000000000000;0.890196078431373,0.290196078431373,0.200000000000000;0.882352941176471,0.278431372549020,0.192156862745098;0.878431372549020,0.274509803921569,0.188235294117647;0.878431372549020,0.274509803921569,0.188235294117647;0.874509803921569,0.258823529411765,0.176470588235294;0.870588235294118,0.254901960784314,0.172549019607843;0.866666666666667,0.247058823529412,0.164705882352941;0.866666666666667,0.239215686274510,0.160784313725490;0.862745098039216,0.235294117647059,0.156862745098039;0.858823529411765,0.227450980392157,0.152941176470588;0.854901960784314,0.219607843137255,0.145098039215686;0.854901960784314,0.215686274509804,0.141176470588235;0.850980392156863,0.207843137254902,0.137254901960784;0.847058823529412,0.200000000000000,0.129411764705882;0.843137254901961,0.196078431372549,0.125490196078431;0.843137254901961,0.188235294117647,0.121568627450980;0.839215686274510,0.180392156862745,0.117647058823529;0.835294117647059,0.176470588235294,0.113725490196078;0.823529411764706,0.164705882352941,0.105882352941176;0.823529411764706,0.164705882352941,0.105882352941176;0.819607843137255,0.156862745098039,0.101960784313725;0.811764705882353,0.149019607843137,0.0941176470588235;0.811764705882353,0.145098039215686,0.0941176470588235;0.803921568627451,0.133333333333333,0.0862745098039216;0.800000000000000,0.133333333333333,0.0862745098039216;0.792156862745098,0.121568627450980,0.0784313725490196;0.788235294117647,0.117647058823529,0.0745098039215686;0.784313725490196,0.109803921568627,0.0705882352941177;0.780392156862745,0.105882352941176,0.0666666666666667;0.776470588235294,0.101960784313725,0.0627450980392157;0.772549019607843,0.0941176470588235,0.0588235294117647;0.768627450980392,0.0862745098039216,0.0549019607843137;0.760784313725490,0.0823529411764706,0.0509803921568627;0.756862745098039,0.0745098039215686,0.0470588235294118;0.752941176470588,0.0705882352941177,0.0431372549019608;0.749019607843137,0.0627450980392157,0.0392156862745098;0.745098039215686,0.0588235294117647,0.0352941176470588;0.741176470588235,0.0509803921568627,0.0313725490196078;0.737254901960784,0.0470588235294118,0.0274509803921569;0.733333333333333,0.0392156862745098,0.0235294117647059;0.725490196078431,0.0313725490196078,0.0196078431372549;0.721568627450980,0.0274509803921569,0.0156862745098039;0.713725490196078,0.0156862745098039,0.0117647058823529;0.713725490196078,0.0156862745098039,0.0117647058823529;0.709803921568628,0.0117647058823529,0.00784313725490196;0.701960784313725,0,0;0.701960784313725,0,0;0.686274509803922,0,0;0.682352941176471,0,0;0.674509803921569,0,0;0.670588235294118,0,0;0.662745098039216,0,0;0.654901960784314,0,0;0.650980392156863,0,0;0.643137254901961,0,0;0.635294117647059,0,0;0.631372549019608,0,0;0.623529411764706,0,0;0.615686274509804,0,0;0.611764705882353,0,0;0.603921568627451,0,0;0.600000000000000,0,0;0.592156862745098,0,0;0.584313725490196,0,0;0.576470588235294,0,0;0.572549019607843,0,0;0.560784313725490,0,0;0.556862745098039,0,0;0.552941176470588,0,0;0.541176470588235,0,0;0.541176470588235,0,0;0.529411764705882,0,0;0.525490196078431,0,0;0.513725490196078,0,0;0.509803921568627,0,0;0.501960784313726,0,0;0.501960784313726,0,0]; + [0.964705882352941,0.952941176470588,0.972549019607843;0.960784313725490,0.949019607843137,0.972549019607843;0.960784313725490,0.949019607843137,0.972549019607843;0.956862745098039,0.945098039215686,0.968627450980392;0.956862745098039,0.945098039215686,0.968627450980392;0.952941176470588,0.941176470588235,0.968627450980392;0.952941176470588,0.937254901960784,0.964705882352941;0.949019607843137,0.937254901960784,0.964705882352941;0.949019607843137,0.933333333333333,0.964705882352941;0.945098039215686,0.933333333333333,0.960784313725490;0.945098039215686,0.929411764705882,0.960784313725490;0.941176470588235,0.925490196078431,0.960784313725490;0.941176470588235,0.925490196078431,0.956862745098039;0.937254901960784,0.921568627450980,0.956862745098039;0.933333333333333,0.917647058823529,0.952941176470588;0.933333333333333,0.917647058823529,0.952941176470588;0.929411764705882,0.913725490196078,0.952941176470588;0.929411764705882,0.909803921568627,0.952941176470588;0.929411764705882,0.909803921568627,0.952941176470588;0.925490196078431,0.905882352941177,0.949019607843137;0.925490196078431,0.905882352941177,0.949019607843137;0.921568627450980,0.901960784313726,0.945098039215686;0.917647058823529,0.898039215686275,0.945098039215686;0.917647058823529,0.898039215686275,0.945098039215686;0.913725490196078,0.894117647058824,0.941176470588235;0.913725490196078,0.890196078431373,0.941176470588235;0.909803921568627,0.890196078431373,0.941176470588235;0.909803921568627,0.886274509803922,0.937254901960784;0.905882352941177,0.886274509803922,0.937254901960784;0.905882352941177,0.882352941176471,0.937254901960784;0.901960784313726,0.878431372549020,0.933333333333333;0.901960784313726,0.874509803921569,0.933333333333333;0.898039215686275,0.870588235294118,0.929411764705882;0.898039215686275,0.866666666666667,0.925490196078431;0.894117647058824,0.858823529411765,0.925490196078431;0.890196078431373,0.854901960784314,0.921568627450980;0.886274509803922,0.847058823529412,0.917647058823529;0.886274509803922,0.847058823529412,0.917647058823529;0.882352941176471,0.835294117647059,0.909803921568627;0.882352941176471,0.835294117647059,0.909803921568627;0.878431372549020,0.827450980392157,0.905882352941177;0.874509803921569,0.819607843137255,0.905882352941177;0.874509803921569,0.819607843137255,0.905882352941177;0.870588235294118,0.811764705882353,0.898039215686275;0.866666666666667,0.807843137254902,0.898039215686275;0.866666666666667,0.800000000000000,0.894117647058824;0.862745098039216,0.796078431372549,0.890196078431373;0.862745098039216,0.792156862745098,0.890196078431373;0.858823529411765,0.788235294117647,0.886274509803922;0.858823529411765,0.780392156862745,0.882352941176471;0.854901960784314,0.776470588235294,0.882352941176471;0.850980392156863,0.772549019607843,0.878431372549020;0.850980392156863,0.764705882352941,0.874509803921569;0.847058823529412,0.760784313725490,0.874509803921569;0.847058823529412,0.756862745098039,0.870588235294118;0.843137254901961,0.749019607843137,0.866666666666667;0.839215686274510,0.745098039215686,0.866666666666667;0.839215686274510,0.741176470588235,0.862745098039216;0.835294117647059,0.737254901960784,0.858823529411765;0.835294117647059,0.733333333333333,0.858823529411765;0.827450980392157,0.721568627450980,0.850980392156863;0.827450980392157,0.721568627450980,0.850980392156863;0.827450980392157,0.713725490196078,0.847058823529412;0.827450980392157,0.713725490196078,0.847058823529412;0.823529411764706,0.705882352941177,0.843137254901961;0.823529411764706,0.698039215686275,0.839215686274510;0.823529411764706,0.698039215686275,0.839215686274510;0.819607843137255,0.690196078431373,0.835294117647059;0.819607843137255,0.686274509803922,0.835294117647059;0.815686274509804,0.682352941176471,0.831372549019608;0.815686274509804,0.678431372549020,0.827450980392157;0.815686274509804,0.670588235294118,0.827450980392157;0.811764705882353,0.666666666666667,0.823529411764706;0.811764705882353,0.662745098039216,0.823529411764706;0.811764705882353,0.658823529411765,0.819607843137255;0.807843137254902,0.654901960784314,0.815686274509804;0.807843137254902,0.650980392156863,0.815686274509804;0.807843137254902,0.643137254901961,0.811764705882353;0.803921568627451,0.639215686274510,0.811764705882353;0.803921568627451,0.635294117647059,0.807843137254902;0.803921568627451,0.631372549019608,0.803921568627451;0.800000000000000,0.627450980392157,0.803921568627451;0.800000000000000,0.623529411764706,0.800000000000000;0.796078431372549,0.619607843137255,0.800000000000000;0.796078431372549,0.607843137254902,0.792156862745098;0.796078431372549,0.607843137254902,0.792156862745098;0.792156862745098,0.600000000000000,0.788235294117647;0.792156862745098,0.600000000000000,0.788235294117647;0.788235294117647,0.592156862745098,0.784313725490196;0.788235294117647,0.584313725490196,0.780392156862745;0.788235294117647,0.584313725490196,0.780392156862745;0.788235294117647,0.576470588235294,0.776470588235294;0.788235294117647,0.568627450980392,0.776470588235294;0.792156862745098,0.564705882352941,0.772549019607843;0.796078431372549,0.560784313725490,0.768627450980392;0.800000000000000,0.552941176470588,0.764705882352941;0.800000000000000,0.549019607843137,0.764705882352941;0.803921568627451,0.541176470588235,0.760784313725490;0.807843137254902,0.537254901960784,0.756862745098039;0.807843137254902,0.529411764705882,0.752941176470588;0.811764705882353,0.525490196078431,0.752941176470588;0.815686274509804,0.517647058823530,0.749019607843137;0.815686274509804,0.513725490196078,0.745098039215686;0.823529411764706,0.501960784313726,0.741176470588235;0.823529411764706,0.501960784313726,0.741176470588235;0.827450980392157,0.490196078431373,0.733333333333333;0.827450980392157,0.490196078431373,0.733333333333333;0.831372549019608,0.482352941176471,0.733333333333333;0.835294117647059,0.470588235294118,0.725490196078431;0.835294117647059,0.470588235294118,0.725490196078431;0.843137254901961,0.458823529411765,0.721568627450980;0.843137254901961,0.454901960784314,0.717647058823529;0.847058823529412,0.450980392156863,0.713725490196078;0.850980392156863,0.443137254901961,0.713725490196078;0.850980392156863,0.443137254901961,0.713725490196078;0.854901960784314,0.431372549019608,0.705882352941177;0.858823529411765,0.427450980392157,0.701960784313725;0.858823529411765,0.419607843137255,0.701960784313725;0.862745098039216,0.415686274509804,0.698039215686275;0.866666666666667,0.407843137254902,0.694117647058824;0.866666666666667,0.403921568627451,0.694117647058824;0.870588235294118,0.396078431372549,0.690196078431373;0.874509803921569,0.392156862745098,0.686274509803922;0.874509803921569,0.384313725490196,0.682352941176471;0.874509803921569,0.376470588235294,0.678431372549020;0.874509803921569,0.368627450980392,0.670588235294118;0.878431372549020,0.360784313725490,0.666666666666667;0.878431372549020,0.349019607843137,0.658823529411765;0.878431372549020,0.345098039215686,0.658823529411765;0.882352941176471,0.333333333333333,0.647058823529412;0.882352941176471,0.329411764705882,0.647058823529412;0.882352941176471,0.325490196078431,0.643137254901961;0.882352941176471,0.309803921568627,0.635294117647059;0.882352941176471,0.309803921568627,0.635294117647059;0.886274509803922,0.294117647058824,0.623529411764706;0.886274509803922,0.290196078431373,0.619607843137255;0.886274509803922,0.278431372549020,0.615686274509804;0.890196078431373,0.270588235294118,0.611764705882353;0.890196078431373,0.266666666666667,0.607843137254902;0.890196078431373,0.258823529411765,0.600000000000000;0.890196078431373,0.250980392156863,0.596078431372549;0.894117647058824,0.243137254901961,0.592156862745098;0.894117647058824,0.235294117647059,0.588235294117647;0.894117647058824,0.227450980392157,0.584313725490196;0.894117647058824,0.219607843137255,0.576470588235294;0.898039215686275,0.211764705882353,0.572549019607843;0.898039215686275,0.203921568627451,0.568627450980392;0.898039215686275,0.200000000000000,0.564705882352941;0.898039215686275,0.192156862745098,0.560784313725490;0.901960784313726,0.184313725490196,0.556862745098039;0.901960784313726,0.176470588235294,0.549019607843137;0.901960784313726,0.164705882352941,0.541176470588235;0.901960784313726,0.160784313725490,0.541176470588235;0.898039215686275,0.152941176470588,0.529411764705882;0.898039215686275,0.152941176470588,0.525490196078431;0.894117647058824,0.152941176470588,0.521568627450980;0.890196078431373,0.145098039215686,0.509803921568627;0.890196078431373,0.145098039215686,0.509803921568627;0.882352941176471,0.141176470588235,0.498039215686275;0.882352941176471,0.137254901960784,0.494117647058824;0.878431372549020,0.133333333333333,0.482352941176471;0.874509803921569,0.133333333333333,0.478431372549020;0.870588235294118,0.129411764705882,0.470588235294118;0.866666666666667,0.125490196078431,0.466666666666667;0.866666666666667,0.121568627450980,0.458823529411765;0.862745098039216,0.121568627450980,0.450980392156863;0.858823529411765,0.117647058823529,0.447058823529412;0.854901960784314,0.113725490196078,0.439215686274510;0.850980392156863,0.113725490196078,0.431372549019608;0.850980392156863,0.109803921568627,0.427450980392157;0.847058823529412,0.105882352941176,0.419607843137255;0.843137254901961,0.101960784313725,0.411764705882353;0.839215686274510,0.101960784313725,0.407843137254902;0.839215686274510,0.0980392156862745,0.400000000000000;0.835294117647059,0.0941176470588235,0.396078431372549;0.827450980392157,0.0901960784313726,0.380392156862745;0.827450980392157,0.0901960784313726,0.380392156862745;0.823529411764706,0.0823529411764706,0.368627450980392;0.819607843137255,0.0823529411764706,0.364705882352941;0.819607843137255,0.0823529411764706,0.360784313725490;0.811764705882353,0.0745098039215686,0.349019607843137;0.811764705882353,0.0745098039215686,0.349019607843137;0.807843137254902,0.0705882352941177,0.337254901960784;0.800000000000000,0.0666666666666667,0.333333333333333;0.796078431372549,0.0666666666666667,0.329411764705882;0.788235294117647,0.0627450980392157,0.329411764705882;0.780392156862745,0.0588235294117647,0.325490196078431;0.772549019607843,0.0588235294117647,0.325490196078431;0.768627450980392,0.0549019607843137,0.321568627450980;0.760784313725490,0.0549019607843137,0.317647058823529;0.752941176470588,0.0509803921568627,0.317647058823529;0.749019607843137,0.0509803921568627,0.313725490196078;0.741176470588235,0.0470588235294118,0.313725490196078;0.733333333333333,0.0431372549019608,0.309803921568627;0.725490196078431,0.0392156862745098,0.305882352941177;0.721568627450980,0.0392156862745098,0.305882352941177;0.713725490196078,0.0392156862745098,0.301960784313725;0.705882352941177,0.0352941176470588,0.301960784313725;0.701960784313725,0.0352941176470588,0.298039215686275;0.686274509803922,0.0274509803921569,0.294117647058824;0.686274509803922,0.0274509803921569,0.294117647058824;0.674509803921569,0.0235294117647059,0.290196078431373;0.670588235294118,0.0235294117647059,0.286274509803922;0.666666666666667,0.0235294117647059,0.286274509803922;0.654901960784314,0.0196078431372549,0.282352941176471;0.650980392156863,0.0196078431372549,0.282352941176471;0.643137254901961,0.0156862745098039,0.278431372549020;0.635294117647059,0.0117647058823529,0.274509803921569;0.627450980392157,0.00784313725490196,0.274509803921569;0.619607843137255,0.00784313725490196,0.270588235294118;0.615686274509804,0.00392156862745098,0.266666666666667;0.607843137254902,0.00392156862745098,0.266666666666667;0.600000000000000,0,0.262745098039216;0.596078431372549,0,0.262745098039216;0.588235294117647,0,0.258823529411765;0.584313725490196,0,0.250980392156863;0.576470588235294,0,0.247058823529412;0.572549019607843,0,0.243137254901961;0.560784313725490,0,0.235294117647059;0.556862745098039,0,0.235294117647059;0.552941176470588,0,0.231372549019608;0.545098039215686,0,0.223529411764706;0.541176470588235,0,0.219607843137255;0.529411764705882,0,0.211764705882353;0.529411764705882,0,0.211764705882353;0.517647058823530,0,0.203921568627451;0.513725490196078,0,0.200000000000000;0.509803921568627,0,0.200000000000000;0.498039215686275,0,0.192156862745098;0.498039215686275,0,0.188235294117647;0.486274509803922,0,0.180392156862745;0.478431372549020,0,0.176470588235294;0.474509803921569,0,0.172549019607843;0.466666666666667,0,0.168627450980392;0.462745098039216,0,0.164705882352941;0.454901960784314,0,0.160784313725490;0.450980392156863,0,0.156862745098039;0.443137254901961,0,0.149019607843137;0.439215686274510,0,0.145098039215686;0.431372549019608,0,0.141176470588235;0.427450980392157,0,0.137254901960784;0.419607843137255,0,0.133333333333333;0.407843137254902,0,0.125490196078431;0.407843137254902,0,0.125490196078431;0.403921568627451,0,0.121568627450980]; + [0.996078431372549,0.964705882352941,0.949019607843137;0.996078431372549,0.960784313725490,0.945098039215686;0.996078431372549,0.956862745098039,0.941176470588235;0.996078431372549,0.956862745098039,0.941176470588235;0.996078431372549,0.952941176470588,0.937254901960784;0.996078431372549,0.949019607843137,0.933333333333333;0.996078431372549,0.945098039215686,0.933333333333333;0.996078431372549,0.945098039215686,0.929411764705882;0.996078431372549,0.941176470588235,0.925490196078431;0.996078431372549,0.937254901960784,0.925490196078431;0.996078431372549,0.937254901960784,0.921568627450980;0.996078431372549,0.933333333333333,0.917647058823529;0.996078431372549,0.929411764705882,0.917647058823529;0.996078431372549,0.925490196078431,0.913725490196078;0.992156862745098,0.921568627450980,0.905882352941177;0.992156862745098,0.921568627450980,0.905882352941177;0.992156862745098,0.917647058823529,0.901960784313726;0.992156862745098,0.913725490196078,0.898039215686275;0.992156862745098,0.913725490196078,0.898039215686275;0.992156862745098,0.905882352941177,0.894117647058824;0.992156862745098,0.905882352941177,0.894117647058824;0.992156862745098,0.901960784313726,0.890196078431373;0.992156862745098,0.898039215686275,0.886274509803922;0.992156862745098,0.894117647058824,0.882352941176471;0.992156862745098,0.894117647058824,0.882352941176471;0.992156862745098,0.890196078431373,0.878431372549020;0.992156862745098,0.886274509803922,0.874509803921569;0.992156862745098,0.886274509803922,0.870588235294118;0.992156862745098,0.882352941176471,0.870588235294118;0.992156862745098,0.878431372549020,0.866666666666667;0.988235294117647,0.874509803921569,0.862745098039216;0.988235294117647,0.874509803921569,0.858823529411765;0.988235294117647,0.870588235294118,0.858823529411765;0.988235294117647,0.866666666666667,0.854901960784314;0.988235294117647,0.862745098039216,0.850980392156863;0.988235294117647,0.858823529411765,0.847058823529412;0.988235294117647,0.850980392156863,0.839215686274510;0.988235294117647,0.850980392156863,0.839215686274510;0.988235294117647,0.847058823529412,0.831372549019608;0.988235294117647,0.847058823529412,0.831372549019608;0.988235294117647,0.839215686274510,0.823529411764706;0.988235294117647,0.835294117647059,0.819607843137255;0.988235294117647,0.835294117647059,0.819607843137255;0.988235294117647,0.831372549019608,0.815686274509804;0.988235294117647,0.827450980392157,0.811764705882353;0.988235294117647,0.823529411764706,0.807843137254902;0.988235294117647,0.819607843137255,0.803921568627451;0.988235294117647,0.815686274509804,0.800000000000000;0.988235294117647,0.811764705882353,0.796078431372549;0.988235294117647,0.807843137254902,0.792156862745098;0.988235294117647,0.807843137254902,0.788235294117647;0.988235294117647,0.803921568627451,0.784313725490196;0.988235294117647,0.800000000000000,0.780392156862745;0.988235294117647,0.796078431372549,0.780392156862745;0.988235294117647,0.792156862745098,0.776470588235294;0.988235294117647,0.788235294117647,0.772549019607843;0.988235294117647,0.788235294117647,0.768627450980392;0.988235294117647,0.784313725490196,0.764705882352941;0.988235294117647,0.780392156862745,0.760784313725490;0.988235294117647,0.776470588235294,0.756862745098039;0.984313725490196,0.768627450980392,0.749019607843137;0.984313725490196,0.768627450980392,0.749019607843137;0.984313725490196,0.760784313725490,0.749019607843137;0.984313725490196,0.760784313725490,0.749019607843137;0.984313725490196,0.749019607843137,0.745098039215686;0.984313725490196,0.745098039215686,0.745098039215686;0.984313725490196,0.745098039215686,0.745098039215686;0.984313725490196,0.737254901960784,0.741176470588235;0.984313725490196,0.733333333333333,0.741176470588235;0.984313725490196,0.725490196078431,0.737254901960784;0.984313725490196,0.721568627450980,0.737254901960784;0.984313725490196,0.717647058823529,0.737254901960784;0.984313725490196,0.713725490196078,0.733333333333333;0.984313725490196,0.709803921568628,0.733333333333333;0.984313725490196,0.705882352941177,0.733333333333333;0.984313725490196,0.698039215686275,0.729411764705882;0.980392156862745,0.694117647058824,0.729411764705882;0.980392156862745,0.690196078431373,0.729411764705882;0.980392156862745,0.686274509803922,0.725490196078431;0.980392156862745,0.678431372549020,0.725490196078431;0.980392156862745,0.674509803921569,0.725490196078431;0.980392156862745,0.670588235294118,0.721568627450980;0.980392156862745,0.666666666666667,0.721568627450980;0.980392156862745,0.662745098039216,0.717647058823529;0.980392156862745,0.654901960784314,0.717647058823529;0.980392156862745,0.650980392156863,0.717647058823529;0.980392156862745,0.643137254901961,0.713725490196078;0.980392156862745,0.643137254901961,0.713725490196078;0.980392156862745,0.635294117647059,0.709803921568628;0.980392156862745,0.627450980392157,0.709803921568628;0.980392156862745,0.627450980392157,0.709803921568628;0.976470588235294,0.619607843137255,0.705882352941177;0.976470588235294,0.611764705882353,0.705882352941177;0.976470588235294,0.603921568627451,0.701960784313725;0.976470588235294,0.600000000000000,0.698039215686275;0.976470588235294,0.592156862745098,0.698039215686275;0.976470588235294,0.584313725490196,0.694117647058824;0.976470588235294,0.580392156862745,0.694117647058824;0.976470588235294,0.572549019607843,0.690196078431373;0.976470588235294,0.564705882352941,0.686274509803922;0.976470588235294,0.556862745098039,0.686274509803922;0.976470588235294,0.552941176470588,0.682352941176471;0.972549019607843,0.545098039215686,0.678431372549020;0.972549019607843,0.533333333333333,0.674509803921569;0.972549019607843,0.529411764705882,0.674509803921569;0.972549019607843,0.517647058823530,0.670588235294118;0.972549019607843,0.517647058823530,0.670588235294118;0.972549019607843,0.509803921568627,0.666666666666667;0.972549019607843,0.498039215686275,0.662745098039216;0.972549019607843,0.498039215686275,0.662745098039216;0.972549019607843,0.482352941176471,0.658823529411765;0.968627450980392,0.478431372549020,0.654901960784314;0.968627450980392,0.470588235294118,0.650980392156863;0.968627450980392,0.462745098039216,0.650980392156863;0.968627450980392,0.462745098039216,0.650980392156863;0.968627450980392,0.450980392156863,0.647058823529412;0.968627450980392,0.443137254901961,0.643137254901961;0.968627450980392,0.435294117647059,0.639215686274510;0.968627450980392,0.431372549019608,0.639215686274510;0.968627450980392,0.423529411764706,0.635294117647059;0.968627450980392,0.415686274509804,0.631372549019608;0.968627450980392,0.407843137254902,0.631372549019608;0.964705882352941,0.403921568627451,0.627450980392157;0.960784313725490,0.396078431372549,0.627450980392157;0.956862745098039,0.388235294117647,0.627450980392157;0.956862745098039,0.384313725490196,0.623529411764706;0.952941176470588,0.376470588235294,0.623529411764706;0.945098039215686,0.368627450980392,0.619607843137255;0.945098039215686,0.364705882352941,0.619607843137255;0.941176470588235,0.352941176470588,0.619607843137255;0.941176470588235,0.349019607843137,0.619607843137255;0.937254901960784,0.345098039215686,0.619607843137255;0.929411764705882,0.333333333333333,0.615686274509804;0.929411764705882,0.333333333333333,0.615686274509804;0.921568627450980,0.317647058823529,0.611764705882353;0.921568627450980,0.313725490196078,0.611764705882353;0.917647058823529,0.305882352941177,0.611764705882353;0.913725490196078,0.301960784313725,0.607843137254902;0.909803921568627,0.294117647058824,0.607843137254902;0.905882352941177,0.286274509803922,0.607843137254902;0.905882352941177,0.282352941176471,0.603921568627451;0.901960784313726,0.274509803921569,0.603921568627451;0.898039215686275,0.266666666666667,0.603921568627451;0.894117647058824,0.262745098039216,0.600000000000000;0.890196078431373,0.254901960784314,0.600000000000000;0.890196078431373,0.250980392156863,0.600000000000000;0.886274509803922,0.243137254901961,0.600000000000000;0.882352941176471,0.235294117647059,0.596078431372549;0.878431372549020,0.231372549019608,0.596078431372549;0.874509803921569,0.223529411764706,0.596078431372549;0.870588235294118,0.215686274509804,0.592156862745098;0.866666666666667,0.207843137254902,0.592156862745098;0.866666666666667,0.203921568627451,0.592156862745098;0.854901960784314,0.192156862745098,0.584313725490196;0.854901960784314,0.188235294117647,0.584313725490196;0.850980392156863,0.184313725490196,0.580392156862745;0.839215686274510,0.172549019607843,0.576470588235294;0.839215686274510,0.172549019607843,0.576470588235294;0.827450980392157,0.160784313725490,0.568627450980392;0.823529411764706,0.156862745098039,0.568627450980392;0.815686274509804,0.149019607843137,0.564705882352941;0.807843137254902,0.141176470588235,0.560784313725490;0.803921568627451,0.137254901960784,0.556862745098039;0.796078431372549,0.129411764705882,0.552941176470588;0.792156862745098,0.121568627450980,0.552941176470588;0.784313725490196,0.117647058823529,0.549019607843137;0.780392156862745,0.109803921568627,0.545098039215686;0.772549019607843,0.105882352941176,0.541176470588235;0.768627450980392,0.0980392156862745,0.537254901960784;0.764705882352941,0.0901960784313726,0.537254901960784;0.756862745098039,0.0862745098039216,0.533333333333333;0.752941176470588,0.0784313725490196,0.529411764705882;0.745098039215686,0.0745098039215686,0.525490196078431;0.741176470588235,0.0666666666666667,0.525490196078431;0.733333333333333,0.0588235294117647,0.521568627450980;0.721568627450980,0.0470588235294118,0.513725490196078;0.721568627450980,0.0470588235294118,0.513725490196078;0.709803921568628,0.0352941176470588,0.509803921568627;0.705882352941177,0.0313725490196078,0.505882352941176;0.705882352941177,0.0274509803921569,0.505882352941176;0.694117647058824,0.0156862745098039,0.498039215686275;0.694117647058824,0.0156862745098039,0.498039215686275;0.682352941176471,0.00392156862745098,0.494117647058824;0.674509803921569,0.00392156862745098,0.490196078431373;0.670588235294118,0.00392156862745098,0.490196078431373;0.662745098039216,0.00392156862745098,0.490196078431373;0.654901960784314,0.00392156862745098,0.490196078431373;0.650980392156863,0.00392156862745098,0.486274509803922;0.643137254901961,0.00392156862745098,0.486274509803922;0.635294117647059,0.00392156862745098,0.486274509803922;0.631372549019608,0.00392156862745098,0.486274509803922;0.623529411764706,0.00392156862745098,0.486274509803922;0.619607843137255,0.00392156862745098,0.482352941176471;0.611764705882353,0.00392156862745098,0.482352941176471;0.600000000000000,0.00392156862745098,0.482352941176471;0.600000000000000,0.00392156862745098,0.482352941176471;0.592156862745098,0.00392156862745098,0.478431372549020;0.584313725490196,0.00392156862745098,0.478431372549020;0.580392156862745,0.00392156862745098,0.478431372549020;0.568627450980392,0.00392156862745098,0.478431372549020;0.568627450980392,0.00392156862745098,0.478431372549020;0.552941176470588,0.00392156862745098,0.474509803921569;0.549019607843137,0.00392156862745098,0.474509803921569;0.549019607843137,0.00392156862745098,0.474509803921569;0.533333333333333,0.00392156862745098,0.474509803921569;0.533333333333333,0.00392156862745098,0.474509803921569;0.521568627450980,0.00392156862745098,0.470588235294118;0.513725490196078,0.00392156862745098,0.470588235294118;0.509803921568627,0.00392156862745098,0.470588235294118;0.501960784313726,0.00392156862745098,0.466666666666667;0.498039215686275,0.00392156862745098,0.466666666666667;0.490196078431373,0.00392156862745098,0.466666666666667;0.482352941176471,0.00392156862745098,0.466666666666667;0.478431372549020,0.00392156862745098,0.466666666666667;0.470588235294118,0,0.462745098039216;0.466666666666667,0,0.462745098039216;0.458823529411765,0,0.458823529411765;0.454901960784314,0,0.458823529411765;0.443137254901961,0,0.454901960784314;0.439215686274510,0,0.454901960784314;0.435294117647059,0,0.454901960784314;0.427450980392157,0,0.450980392156863;0.423529411764706,0,0.450980392156863;0.411764705882353,0,0.447058823529412;0.411764705882353,0,0.447058823529412;0.400000000000000,0,0.443137254901961;0.396078431372549,0,0.443137254901961;0.392156862745098,0,0.443137254901961;0.380392156862745,0,0.439215686274510;0.380392156862745,0,0.439215686274510;0.368627450980392,0,0.435294117647059;0.360784313725490,0,0.435294117647059;0.356862745098039,0,0.431372549019608;0.349019607843137,0,0.431372549019608;0.345098039215686,0,0.431372549019608;0.337254901960784,0,0.427450980392157;0.333333333333333,0,0.427450980392157;0.325490196078431,0,0.423529411764706;0.321568627450980,0,0.423529411764706;0.313725490196078,0,0.423529411764706;0.309803921568627,0,0.419607843137255;0.301960784313725,0,0.419607843137255;0.290196078431373,0,0.415686274509804;0.290196078431373,0,0.415686274509804;0.290196078431373,0,0.415686274509804]; + [0.964705882352941,0.984313725490196,0.988235294117647;0.960784313725490,0.980392156862745,0.988235294117647;0.956862745098039,0.980392156862745,0.988235294117647;0.956862745098039,0.976470588235294,0.984313725490196;0.952941176470588,0.976470588235294,0.984313725490196;0.949019607843137,0.972549019607843,0.984313725490196;0.945098039215686,0.972549019607843,0.984313725490196;0.945098039215686,0.968627450980392,0.980392156862745;0.941176470588235,0.968627450980392,0.980392156862745;0.937254901960784,0.964705882352941,0.980392156862745;0.937254901960784,0.964705882352941,0.976470588235294;0.933333333333333,0.960784313725490,0.976470588235294;0.929411764705882,0.960784313725490,0.976470588235294;0.925490196078431,0.956862745098039,0.976470588235294;0.921568627450980,0.952941176470588,0.972549019607843;0.921568627450980,0.952941176470588,0.972549019607843;0.917647058823529,0.949019607843137,0.968627450980392;0.913725490196078,0.949019607843137,0.968627450980392;0.913725490196078,0.949019607843137,0.968627450980392;0.905882352941177,0.945098039215686,0.968627450980392;0.905882352941177,0.945098039215686,0.968627450980392;0.901960784313726,0.941176470588235,0.964705882352941;0.898039215686275,0.937254901960784,0.964705882352941;0.894117647058824,0.937254901960784,0.960784313725490;0.894117647058824,0.933333333333333,0.960784313725490;0.890196078431373,0.933333333333333,0.960784313725490;0.886274509803922,0.929411764705882,0.960784313725490;0.886274509803922,0.929411764705882,0.956862745098039;0.882352941176471,0.925490196078431,0.956862745098039;0.878431372549020,0.925490196078431,0.956862745098039;0.874509803921569,0.921568627450980,0.952941176470588;0.870588235294118,0.921568627450980,0.952941176470588;0.866666666666667,0.917647058823529,0.952941176470588;0.862745098039216,0.913725490196078,0.949019607843137;0.858823529411765,0.909803921568627,0.949019607843137;0.854901960784314,0.905882352941177,0.945098039215686;0.847058823529412,0.901960784313726,0.941176470588235;0.847058823529412,0.901960784313726,0.941176470588235;0.839215686274510,0.894117647058824,0.937254901960784;0.839215686274510,0.894117647058824,0.937254901960784;0.831372549019608,0.890196078431373,0.937254901960784;0.827450980392157,0.886274509803922,0.933333333333333;0.827450980392157,0.886274509803922,0.933333333333333;0.819607843137255,0.878431372549020,0.929411764705882;0.815686274509804,0.878431372549020,0.929411764705882;0.811764705882353,0.874509803921569,0.925490196078431;0.807843137254902,0.870588235294118,0.925490196078431;0.803921568627451,0.866666666666667,0.925490196078431;0.800000000000000,0.866666666666667,0.921568627450980;0.796078431372549,0.862745098039216,0.921568627450980;0.792156862745098,0.858823529411765,0.917647058823529;0.788235294117647,0.854901960784314,0.917647058823529;0.784313725490196,0.850980392156863,0.913725490196078;0.780392156862745,0.850980392156863,0.913725490196078;0.772549019607843,0.847058823529412,0.909803921568627;0.768627450980392,0.843137254901961,0.909803921568627;0.764705882352941,0.839215686274510,0.909803921568627;0.760784313725490,0.835294117647059,0.905882352941177;0.756862745098039,0.835294117647059,0.905882352941177;0.752941176470588,0.831372549019608,0.901960784313726;0.745098039215686,0.823529411764706,0.898039215686275;0.745098039215686,0.823529411764706,0.898039215686275;0.737254901960784,0.819607843137255,0.898039215686275;0.737254901960784,0.819607843137255,0.898039215686275;0.729411764705882,0.811764705882353,0.894117647058824;0.725490196078431,0.811764705882353,0.894117647058824;0.725490196078431,0.811764705882353,0.894117647058824;0.717647058823529,0.803921568627451,0.890196078431373;0.713725490196078,0.803921568627451,0.886274509803922;0.709803921568628,0.800000000000000,0.886274509803922;0.705882352941177,0.796078431372549,0.886274509803922;0.701960784313725,0.792156862745098,0.882352941176471;0.698039215686275,0.792156862745098,0.882352941176471;0.694117647058824,0.788235294117647,0.882352941176471;0.690196078431373,0.784313725490196,0.878431372549020;0.686274509803922,0.780392156862745,0.878431372549020;0.682352941176471,0.780392156862745,0.874509803921569;0.678431372549020,0.776470588235294,0.874509803921569;0.674509803921569,0.772549019607843,0.874509803921569;0.670588235294118,0.772549019607843,0.870588235294118;0.666666666666667,0.768627450980392,0.870588235294118;0.662745098039216,0.764705882352941,0.870588235294118;0.654901960784314,0.760784313725490,0.866666666666667;0.650980392156863,0.760784313725490,0.866666666666667;0.643137254901961,0.752941176470588,0.862745098039216;0.643137254901961,0.752941176470588,0.862745098039216;0.635294117647059,0.749019607843137,0.858823529411765;0.635294117647059,0.749019607843137,0.858823529411765;0.627450980392157,0.741176470588235,0.854901960784314;0.623529411764706,0.741176470588235,0.854901960784314;0.623529411764706,0.741176470588235,0.854901960784314;0.615686274509804,0.733333333333333,0.850980392156863;0.615686274509804,0.729411764705882,0.850980392156863;0.611764705882353,0.725490196078431,0.847058823529412;0.611764705882353,0.717647058823529,0.843137254901961;0.607843137254902,0.713725490196078,0.843137254901961;0.603921568627451,0.709803921568628,0.839215686274510;0.603921568627451,0.705882352941177,0.839215686274510;0.600000000000000,0.701960784313725,0.835294117647059;0.600000000000000,0.698039215686275,0.831372549019608;0.596078431372549,0.690196078431373,0.831372549019608;0.596078431372549,0.686274509803922,0.827450980392157;0.592156862745098,0.682352941176471,0.823529411764706;0.588235294117647,0.674509803921569,0.819607843137255;0.588235294117647,0.674509803921569,0.819607843137255;0.584313725490196,0.662745098039216,0.815686274509804;0.584313725490196,0.662745098039216,0.815686274509804;0.580392156862745,0.658823529411765,0.811764705882353;0.576470588235294,0.650980392156863,0.807843137254902;0.576470588235294,0.650980392156863,0.807843137254902;0.572549019607843,0.639215686274510,0.803921568627451;0.568627450980392,0.635294117647059,0.800000000000000;0.568627450980392,0.631372549019608,0.796078431372549;0.564705882352941,0.627450980392157,0.796078431372549;0.564705882352941,0.627450980392157,0.796078431372549;0.560784313725490,0.615686274509804,0.792156862745098;0.560784313725490,0.611764705882353,0.788235294117647;0.556862745098039,0.607843137254902,0.784313725490196;0.552941176470588,0.603921568627451,0.784313725490196;0.552941176470588,0.596078431372549,0.780392156862745;0.549019607843137,0.592156862745098,0.776470588235294;0.549019607843137,0.588235294117647,0.776470588235294;0.549019607843137,0.584313725490196,0.772549019607843;0.549019607843137,0.576470588235294,0.772549019607843;0.549019607843137,0.572549019607843,0.768627450980392;0.549019607843137,0.568627450980392,0.764705882352941;0.549019607843137,0.560784313725490,0.764705882352941;0.549019607843137,0.552941176470588,0.756862745098039;0.549019607843137,0.552941176470588,0.756862745098039;0.549019607843137,0.541176470588235,0.752941176470588;0.549019607843137,0.541176470588235,0.752941176470588;0.549019607843137,0.537254901960784,0.749019607843137;0.549019607843137,0.525490196078431,0.745098039215686;0.549019607843137,0.525490196078431,0.745098039215686;0.549019607843137,0.513725490196078,0.741176470588235;0.549019607843137,0.509803921568627,0.737254901960784;0.549019607843137,0.505882352941176,0.733333333333333;0.549019607843137,0.498039215686275,0.733333333333333;0.549019607843137,0.494117647058824,0.729411764705882;0.549019607843137,0.490196078431373,0.725490196078431;0.549019607843137,0.482352941176471,0.725490196078431;0.549019607843137,0.478431372549020,0.721568627450980;0.549019607843137,0.470588235294118,0.717647058823529;0.549019607843137,0.466666666666667,0.717647058823529;0.549019607843137,0.462745098039216,0.713725490196078;0.549019607843137,0.454901960784314,0.709803921568628;0.549019607843137,0.450980392156863,0.709803921568628;0.549019607843137,0.447058823529412,0.705882352941177;0.549019607843137,0.439215686274510,0.701960784313725;0.549019607843137,0.435294117647059,0.701960784313725;0.549019607843137,0.431372549019608,0.698039215686275;0.549019607843137,0.419607843137255,0.694117647058824;0.549019607843137,0.419607843137255,0.694117647058824;0.545098039215686,0.407843137254902,0.686274509803922;0.545098039215686,0.407843137254902,0.686274509803922;0.545098039215686,0.403921568627451,0.686274509803922;0.545098039215686,0.392156862745098,0.682352941176471;0.545098039215686,0.392156862745098,0.682352941176471;0.545098039215686,0.384313725490196,0.674509803921569;0.545098039215686,0.380392156862745,0.674509803921569;0.541176470588235,0.372549019607843,0.670588235294118;0.541176470588235,0.368627450980392,0.666666666666667;0.541176470588235,0.364705882352941,0.666666666666667;0.541176470588235,0.356862745098039,0.662745098039216;0.541176470588235,0.352941176470588,0.662745098039216;0.541176470588235,0.349019607843137,0.658823529411765;0.541176470588235,0.341176470588235,0.654901960784314;0.541176470588235,0.337254901960784,0.654901960784314;0.537254901960784,0.333333333333333,0.650980392156863;0.537254901960784,0.325490196078431,0.647058823529412;0.537254901960784,0.321568627450980,0.647058823529412;0.537254901960784,0.317647058823529,0.643137254901961;0.537254901960784,0.309803921568627,0.643137254901961;0.537254901960784,0.305882352941177,0.639215686274510;0.537254901960784,0.301960784313725,0.635294117647059;0.533333333333333,0.290196078431373,0.631372549019608;0.533333333333333,0.290196078431373,0.631372549019608;0.533333333333333,0.278431372549020,0.627450980392157;0.533333333333333,0.274509803921569,0.623529411764706;0.533333333333333,0.274509803921569,0.623529411764706;0.533333333333333,0.262745098039216,0.619607843137255;0.533333333333333,0.262745098039216,0.619607843137255;0.533333333333333,0.254901960784314,0.615686274509804;0.529411764705882,0.247058823529412,0.611764705882353;0.529411764705882,0.243137254901961,0.607843137254902;0.529411764705882,0.235294117647059,0.603921568627451;0.529411764705882,0.231372549019608,0.600000000000000;0.525490196078431,0.223529411764706,0.596078431372549;0.525490196078431,0.215686274509804,0.592156862745098;0.525490196078431,0.211764705882353,0.588235294117647;0.525490196078431,0.203921568627451,0.580392156862745;0.525490196078431,0.200000000000000,0.576470588235294;0.521568627450980,0.192156862745098,0.572549019607843;0.521568627450980,0.188235294117647,0.568627450980392;0.521568627450980,0.176470588235294,0.560784313725490;0.521568627450980,0.172549019607843,0.560784313725490;0.517647058823530,0.168627450980392,0.556862745098039;0.517647058823530,0.160784313725490,0.552941176470588;0.517647058823530,0.156862745098039,0.549019607843137;0.517647058823530,0.145098039215686,0.541176470588235;0.517647058823530,0.145098039215686,0.541176470588235;0.513725490196078,0.133333333333333,0.533333333333333;0.513725490196078,0.129411764705882,0.529411764705882;0.513725490196078,0.125490196078431,0.529411764705882;0.513725490196078,0.113725490196078,0.521568627450980;0.513725490196078,0.109803921568627,0.521568627450980;0.509803921568627,0.101960784313725,0.513725490196078;0.509803921568627,0.0941176470588235,0.509803921568627;0.509803921568627,0.0901960784313726,0.505882352941176;0.505882352941176,0.0823529411764706,0.501960784313726;0.505882352941176,0.0745098039215686,0.498039215686275;0.505882352941176,0.0705882352941177,0.494117647058824;0.505882352941176,0.0627450980392157,0.490196078431373;0.505882352941176,0.0588235294117647,0.486274509803922;0.498039215686275,0.0549019607843137,0.478431372549020;0.490196078431373,0.0549019607843137,0.474509803921569;0.486274509803922,0.0509803921568627,0.466666666666667;0.478431372549020,0.0509803921568627,0.462745098039216;0.470588235294118,0.0470588235294118,0.450980392156863;0.466666666666667,0.0470588235294118,0.447058823529412;0.458823529411765,0.0431372549019608,0.443137254901961;0.450980392156863,0.0431372549019608,0.435294117647059;0.447058823529412,0.0392156862745098,0.431372549019608;0.435294117647059,0.0352941176470588,0.419607843137255;0.435294117647059,0.0352941176470588,0.419607843137255;0.419607843137255,0.0313725490196078,0.407843137254902;0.415686274509804,0.0313725490196078,0.403921568627451;0.415686274509804,0.0313725490196078,0.400000000000000;0.403921568627451,0.0274509803921569,0.388235294117647;0.400000000000000,0.0274509803921569,0.388235294117647;0.388235294117647,0.0235294117647059,0.376470588235294;0.384313725490196,0.0235294117647059,0.368627450980392;0.376470588235294,0.0196078431372549,0.364705882352941;0.368627450980392,0.0196078431372549,0.356862745098039;0.364705882352941,0.0156862745098039,0.352941176470588;0.356862745098039,0.0156862745098039,0.345098039215686;0.352941176470588,0.0117647058823529,0.341176470588235;0.345098039215686,0.0117647058823529,0.333333333333333;0.337254901960784,0.00784313725490196,0.329411764705882;0.333333333333333,0.00784313725490196,0.321568627450980;0.325490196078431,0.00392156862745098,0.317647058823529;0.317647058823529,0.00392156862745098,0.309803921568627;0.305882352941177,0,0.298039215686275;0.305882352941177,0,0.298039215686275;0.301960784313725,0,0.294117647058824]; + [0.964705882352941,0.984313725490196,0.937254901960784;0.960784313725490,0.984313725490196,0.933333333333333;0.956862745098039,0.984313725490196,0.933333333333333;0.956862745098039,0.980392156862745,0.929411764705882;0.952941176470588,0.980392156862745,0.925490196078431;0.949019607843137,0.980392156862745,0.925490196078431;0.945098039215686,0.980392156862745,0.921568627450980;0.945098039215686,0.976470588235294,0.917647058823529;0.941176470588235,0.976470588235294,0.917647058823529;0.937254901960784,0.976470588235294,0.913725490196078;0.937254901960784,0.972549019607843,0.909803921568627;0.933333333333333,0.972549019607843,0.909803921568627;0.929411764705882,0.972549019607843,0.905882352941177;0.925490196078431,0.972549019607843,0.901960784313726;0.921568627450980,0.968627450980392,0.898039215686275;0.921568627450980,0.968627450980392,0.898039215686275;0.917647058823529,0.964705882352941,0.894117647058824;0.913725490196078,0.964705882352941,0.890196078431373;0.913725490196078,0.964705882352941,0.890196078431373;0.905882352941177,0.964705882352941,0.886274509803922;0.905882352941177,0.964705882352941,0.886274509803922;0.901960784313726,0.960784313725490,0.878431372549020;0.898039215686275,0.960784313725490,0.878431372549020;0.894117647058824,0.956862745098039,0.874509803921569;0.894117647058824,0.956862745098039,0.870588235294118;0.890196078431373,0.956862745098039,0.870588235294118;0.886274509803922,0.956862745098039,0.866666666666667;0.886274509803922,0.952941176470588,0.862745098039216;0.882352941176471,0.952941176470588,0.862745098039216;0.878431372549020,0.952941176470588,0.858823529411765;0.874509803921569,0.949019607843137,0.854901960784314;0.874509803921569,0.949019607843137,0.854901960784314;0.870588235294118,0.949019607843137,0.850980392156863;0.870588235294118,0.949019607843137,0.847058823529412;0.866666666666667,0.945098039215686,0.847058823529412;0.862745098039216,0.945098039215686,0.843137254901961;0.858823529411765,0.945098039215686,0.839215686274510;0.858823529411765,0.945098039215686,0.839215686274510;0.854901960784314,0.941176470588235,0.831372549019608;0.854901960784314,0.941176470588235,0.831372549019608;0.850980392156863,0.941176470588235,0.827450980392157;0.847058823529412,0.937254901960784,0.823529411764706;0.847058823529412,0.937254901960784,0.823529411764706;0.843137254901961,0.937254901960784,0.819607843137255;0.839215686274510,0.937254901960784,0.815686274509804;0.835294117647059,0.933333333333333,0.811764705882353;0.835294117647059,0.933333333333333,0.811764705882353;0.831372549019608,0.933333333333333,0.807843137254902;0.831372549019608,0.933333333333333,0.803921568627451;0.827450980392157,0.929411764705882,0.803921568627451;0.823529411764706,0.929411764705882,0.800000000000000;0.823529411764706,0.929411764705882,0.796078431372549;0.819607843137255,0.929411764705882,0.796078431372549;0.815686274509804,0.925490196078431,0.792156862745098;0.815686274509804,0.925490196078431,0.788235294117647;0.811764705882353,0.925490196078431,0.784313725490196;0.807843137254902,0.925490196078431,0.784313725490196;0.807843137254902,0.921568627450980,0.780392156862745;0.803921568627451,0.921568627450980,0.776470588235294;0.803921568627451,0.921568627450980,0.776470588235294;0.796078431372549,0.917647058823529,0.768627450980392;0.796078431372549,0.917647058823529,0.768627450980392;0.788235294117647,0.917647058823529,0.764705882352941;0.788235294117647,0.917647058823529,0.764705882352941;0.780392156862745,0.913725490196078,0.760784313725490;0.776470588235294,0.909803921568627,0.760784313725490;0.776470588235294,0.909803921568627,0.760784313725490;0.764705882352941,0.905882352941177,0.756862745098039;0.760784313725490,0.905882352941177,0.752941176470588;0.756862745098039,0.901960784313726,0.752941176470588;0.752941176470588,0.901960784313726,0.749019607843137;0.749019607843137,0.901960784313726,0.749019607843137;0.745098039215686,0.898039215686275,0.745098039215686;0.741176470588235,0.898039215686275,0.745098039215686;0.733333333333333,0.894117647058824,0.741176470588235;0.729411764705882,0.894117647058824,0.741176470588235;0.725490196078431,0.890196078431373,0.737254901960784;0.721568627450980,0.890196078431373,0.737254901960784;0.717647058823529,0.886274509803922,0.733333333333333;0.713725490196078,0.886274509803922,0.733333333333333;0.709803921568628,0.886274509803922,0.729411764705882;0.705882352941177,0.882352941176471,0.729411764705882;0.698039215686275,0.882352941176471,0.725490196078431;0.694117647058824,0.878431372549020,0.725490196078431;0.686274509803922,0.874509803921569,0.721568627450980;0.686274509803922,0.874509803921569,0.721568627450980;0.678431372549020,0.874509803921569,0.717647058823529;0.678431372549020,0.874509803921569,0.717647058823529;0.666666666666667,0.870588235294118,0.713725490196078;0.662745098039216,0.866666666666667,0.709803921568628;0.662745098039216,0.866666666666667,0.709803921568628;0.654901960784314,0.862745098039216,0.709803921568628;0.650980392156863,0.862745098039216,0.709803921568628;0.643137254901961,0.858823529411765,0.713725490196078;0.639215686274510,0.858823529411765,0.713725490196078;0.631372549019608,0.854901960784314,0.717647058823529;0.627450980392157,0.854901960784314,0.717647058823529;0.623529411764706,0.850980392156863,0.721568627450980;0.615686274509804,0.850980392156863,0.721568627450980;0.611764705882353,0.847058823529412,0.721568627450980;0.603921568627451,0.847058823529412,0.725490196078431;0.600000000000000,0.843137254901961,0.725490196078431;0.592156862745098,0.839215686274510,0.729411764705882;0.584313725490196,0.835294117647059,0.733333333333333;0.584313725490196,0.835294117647059,0.733333333333333;0.572549019607843,0.831372549019608,0.737254901960784;0.572549019607843,0.831372549019608,0.737254901960784;0.564705882352941,0.831372549019608,0.737254901960784;0.556862745098039,0.827450980392157,0.741176470588235;0.556862745098039,0.827450980392157,0.741176470588235;0.545098039215686,0.823529411764706,0.745098039215686;0.541176470588235,0.819607843137255,0.749019607843137;0.533333333333333,0.819607843137255,0.749019607843137;0.529411764705882,0.815686274509804,0.752941176470588;0.529411764705882,0.815686274509804,0.752941176470588;0.517647058823530,0.811764705882353,0.752941176470588;0.509803921568627,0.807843137254902,0.756862745098039;0.505882352941176,0.807843137254902,0.756862745098039;0.498039215686275,0.803921568627451,0.760784313725490;0.494117647058824,0.803921568627451,0.760784313725490;0.490196078431373,0.800000000000000,0.764705882352941;0.482352941176471,0.800000000000000,0.764705882352941;0.478431372549020,0.796078431372549,0.768627450980392;0.470588235294118,0.792156862745098,0.768627450980392;0.466666666666667,0.792156862745098,0.772549019607843;0.462745098039216,0.788235294117647,0.772549019607843;0.454901960784314,0.784313725490196,0.776470588235294;0.447058823529412,0.776470588235294,0.780392156862745;0.443137254901961,0.776470588235294,0.780392156862745;0.435294117647059,0.772549019607843,0.784313725490196;0.431372549019608,0.772549019607843,0.784313725490196;0.427450980392157,0.768627450980392,0.784313725490196;0.415686274509804,0.760784313725490,0.788235294117647;0.415686274509804,0.760784313725490,0.788235294117647;0.403921568627451,0.756862745098039,0.792156862745098;0.400000000000000,0.752941176470588,0.792156862745098;0.396078431372549,0.749019607843137,0.796078431372549;0.388235294117647,0.749019607843137,0.796078431372549;0.384313725490196,0.745098039215686,0.800000000000000;0.376470588235294,0.741176470588235,0.800000000000000;0.372549019607843,0.737254901960784,0.803921568627451;0.368627450980392,0.733333333333333,0.803921568627451;0.360784313725490,0.733333333333333,0.807843137254902;0.356862745098039,0.729411764705882,0.807843137254902;0.349019607843137,0.725490196078431,0.811764705882353;0.345098039215686,0.721568627450980,0.811764705882353;0.341176470588235,0.721568627450980,0.815686274509804;0.333333333333333,0.717647058823529,0.815686274509804;0.329411764705882,0.713725490196078,0.815686274509804;0.321568627450980,0.709803921568628,0.819607843137255;0.317647058823529,0.705882352941177,0.819607843137255;0.305882352941177,0.701960784313725,0.823529411764706;0.305882352941177,0.701960784313725,0.823529411764706;0.298039215686275,0.694117647058824,0.819607843137255;0.298039215686275,0.690196078431373,0.819607843137255;0.294117647058824,0.686274509803922,0.819607843137255;0.282352941176471,0.678431372549020,0.811764705882353;0.282352941176471,0.678431372549020,0.811764705882353;0.274509803921569,0.666666666666667,0.807843137254902;0.270588235294118,0.662745098039216,0.803921568627451;0.266666666666667,0.658823529411765,0.803921568627451;0.262745098039216,0.654901960784314,0.800000000000000;0.258823529411765,0.650980392156863,0.796078431372549;0.254901960784314,0.643137254901961,0.796078431372549;0.250980392156863,0.639215686274510,0.792156862745098;0.247058823529412,0.635294117647059,0.792156862745098;0.239215686274510,0.631372549019608,0.788235294117647;0.235294117647059,0.623529411764706,0.784313725490196;0.231372549019608,0.619607843137255,0.784313725490196;0.227450980392157,0.615686274509804,0.780392156862745;0.223529411764706,0.611764705882353,0.776470588235294;0.219607843137255,0.603921568627451,0.776470588235294;0.215686274509804,0.600000000000000,0.772549019607843;0.211764705882353,0.596078431372549,0.768627450980392;0.207843137254902,0.592156862745098,0.768627450980392;0.196078431372549,0.580392156862745,0.760784313725490;0.196078431372549,0.580392156862745,0.760784313725490;0.188235294117647,0.572549019607843,0.756862745098039;0.184313725490196,0.568627450980392,0.752941176470588;0.184313725490196,0.568627450980392,0.752941176470588;0.176470588235294,0.556862745098039,0.749019607843137;0.176470588235294,0.556862745098039,0.749019607843137;0.168627450980392,0.549019607843137,0.745098039215686;0.164705882352941,0.545098039215686,0.741176470588235;0.160784313725490,0.541176470588235,0.741176470588235;0.152941176470588,0.533333333333333,0.737254901960784;0.149019607843137,0.529411764705882,0.733333333333333;0.145098039215686,0.525490196078431,0.733333333333333;0.141176470588235,0.521568627450980,0.729411764705882;0.137254901960784,0.517647058823530,0.729411764705882;0.133333333333333,0.513725490196078,0.725490196078431;0.129411764705882,0.509803921568627,0.725490196078431;0.125490196078431,0.501960784313726,0.721568627450980;0.121568627450980,0.498039215686275,0.717647058823529;0.113725490196078,0.490196078431373,0.713725490196078;0.113725490196078,0.490196078431373,0.713725490196078;0.105882352941176,0.486274509803922,0.713725490196078;0.101960784313725,0.482352941176471,0.709803921568628;0.0980392156862745,0.478431372549020,0.709803921568628;0.0901960784313726,0.466666666666667,0.701960784313725;0.0901960784313726,0.466666666666667,0.701960784313725;0.0823529411764706,0.458823529411765,0.698039215686275;0.0784313725490196,0.454901960784314,0.698039215686275;0.0784313725490196,0.454901960784314,0.698039215686275;0.0705882352941177,0.447058823529412,0.694117647058824;0.0666666666666667,0.447058823529412,0.694117647058824;0.0588235294117647,0.439215686274510,0.690196078431373;0.0549019607843137,0.431372549019608,0.686274509803922;0.0509803921568627,0.427450980392157,0.682352941176471;0.0470588235294118,0.423529411764706,0.682352941176471;0.0431372549019608,0.419607843137255,0.678431372549020;0.0392156862745098,0.415686274509804,0.678431372549020;0.0352941176470588,0.411764705882353,0.674509803921569;0.0313725490196078,0.407843137254902,0.674509803921569;0.0313725490196078,0.400000000000000,0.666666666666667;0.0313725490196078,0.396078431372549,0.662745098039216;0.0313725490196078,0.392156862745098,0.658823529411765;0.0313725490196078,0.388235294117647,0.650980392156863;0.0313725490196078,0.376470588235294,0.643137254901961;0.0313725490196078,0.376470588235294,0.643137254901961;0.0313725490196078,0.372549019607843,0.635294117647059;0.0313725490196078,0.364705882352941,0.631372549019608;0.0313725490196078,0.360784313725490,0.627450980392157;0.0313725490196078,0.352941176470588,0.615686274509804;0.0313725490196078,0.352941176470588,0.615686274509804;0.0313725490196078,0.341176470588235,0.603921568627451;0.0313725490196078,0.337254901960784,0.600000000000000;0.0313725490196078,0.337254901960784,0.600000000000000;0.0313725490196078,0.329411764705882,0.588235294117647;0.0313725490196078,0.325490196078431,0.588235294117647;0.0313725490196078,0.317647058823529,0.576470588235294;0.0313725490196078,0.313725490196078,0.572549019607843;0.0313725490196078,0.309803921568627,0.568627450980392;0.0313725490196078,0.301960784313725,0.560784313725490;0.0313725490196078,0.298039215686275,0.556862745098039;0.0313725490196078,0.294117647058824,0.552941176470588;0.0313725490196078,0.290196078431373,0.545098039215686;0.0313725490196078,0.282352941176471,0.541176470588235;0.0313725490196078,0.278431372549020,0.537254901960784;0.0313725490196078,0.274509803921569,0.529411764705882;0.0313725490196078,0.270588235294118,0.525490196078431;0.0313725490196078,0.262745098039216,0.521568627450980;0.0313725490196078,0.254901960784314,0.509803921568627;0.0313725490196078,0.254901960784314,0.509803921568627;0.0313725490196078,0.250980392156863,0.505882352941176]; + [0.996078431372549,0.964705882352941,0.980392156862745;0.992156862745098,0.960784313725490,0.980392156862745;0.992156862745098,0.960784313725490,0.980392156862745;0.988235294117647,0.956862745098039,0.976470588235294;0.988235294117647,0.956862745098039,0.976470588235294;0.984313725490196,0.952941176470588,0.976470588235294;0.980392156862745,0.952941176470588,0.976470588235294;0.980392156862745,0.949019607843137,0.972549019607843;0.976470588235294,0.949019607843137,0.972549019607843;0.976470588235294,0.945098039215686,0.972549019607843;0.972549019607843,0.945098039215686,0.968627450980392;0.968627450980392,0.941176470588235,0.968627450980392;0.968627450980392,0.941176470588235,0.968627450980392;0.964705882352941,0.937254901960784,0.968627450980392;0.960784313725490,0.933333333333333,0.964705882352941;0.960784313725490,0.933333333333333,0.964705882352941;0.956862745098039,0.929411764705882,0.960784313725490;0.952941176470588,0.929411764705882,0.960784313725490;0.952941176470588,0.929411764705882,0.960784313725490;0.949019607843137,0.925490196078431,0.960784313725490;0.949019607843137,0.925490196078431,0.960784313725490;0.945098039215686,0.921568627450980,0.956862745098039;0.941176470588235,0.917647058823529,0.956862745098039;0.941176470588235,0.917647058823529,0.952941176470588;0.937254901960784,0.913725490196078,0.952941176470588;0.933333333333333,0.913725490196078,0.952941176470588;0.933333333333333,0.909803921568627,0.952941176470588;0.929411764705882,0.909803921568627,0.949019607843137;0.929411764705882,0.905882352941177,0.949019607843137;0.925490196078431,0.905882352941177,0.949019607843137;0.921568627450980,0.901960784313726,0.945098039215686;0.921568627450980,0.901960784313726,0.945098039215686;0.917647058823529,0.898039215686275,0.945098039215686;0.913725490196078,0.894117647058824,0.941176470588235;0.909803921568627,0.894117647058824,0.941176470588235;0.905882352941177,0.890196078431373,0.941176470588235;0.898039215686275,0.886274509803922,0.937254901960784;0.898039215686275,0.886274509803922,0.937254901960784;0.890196078431373,0.878431372549020,0.933333333333333;0.890196078431373,0.878431372549020,0.933333333333333;0.886274509803922,0.874509803921569,0.929411764705882;0.882352941176471,0.870588235294118,0.929411764705882;0.882352941176471,0.870588235294118,0.929411764705882;0.874509803921569,0.866666666666667,0.925490196078431;0.870588235294118,0.862745098039216,0.925490196078431;0.866666666666667,0.858823529411765,0.921568627450980;0.862745098039216,0.858823529411765,0.921568627450980;0.862745098039216,0.854901960784314,0.921568627450980;0.858823529411765,0.850980392156863,0.917647058823529;0.854901960784314,0.850980392156863,0.917647058823529;0.850980392156863,0.847058823529412,0.917647058823529;0.847058823529412,0.843137254901961,0.913725490196078;0.843137254901961,0.843137254901961,0.913725490196078;0.839215686274510,0.839215686274510,0.909803921568627;0.835294117647059,0.835294117647059,0.909803921568627;0.835294117647059,0.831372549019608,0.909803921568627;0.831372549019608,0.831372549019608,0.905882352941177;0.827450980392157,0.827450980392157,0.905882352941177;0.823529411764706,0.823529411764706,0.905882352941177;0.819607843137255,0.823529411764706,0.901960784313726;0.811764705882353,0.815686274509804,0.898039215686275;0.811764705882353,0.815686274509804,0.898039215686275;0.803921568627451,0.811764705882353,0.898039215686275;0.800000000000000,0.811764705882353,0.898039215686275;0.792156862745098,0.807843137254902,0.894117647058824;0.788235294117647,0.803921568627451,0.894117647058824;0.788235294117647,0.803921568627451,0.894117647058824;0.776470588235294,0.800000000000000,0.890196078431373;0.772549019607843,0.796078431372549,0.890196078431373;0.764705882352941,0.796078431372549,0.886274509803922;0.760784313725490,0.792156862745098,0.886274509803922;0.756862745098039,0.788235294117647,0.886274509803922;0.749019607843137,0.788235294117647,0.882352941176471;0.745098039215686,0.784313725490196,0.882352941176471;0.741176470588235,0.784313725490196,0.882352941176471;0.733333333333333,0.780392156862745,0.878431372549020;0.729411764705882,0.776470588235294,0.878431372549020;0.725490196078431,0.776470588235294,0.878431372549020;0.717647058823529,0.772549019607843,0.874509803921569;0.713725490196078,0.768627450980392,0.874509803921569;0.709803921568628,0.768627450980392,0.874509803921569;0.705882352941177,0.764705882352941,0.870588235294118;0.698039215686275,0.764705882352941,0.870588235294118;0.694117647058824,0.760784313725490,0.866666666666667;0.686274509803922,0.756862745098039,0.866666666666667;0.682352941176471,0.756862745098039,0.866666666666667;0.674509803921569,0.749019607843137,0.862745098039216;0.670588235294118,0.749019607843137,0.862745098039216;0.662745098039216,0.745098039215686,0.858823529411765;0.658823529411765,0.745098039215686,0.858823529411765;0.658823529411765,0.745098039215686,0.858823529411765;0.647058823529412,0.737254901960784,0.854901960784314;0.639215686274510,0.737254901960784,0.854901960784314;0.635294117647059,0.733333333333333,0.854901960784314;0.627450980392157,0.729411764705882,0.850980392156863;0.623529411764706,0.729411764705882,0.850980392156863;0.615686274509804,0.725490196078431,0.847058823529412;0.611764705882353,0.725490196078431,0.847058823529412;0.603921568627451,0.721568627450980,0.847058823529412;0.596078431372549,0.717647058823529,0.843137254901961;0.592156862745098,0.717647058823529,0.843137254901961;0.584313725490196,0.713725490196078,0.843137254901961;0.580392156862745,0.709803921568628,0.839215686274510;0.568627450980392,0.705882352941177,0.835294117647059;0.568627450980392,0.705882352941177,0.835294117647059;0.552941176470588,0.701960784313725,0.835294117647059;0.552941176470588,0.701960784313725,0.835294117647059;0.549019607843137,0.698039215686275,0.831372549019608;0.537254901960784,0.694117647058824,0.831372549019608;0.537254901960784,0.694117647058824,0.831372549019608;0.525490196078431,0.690196078431373,0.827450980392157;0.521568627450980,0.686274509803922,0.823529411764706;0.509803921568627,0.682352941176471,0.823529411764706;0.505882352941176,0.682352941176471,0.823529411764706;0.505882352941176,0.682352941176471,0.823529411764706;0.494117647058824,0.678431372549020,0.819607843137255;0.486274509803922,0.674509803921569,0.819607843137255;0.482352941176471,0.670588235294118,0.815686274509804;0.474509803921569,0.670588235294118,0.815686274509804;0.466666666666667,0.666666666666667,0.811764705882353;0.462745098039216,0.662745098039216,0.811764705882353;0.454901960784314,0.662745098039216,0.811764705882353;0.450980392156863,0.658823529411765,0.807843137254902;0.443137254901961,0.654901960784314,0.807843137254902;0.435294117647059,0.654901960784314,0.803921568627451;0.427450980392157,0.650980392156863,0.803921568627451;0.419607843137255,0.647058823529412,0.800000000000000;0.407843137254902,0.639215686274510,0.796078431372549;0.403921568627451,0.639215686274510,0.796078431372549;0.388235294117647,0.635294117647059,0.796078431372549;0.384313725490196,0.635294117647059,0.796078431372549;0.380392156862745,0.631372549019608,0.792156862745098;0.364705882352941,0.623529411764706,0.788235294117647;0.364705882352941,0.623529411764706,0.788235294117647;0.349019607843137,0.619607843137255,0.784313725490196;0.345098039215686,0.615686274509804,0.784313725490196;0.333333333333333,0.611764705882353,0.780392156862745;0.325490196078431,0.611764705882353,0.780392156862745;0.317647058823529,0.607843137254902,0.776470588235294;0.313725490196078,0.603921568627451,0.776470588235294;0.305882352941177,0.600000000000000,0.772549019607843;0.298039215686275,0.596078431372549,0.772549019607843;0.290196078431373,0.596078431372549,0.768627450980392;0.282352941176471,0.592156862745098,0.768627450980392;0.274509803921569,0.588235294117647,0.764705882352941;0.266666666666667,0.584313725490196,0.764705882352941;0.258823529411765,0.580392156862745,0.764705882352941;0.250980392156863,0.580392156862745,0.760784313725490;0.243137254901961,0.576470588235294,0.760784313725490;0.235294117647059,0.572549019607843,0.756862745098039;0.227450980392157,0.568627450980392,0.756862745098039;0.215686274509804,0.564705882352941,0.752941176470588;0.211764705882353,0.564705882352941,0.752941176470588;0.200000000000000,0.556862745098039,0.749019607843137;0.196078431372549,0.556862745098039,0.749019607843137;0.192156862745098,0.552941176470588,0.745098039215686;0.180392156862745,0.545098039215686,0.741176470588235;0.180392156862745,0.545098039215686,0.741176470588235;0.168627450980392,0.537254901960784,0.737254901960784;0.164705882352941,0.533333333333333,0.737254901960784;0.156862745098039,0.529411764705882,0.733333333333333;0.152941176470588,0.525490196078431,0.733333333333333;0.145098039215686,0.521568627450980,0.729411764705882;0.141176470588235,0.517647058823530,0.729411764705882;0.133333333333333,0.513725490196078,0.725490196078431;0.129411764705882,0.509803921568627,0.725490196078431;0.121568627450980,0.505882352941176,0.721568627450980;0.113725490196078,0.501960784313726,0.721568627450980;0.109803921568627,0.498039215686275,0.717647058823529;0.101960784313725,0.494117647058824,0.717647058823529;0.0980392156862745,0.490196078431373,0.713725490196078;0.0901960784313726,0.486274509803922,0.713725490196078;0.0862745098039216,0.482352941176471,0.709803921568628;0.0784313725490196,0.478431372549020,0.709803921568628;0.0745098039215686,0.474509803921569,0.705882352941177;0.0627450980392157,0.466666666666667,0.701960784313725;0.0627450980392157,0.466666666666667,0.701960784313725;0.0509803921568627,0.458823529411765,0.698039215686275;0.0470588235294118,0.454901960784314,0.698039215686275;0.0431372549019608,0.454901960784314,0.698039215686275;0.0313725490196078,0.447058823529412,0.694117647058824;0.0313725490196078,0.447058823529412,0.694117647058824;0.0196078431372549,0.439215686274510,0.690196078431373;0.0156862745098039,0.435294117647059,0.686274509803922;0.0156862745098039,0.431372549019608,0.682352941176471;0.0156862745098039,0.431372549019608,0.674509803921569;0.0156862745098039,0.427450980392157,0.670588235294118;0.0156862745098039,0.423529411764706,0.666666666666667;0.0156862745098039,0.423529411764706,0.662745098039216;0.0156862745098039,0.419607843137255,0.658823529411765;0.0156862745098039,0.415686274509804,0.654901960784314;0.0156862745098039,0.411764705882353,0.650980392156863;0.0156862745098039,0.411764705882353,0.647058823529412;0.0156862745098039,0.407843137254902,0.643137254901961;0.0156862745098039,0.403921568627451,0.635294117647059;0.0156862745098039,0.403921568627451,0.635294117647059;0.0156862745098039,0.400000000000000,0.627450980392157;0.0156862745098039,0.396078431372549,0.623529411764706;0.0156862745098039,0.396078431372549,0.619607843137255;0.0156862745098039,0.388235294117647,0.611764705882353;0.0156862745098039,0.388235294117647,0.611764705882353;0.0156862745098039,0.384313725490196,0.603921568627451;0.0156862745098039,0.380392156862745,0.600000000000000;0.0156862745098039,0.380392156862745,0.600000000000000;0.0156862745098039,0.376470588235294,0.592156862745098;0.0156862745098039,0.376470588235294,0.588235294117647;0.0156862745098039,0.368627450980392,0.580392156862745;0.0156862745098039,0.368627450980392,0.576470588235294;0.0156862745098039,0.364705882352941,0.572549019607843;0.0156862745098039,0.360784313725490,0.568627450980392;0.0156862745098039,0.360784313725490,0.564705882352941;0.0156862745098039,0.356862745098039,0.560784313725490;0.0156862745098039,0.352941176470588,0.556862745098039;0.0156862745098039,0.352941176470588,0.552941176470588;0.0117647058823529,0.349019607843137,0.545098039215686;0.0117647058823529,0.345098039215686,0.537254901960784;0.0117647058823529,0.337254901960784,0.533333333333333;0.0117647058823529,0.333333333333333,0.525490196078431;0.0117647058823529,0.325490196078431,0.513725490196078;0.0117647058823529,0.325490196078431,0.513725490196078;0.0117647058823529,0.321568627450980,0.505882352941176;0.0117647058823529,0.317647058823529,0.498039215686275;0.0117647058823529,0.313725490196078,0.494117647058824;0.0117647058823529,0.305882352941177,0.478431372549020;0.0117647058823529,0.305882352941177,0.478431372549020;0.0117647058823529,0.298039215686275,0.466666666666667;0.0117647058823529,0.294117647058824,0.462745098039216;0.0117647058823529,0.294117647058824,0.458823529411765;0.0117647058823529,0.286274509803922,0.447058823529412;0.0117647058823529,0.286274509803922,0.443137254901961;0.00784313725490196,0.274509803921569,0.435294117647059;0.00784313725490196,0.270588235294118,0.427450980392157;0.00784313725490196,0.266666666666667,0.419607843137255;0.00784313725490196,0.262745098039216,0.415686274509804;0.00784313725490196,0.258823529411765,0.407843137254902;0.00784313725490196,0.254901960784314,0.400000000000000;0.00784313725490196,0.250980392156863,0.396078431372549;0.00784313725490196,0.247058823529412,0.388235294117647;0.00784313725490196,0.243137254901961,0.380392156862745;0.00784313725490196,0.239215686274510,0.376470588235294;0.00784313725490196,0.235294117647059,0.368627450980392;0.00784313725490196,0.231372549019608,0.360784313725490;0.00784313725490196,0.223529411764706,0.349019607843137;0.00784313725490196,0.223529411764706,0.349019607843137;0.00784313725490196,0.219607843137255,0.345098039215686]; + [0.996078431372549,0.996078431372549,0.843137254901961;0.992156862745098,0.996078431372549,0.839215686274510;0.992156862745098,0.996078431372549,0.835294117647059;0.988235294117647,0.992156862745098,0.823529411764706;0.988235294117647,0.992156862745098,0.823529411764706;0.984313725490196,0.992156862745098,0.815686274509804;0.980392156862745,0.992156862745098,0.811764705882353;0.976470588235294,0.992156862745098,0.803921568627451;0.976470588235294,0.988235294117647,0.800000000000000;0.976470588235294,0.988235294117647,0.800000000000000;0.972549019607843,0.988235294117647,0.788235294117647;0.968627450980392,0.988235294117647,0.784313725490196;0.968627450980392,0.984313725490196,0.780392156862745;0.964705882352941,0.984313725490196,0.776470588235294;0.960784313725490,0.984313725490196,0.768627450980392;0.960784313725490,0.984313725490196,0.764705882352941;0.956862745098039,0.984313725490196,0.760784313725490;0.956862745098039,0.980392156862745,0.756862745098039;0.952941176470588,0.980392156862745,0.749019607843137;0.952941176470588,0.980392156862745,0.745098039215686;0.949019607843137,0.980392156862745,0.741176470588235;0.949019607843137,0.976470588235294,0.737254901960784;0.941176470588235,0.976470588235294,0.725490196078431;0.941176470588235,0.976470588235294,0.725490196078431;0.941176470588235,0.976470588235294,0.721568627450980;0.937254901960784,0.976470588235294,0.713725490196078;0.937254901960784,0.972549019607843,0.709803921568628;0.933333333333333,0.972549019607843,0.701960784313725;0.933333333333333,0.972549019607843,0.701960784313725;0.925490196078431,0.968627450980392,0.694117647058824;0.921568627450980,0.968627450980392,0.694117647058824;0.917647058823529,0.968627450980392,0.694117647058824;0.913725490196078,0.964705882352941,0.694117647058824;0.913725490196078,0.964705882352941,0.694117647058824;0.901960784313726,0.960784313725490,0.694117647058824;0.898039215686275,0.960784313725490,0.694117647058824;0.894117647058824,0.956862745098039,0.694117647058824;0.890196078431373,0.956862745098039,0.694117647058824;0.886274509803922,0.952941176470588,0.694117647058824;0.878431372549020,0.952941176470588,0.694117647058824;0.874509803921569,0.949019607843137,0.698039215686275;0.870588235294118,0.949019607843137,0.698039215686275;0.866666666666667,0.945098039215686,0.698039215686275;0.862745098039216,0.945098039215686,0.698039215686275;0.854901960784314,0.941176470588235,0.698039215686275;0.850980392156863,0.941176470588235,0.698039215686275;0.843137254901961,0.937254901960784,0.698039215686275;0.843137254901961,0.937254901960784,0.698039215686275;0.839215686274510,0.937254901960784,0.698039215686275;0.831372549019608,0.933333333333333,0.698039215686275;0.827450980392157,0.933333333333333,0.698039215686275;0.819607843137255,0.929411764705882,0.701960784313725;0.819607843137255,0.929411764705882,0.701960784313725;0.811764705882353,0.925490196078431,0.701960784313725;0.803921568627451,0.921568627450980,0.701960784313725;0.800000000000000,0.921568627450980,0.701960784313725;0.796078431372549,0.917647058823529,0.701960784313725;0.796078431372549,0.917647058823529,0.701960784313725;0.788235294117647,0.913725490196078,0.701960784313725;0.780392156862745,0.913725490196078,0.701960784313725;0.776470588235294,0.909803921568627,0.705882352941177;0.768627450980392,0.905882352941177,0.705882352941177;0.756862745098039,0.905882352941177,0.705882352941177;0.749019607843137,0.901960784313726,0.705882352941177;0.741176470588235,0.898039215686275,0.705882352941177;0.733333333333333,0.894117647058824,0.709803921568628;0.721568627450980,0.890196078431373,0.709803921568628;0.713725490196078,0.886274509803922,0.709803921568628;0.705882352941177,0.882352941176471,0.709803921568628;0.698039215686275,0.878431372549020,0.713725490196078;0.678431372549020,0.874509803921569,0.713725490196078;0.678431372549020,0.874509803921569,0.713725490196078;0.662745098039216,0.866666666666667,0.713725490196078;0.654901960784314,0.862745098039216,0.717647058823529;0.650980392156863,0.862745098039216,0.717647058823529;0.635294117647059,0.854901960784314,0.717647058823529;0.635294117647059,0.854901960784314,0.717647058823529;0.615686274509804,0.847058823529412,0.721568627450980;0.607843137254902,0.847058823529412,0.721568627450980;0.600000000000000,0.843137254901961,0.721568627450980;0.592156862745098,0.839215686274510,0.721568627450980;0.584313725490196,0.835294117647059,0.721568627450980;0.572549019607843,0.831372549019608,0.725490196078431;0.564705882352941,0.827450980392157,0.725490196078431;0.552941176470588,0.823529411764706,0.725490196078431;0.545098039215686,0.819607843137255,0.725490196078431;0.537254901960784,0.819607843137255,0.725490196078431;0.529411764705882,0.815686274509804,0.729411764705882;0.517647058823530,0.811764705882353,0.729411764705882;0.509803921568627,0.807843137254902,0.729411764705882;0.501960784313726,0.803921568627451,0.729411764705882;0.494117647058824,0.800000000000000,0.733333333333333;0.482352941176471,0.800000000000000,0.733333333333333;0.478431372549020,0.796078431372549,0.733333333333333;0.462745098039216,0.788235294117647,0.737254901960784;0.462745098039216,0.788235294117647,0.737254901960784;0.447058823529412,0.784313725490196,0.737254901960784;0.443137254901961,0.780392156862745,0.741176470588235;0.439215686274510,0.780392156862745,0.741176470588235;0.423529411764706,0.776470588235294,0.741176470588235;0.419607843137255,0.776470588235294,0.741176470588235;0.407843137254902,0.768627450980392,0.745098039215686;0.400000000000000,0.768627450980392,0.745098039215686;0.392156862745098,0.764705882352941,0.745098039215686;0.388235294117647,0.760784313725490,0.749019607843137;0.380392156862745,0.756862745098039,0.749019607843137;0.372549019607843,0.756862745098039,0.749019607843137;0.364705882352941,0.752941176470588,0.749019607843137;0.356862745098039,0.749019607843137,0.752941176470588;0.349019607843137,0.749019607843137,0.752941176470588;0.341176470588235,0.745098039215686,0.752941176470588;0.333333333333333,0.741176470588235,0.756862745098039;0.325490196078431,0.737254901960784,0.756862745098039;0.317647058823529,0.737254901960784,0.756862745098039;0.309803921568627,0.733333333333333,0.756862745098039;0.301960784313725,0.729411764705882,0.760784313725490;0.290196078431373,0.725490196078431,0.760784313725490;0.286274509803922,0.725490196078431,0.760784313725490;0.270588235294118,0.717647058823529,0.764705882352941;0.270588235294118,0.717647058823529,0.764705882352941;0.254901960784314,0.713725490196078,0.764705882352941;0.250980392156863,0.709803921568628,0.764705882352941;0.250980392156863,0.709803921568628,0.764705882352941;0.243137254901961,0.701960784313725,0.764705882352941;0.243137254901961,0.698039215686275,0.764705882352941;0.231372549019608,0.690196078431373,0.764705882352941;0.227450980392157,0.686274509803922,0.764705882352941;0.223529411764706,0.682352941176471,0.764705882352941;0.219607843137255,0.678431372549020,0.764705882352941;0.215686274509804,0.674509803921569,0.760784313725490;0.211764705882353,0.666666666666667,0.760784313725490;0.207843137254902,0.662745098039216,0.760784313725490;0.203921568627451,0.658823529411765,0.760784313725490;0.196078431372549,0.654901960784314,0.760784313725490;0.192156862745098,0.650980392156863,0.760784313725490;0.188235294117647,0.647058823529412,0.760784313725490;0.184313725490196,0.643137254901961,0.760784313725490;0.176470588235294,0.631372549019608,0.756862745098039;0.176470588235294,0.631372549019608,0.756862745098039;0.172549019607843,0.627450980392157,0.756862745098039;0.160784313725490,0.619607843137255,0.756862745098039;0.160784313725490,0.619607843137255,0.756862745098039;0.152941176470588,0.607843137254902,0.756862745098039;0.152941176470588,0.607843137254902,0.756862745098039;0.145098039215686,0.600000000000000,0.752941176470588;0.141176470588235,0.596078431372549,0.752941176470588;0.141176470588235,0.596078431372549,0.752941176470588;0.129411764705882,0.588235294117647,0.752941176470588;0.125490196078431,0.584313725490196,0.752941176470588;0.121568627450980,0.576470588235294,0.752941176470588;0.117647058823529,0.572549019607843,0.752941176470588;0.113725490196078,0.568627450980392,0.752941176470588;0.113725490196078,0.564705882352941,0.749019607843137;0.113725490196078,0.556862745098039,0.745098039215686;0.113725490196078,0.549019607843137,0.745098039215686;0.113725490196078,0.545098039215686,0.741176470588235;0.113725490196078,0.537254901960784,0.737254901960784;0.113725490196078,0.533333333333333,0.733333333333333;0.117647058823529,0.525490196078431,0.733333333333333;0.117647058823529,0.517647058823530,0.729411764705882;0.117647058823529,0.513725490196078,0.725490196078431;0.117647058823529,0.501960784313726,0.721568627450980;0.117647058823529,0.501960784313726,0.721568627450980;0.117647058823529,0.494117647058824,0.717647058823529;0.121568627450980,0.482352941176471,0.709803921568628;0.121568627450980,0.482352941176471,0.709803921568628;0.121568627450980,0.470588235294118,0.705882352941177;0.121568627450980,0.466666666666667,0.705882352941177;0.121568627450980,0.454901960784314,0.698039215686275;0.121568627450980,0.450980392156863,0.694117647058824;0.121568627450980,0.450980392156863,0.694117647058824;0.125490196078431,0.439215686274510,0.690196078431373;0.125490196078431,0.435294117647059,0.686274509803922;0.125490196078431,0.423529411764706,0.682352941176471;0.125490196078431,0.419607843137255,0.682352941176471;0.125490196078431,0.411764705882353,0.678431372549020;0.129411764705882,0.407843137254902,0.674509803921569;0.129411764705882,0.400000000000000,0.670588235294118;0.129411764705882,0.392156862745098,0.670588235294118;0.129411764705882,0.388235294117647,0.666666666666667;0.129411764705882,0.380392156862745,0.662745098039216;0.129411764705882,0.376470588235294,0.658823529411765;0.129411764705882,0.368627450980392,0.658823529411765;0.133333333333333,0.360784313725490,0.654901960784314;0.133333333333333,0.356862745098039,0.650980392156863;0.133333333333333,0.349019607843137,0.647058823529412;0.133333333333333,0.349019607843137,0.647058823529412;0.133333333333333,0.341176470588235,0.647058823529412;0.133333333333333,0.333333333333333,0.639215686274510;0.133333333333333,0.333333333333333,0.639215686274510;0.133333333333333,0.321568627450980,0.635294117647059;0.133333333333333,0.321568627450980,0.635294117647059;0.137254901960784,0.309803921568627,0.631372549019608;0.137254901960784,0.305882352941177,0.627450980392157;0.137254901960784,0.301960784313725,0.627450980392157;0.137254901960784,0.294117647058824,0.623529411764706;0.137254901960784,0.290196078431373,0.619607843137255;0.137254901960784,0.286274509803922,0.619607843137255;0.137254901960784,0.278431372549020,0.615686274509804;0.137254901960784,0.274509803921569,0.611764705882353;0.137254901960784,0.270588235294118,0.611764705882353;0.137254901960784,0.262745098039216,0.607843137254902;0.137254901960784,0.258823529411765,0.603921568627451;0.141176470588235,0.254901960784314,0.603921568627451;0.141176470588235,0.250980392156863,0.600000000000000;0.141176470588235,0.243137254901961,0.600000000000000;0.141176470588235,0.239215686274510,0.596078431372549;0.141176470588235,0.231372549019608,0.592156862745098;0.141176470588235,0.227450980392157,0.592156862745098;0.141176470588235,0.219607843137255,0.584313725490196;0.141176470588235,0.219607843137255,0.584313725490196;0.141176470588235,0.211764705882353,0.584313725490196;0.141176470588235,0.203921568627451,0.580392156862745;0.141176470588235,0.203921568627451,0.580392156862745;0.137254901960784,0.196078431372549,0.564705882352941;0.133333333333333,0.192156862745098,0.560784313725490;0.129411764705882,0.192156862745098,0.549019607843137;0.125490196078431,0.188235294117647,0.541176470588235;0.121568627450980,0.184313725490196,0.533333333333333;0.117647058823529,0.184313725490196,0.529411764705882;0.113725490196078,0.180392156862745,0.521568627450980;0.109803921568627,0.176470588235294,0.513725490196078;0.109803921568627,0.172549019607843,0.505882352941176;0.105882352941176,0.172549019607843,0.498039215686275;0.101960784313725,0.168627450980392,0.490196078431373;0.0980392156862745,0.164705882352941,0.482352941176471;0.0941176470588235,0.160784313725490,0.474509803921569;0.0901960784313726,0.160784313725490,0.470588235294118;0.0862745098039216,0.156862745098039,0.462745098039216;0.0823529411764706,0.152941176470588,0.454901960784314;0.0784313725490196,0.152941176470588,0.447058823529412;0.0705882352941177,0.145098039215686,0.435294117647059;0.0705882352941177,0.145098039215686,0.431372549019608;0.0666666666666667,0.141176470588235,0.415686274509804;0.0666666666666667,0.141176470588235,0.411764705882353;0.0627450980392157,0.137254901960784,0.407843137254902;0.0549019607843137,0.133333333333333,0.396078431372549;0.0549019607843137,0.133333333333333,0.396078431372549;0.0470588235294118,0.125490196078431,0.380392156862745;0.0431372549019608,0.121568627450980,0.376470588235294;0.0392156862745098,0.121568627450980,0.364705882352941;0.0352941176470588,0.117647058823529,0.356862745098039;0.0313725490196078,0.113725490196078,0.349019607843137;0.0313725490196078,0.113725490196078,0.349019607843137]; + [1,0.968627450980392,0.984313725490196;0.996078431372549,0.964705882352941,0.980392156862745;0.992156862745098,0.960784313725490,0.980392156862745;0.992156862745098,0.960784313725490,0.976470588235294;0.988235294117647,0.952941176470588,0.976470588235294;0.988235294117647,0.952941176470588,0.976470588235294;0.980392156862745,0.949019607843137,0.972549019607843;0.980392156862745,0.945098039215686,0.972549019607843;0.976470588235294,0.945098039215686,0.968627450980392;0.976470588235294,0.941176470588235,0.968627450980392;0.976470588235294,0.941176470588235,0.968627450980392;0.968627450980392,0.937254901960784,0.964705882352941;0.968627450980392,0.933333333333333,0.964705882352941;0.964705882352941,0.929411764705882,0.964705882352941;0.964705882352941,0.929411764705882,0.960784313725490;0.960784313725490,0.925490196078431,0.960784313725490;0.956862745098039,0.921568627450980,0.960784313725490;0.956862745098039,0.921568627450980,0.956862745098039;0.952941176470588,0.917647058823529,0.956862745098039;0.952941176470588,0.913725490196078,0.956862745098039;0.949019607843137,0.913725490196078,0.952941176470588;0.945098039215686,0.909803921568627,0.952941176470588;0.945098039215686,0.905882352941177,0.952941176470588;0.941176470588235,0.901960784313726,0.949019607843137;0.941176470588235,0.901960784313726,0.949019607843137;0.937254901960784,0.898039215686275,0.949019607843137;0.933333333333333,0.898039215686275,0.945098039215686;0.933333333333333,0.894117647058824,0.945098039215686;0.929411764705882,0.890196078431373,0.941176470588235;0.929411764705882,0.890196078431373,0.941176470588235;0.921568627450980,0.882352941176471,0.937254901960784;0.921568627450980,0.882352941176471,0.937254901960784;0.917647058823529,0.878431372549020,0.937254901960784;0.913725490196078,0.878431372549020,0.937254901960784;0.913725490196078,0.878431372549020,0.937254901960784;0.905882352941177,0.874509803921569,0.933333333333333;0.901960784313726,0.870588235294118,0.933333333333333;0.898039215686275,0.870588235294118,0.929411764705882;0.894117647058824,0.866666666666667,0.929411764705882;0.890196078431373,0.866666666666667,0.929411764705882;0.890196078431373,0.862745098039216,0.925490196078431;0.886274509803922,0.862745098039216,0.925490196078431;0.882352941176471,0.858823529411765,0.925490196078431;0.878431372549020,0.858823529411765,0.921568627450980;0.874509803921569,0.854901960784314,0.921568627450980;0.870588235294118,0.850980392156863,0.921568627450980;0.866666666666667,0.850980392156863,0.917647058823529;0.862745098039216,0.847058823529412,0.917647058823529;0.862745098039216,0.847058823529412,0.917647058823529;0.858823529411765,0.843137254901961,0.917647058823529;0.854901960784314,0.843137254901961,0.913725490196078;0.850980392156863,0.839215686274510,0.913725490196078;0.843137254901961,0.835294117647059,0.909803921568627;0.843137254901961,0.835294117647059,0.909803921568627;0.835294117647059,0.831372549019608,0.909803921568627;0.835294117647059,0.831372549019608,0.905882352941177;0.831372549019608,0.827450980392157,0.905882352941177;0.827450980392157,0.827450980392157,0.905882352941177;0.827450980392157,0.827450980392157,0.905882352941177;0.819607843137255,0.819607843137255,0.901960784313726;0.815686274509804,0.819607843137255,0.901960784313726;0.811764705882353,0.815686274509804,0.898039215686275;0.807843137254902,0.815686274509804,0.898039215686275;0.803921568627451,0.811764705882353,0.898039215686275;0.796078431372549,0.807843137254902,0.894117647058824;0.792156862745098,0.807843137254902,0.894117647058824;0.788235294117647,0.803921568627451,0.894117647058824;0.780392156862745,0.803921568627451,0.890196078431373;0.776470588235294,0.800000000000000,0.890196078431373;0.772549019607843,0.796078431372549,0.890196078431373;0.764705882352941,0.796078431372549,0.886274509803922;0.756862745098039,0.788235294117647,0.886274509803922;0.756862745098039,0.788235294117647,0.886274509803922;0.745098039215686,0.784313725490196,0.882352941176471;0.741176470588235,0.784313725490196,0.882352941176471;0.741176470588235,0.784313725490196,0.882352941176471;0.729411764705882,0.776470588235294,0.878431372549020;0.729411764705882,0.776470588235294,0.878431372549020;0.717647058823529,0.772549019607843,0.874509803921569;0.713725490196078,0.768627450980392,0.874509803921569;0.709803921568628,0.768627450980392,0.874509803921569;0.705882352941177,0.764705882352941,0.870588235294118;0.701960784313725,0.764705882352941,0.870588235294118;0.694117647058824,0.760784313725490,0.866666666666667;0.690196078431373,0.756862745098039,0.866666666666667;0.682352941176471,0.756862745098039,0.866666666666667;0.678431372549020,0.752941176470588,0.862745098039216;0.674509803921569,0.749019607843137,0.862745098039216;0.666666666666667,0.749019607843137,0.862745098039216;0.662745098039216,0.745098039215686,0.858823529411765;0.658823529411765,0.745098039215686,0.858823529411765;0.650980392156863,0.741176470588235,0.858823529411765;0.647058823529412,0.737254901960784,0.854901960784314;0.635294117647059,0.737254901960784,0.854901960784314;0.631372549019608,0.733333333333333,0.854901960784314;0.615686274509804,0.729411764705882,0.850980392156863;0.615686274509804,0.729411764705882,0.850980392156863;0.600000000000000,0.725490196078431,0.847058823529412;0.596078431372549,0.721568627450980,0.847058823529412;0.592156862745098,0.721568627450980,0.847058823529412;0.576470588235294,0.717647058823529,0.843137254901961;0.572549019607843,0.717647058823529,0.843137254901961;0.560784313725490,0.709803921568628,0.839215686274510;0.552941176470588,0.709803921568628,0.839215686274510;0.545098039215686,0.705882352941177,0.835294117647059;0.537254901960784,0.701960784313725,0.835294117647059;0.529411764705882,0.701960784313725,0.835294117647059;0.521568627450980,0.698039215686275,0.831372549019608;0.513725490196078,0.698039215686275,0.831372549019608;0.505882352941176,0.694117647058824,0.831372549019608;0.498039215686275,0.690196078431373,0.827450980392157;0.490196078431373,0.690196078431373,0.827450980392157;0.482352941176471,0.686274509803922,0.823529411764706;0.474509803921569,0.682352941176471,0.823529411764706;0.466666666666667,0.682352941176471,0.823529411764706;0.458823529411765,0.678431372549020,0.819607843137255;0.450980392156863,0.678431372549020,0.819607843137255;0.439215686274510,0.674509803921569,0.819607843137255;0.435294117647059,0.670588235294118,0.815686274509804;0.419607843137255,0.666666666666667,0.811764705882353;0.419607843137255,0.666666666666667,0.811764705882353;0.403921568627451,0.662745098039216,0.811764705882353;0.400000000000000,0.658823529411765,0.807843137254902;0.400000000000000,0.658823529411765,0.807843137254902;0.388235294117647,0.654901960784314,0.803921568627451;0.384313725490196,0.654901960784314,0.803921568627451;0.376470588235294,0.647058823529412,0.800000000000000;0.368627450980392,0.643137254901961,0.800000000000000;0.364705882352941,0.639215686274510,0.796078431372549;0.356862745098039,0.639215686274510,0.796078431372549;0.349019607843137,0.635294117647059,0.796078431372549;0.345098039215686,0.631372549019608,0.792156862745098;0.337254901960784,0.627450980392157,0.792156862745098;0.333333333333333,0.623529411764706,0.788235294117647;0.325490196078431,0.623529411764706,0.788235294117647;0.321568627450980,0.619607843137255,0.784313725490196;0.313725490196078,0.615686274509804,0.784313725490196;0.309803921568627,0.611764705882353,0.780392156862745;0.298039215686275,0.607843137254902,0.776470588235294;0.298039215686275,0.607843137254902,0.776470588235294;0.290196078431373,0.603921568627451,0.776470588235294;0.282352941176471,0.596078431372549,0.772549019607843;0.278431372549020,0.596078431372549,0.772549019607843;0.266666666666667,0.592156862745098,0.768627450980392;0.266666666666667,0.592156862745098,0.768627450980392;0.254901960784314,0.584313725490196,0.764705882352941;0.247058823529412,0.580392156862745,0.764705882352941;0.247058823529412,0.580392156862745,0.764705882352941;0.235294117647059,0.576470588235294,0.760784313725490;0.231372549019608,0.572549019607843,0.756862745098039;0.223529411764706,0.568627450980392,0.756862745098039;0.219607843137255,0.568627450980392,0.752941176470588;0.211764705882353,0.564705882352941,0.752941176470588;0.203921568627451,0.560784313725490,0.745098039215686;0.200000000000000,0.560784313725490,0.741176470588235;0.192156862745098,0.556862745098039,0.733333333333333;0.188235294117647,0.556862745098039,0.725490196078431;0.180392156862745,0.552941176470588,0.721568627450980;0.172549019607843,0.552941176470588,0.713725490196078;0.168627450980392,0.549019607843137,0.705882352941177;0.156862745098039,0.549019607843137,0.698039215686275;0.152941176470588,0.545098039215686,0.694117647058824;0.141176470588235,0.545098039215686,0.682352941176471;0.141176470588235,0.545098039215686,0.682352941176471;0.137254901960784,0.541176470588235,0.674509803921569;0.125490196078431,0.537254901960784,0.662745098039216;0.121568627450980,0.537254901960784,0.658823529411765;0.109803921568627,0.533333333333333,0.647058823529412;0.105882352941176,0.533333333333333,0.643137254901961;0.0980392156862745,0.529411764705882,0.635294117647059;0.0901960784313726,0.529411764705882,0.627450980392157;0.0901960784313726,0.529411764705882,0.627450980392157;0.0784313725490196,0.525490196078431,0.615686274509804;0.0745098039215686,0.521568627450980,0.611764705882353;0.0666666666666667,0.521568627450980,0.600000000000000;0.0588235294117647,0.517647058823530,0.592156862745098;0.0509803921568627,0.517647058823530,0.588235294117647;0.0470588235294118,0.513725490196078,0.580392156862745;0.0392156862745098,0.513725490196078,0.572549019607843;0.0313725490196078,0.513725490196078,0.568627450980392;0.0274509803921569,0.509803921568627,0.560784313725490;0.0196078431372549,0.509803921568627,0.552941176470588;0.0156862745098039,0.505882352941176,0.549019607843137;0.00784313725490196,0.505882352941176,0.541176470588235;0.00392156862745098,0.501960784313726,0.533333333333333;0.00392156862745098,0.498039215686275,0.529411764705882;0.00392156862745098,0.494117647058824,0.517647058823530;0.00392156862745098,0.494117647058824,0.517647058823530;0.00392156862745098,0.490196078431373,0.509803921568627;0.00392156862745098,0.486274509803922,0.501960784313726;0.00392156862745098,0.486274509803922,0.498039215686275;0.00392156862745098,0.482352941176471,0.486274509803922;0.00392156862745098,0.482352941176471,0.486274509803922;0.00392156862745098,0.474509803921569,0.474509803921569;0.00392156862745098,0.474509803921569,0.466666666666667;0.00392156862745098,0.470588235294118,0.462745098039216;0.00392156862745098,0.466666666666667,0.454901960784314;0.00392156862745098,0.466666666666667,0.450980392156863;0.00392156862745098,0.462745098039216,0.443137254901961;0.00392156862745098,0.458823529411765,0.439215686274510;0.00392156862745098,0.458823529411765,0.431372549019608;0.00392156862745098,0.454901960784314,0.427450980392157;0.00392156862745098,0.450980392156863,0.419607843137255;0.00392156862745098,0.450980392156863,0.415686274509804;0.00392156862745098,0.447058823529412,0.407843137254902;0.00392156862745098,0.447058823529412,0.403921568627451;0.00392156862745098,0.443137254901961,0.396078431372549;0.00392156862745098,0.439215686274510,0.388235294117647;0.00392156862745098,0.439215686274510,0.380392156862745;0.00392156862745098,0.435294117647059,0.376470588235294;0.00392156862745098,0.431372549019608,0.364705882352941;0.00392156862745098,0.431372549019608,0.364705882352941;0.00392156862745098,0.427450980392157,0.360784313725490;0.00392156862745098,0.423529411764706,0.349019607843137;0.00392156862745098,0.423529411764706,0.349019607843137;0.00392156862745098,0.411764705882353,0.337254901960784;0.00392156862745098,0.407843137254902,0.333333333333333;0.00392156862745098,0.403921568627451,0.329411764705882;0.00392156862745098,0.400000000000000,0.325490196078431;0.00392156862745098,0.392156862745098,0.321568627450980;0.00392156862745098,0.388235294117647,0.317647058823529;0.00392156862745098,0.384313725490196,0.313725490196078;0.00392156862745098,0.380392156862745,0.309803921568627;0.00392156862745098,0.376470588235294,0.305882352941177;0.00392156862745098,0.372549019607843,0.301960784313725;0.00392156862745098,0.364705882352941,0.294117647058824;0.00392156862745098,0.360784313725490,0.290196078431373;0.00392156862745098,0.356862745098039,0.286274509803922;0.00392156862745098,0.352941176470588,0.282352941176471;0.00392156862745098,0.349019607843137,0.278431372549020;0.00392156862745098,0.341176470588235,0.274509803921569;0.00392156862745098,0.337254901960784,0.270588235294118;0.00392156862745098,0.329411764705882,0.262745098039216;0.00392156862745098,0.329411764705882,0.262745098039216;0.00392156862745098,0.317647058823529,0.250980392156863;0.00392156862745098,0.317647058823529,0.250980392156863;0.00392156862745098,0.313725490196078,0.247058823529412;0.00392156862745098,0.305882352941177,0.239215686274510;0.00392156862745098,0.305882352941177,0.239215686274510;0.00392156862745098,0.294117647058824,0.231372549019608;0.00392156862745098,0.290196078431373,0.227450980392157;0.00392156862745098,0.286274509803922,0.223529411764706;0.00392156862745098,0.282352941176471,0.219607843137255;0.00392156862745098,0.278431372549020,0.215686274509804;0.00392156862745098,0.278431372549020,0.215686274509804]; + [0.964705882352941,0.984313725490196,0.988235294117647;0.960784313725490,0.984313725490196,0.988235294117647;0.960784313725490,0.984313725490196,0.988235294117647;0.956862745098039,0.984313725490196,0.988235294117647;0.956862745098039,0.980392156862745,0.988235294117647;0.952941176470588,0.980392156862745,0.988235294117647;0.952941176470588,0.980392156862745,0.988235294117647;0.949019607843137,0.980392156862745,0.984313725490196;0.945098039215686,0.980392156862745,0.984313725490196;0.945098039215686,0.976470588235294,0.984313725490196;0.941176470588235,0.976470588235294,0.984313725490196;0.941176470588235,0.976470588235294,0.984313725490196;0.937254901960784,0.976470588235294,0.984313725490196;0.937254901960784,0.972549019607843,0.984313725490196;0.929411764705882,0.972549019607843,0.980392156862745;0.929411764705882,0.972549019607843,0.980392156862745;0.925490196078431,0.972549019607843,0.980392156862745;0.925490196078431,0.968627450980392,0.980392156862745;0.925490196078431,0.968627450980392,0.980392156862745;0.921568627450980,0.968627450980392,0.980392156862745;0.921568627450980,0.968627450980392,0.980392156862745;0.917647058823529,0.964705882352941,0.980392156862745;0.913725490196078,0.964705882352941,0.976470588235294;0.909803921568627,0.964705882352941,0.976470588235294;0.909803921568627,0.964705882352941,0.976470588235294;0.905882352941177,0.964705882352941,0.976470588235294;0.905882352941177,0.960784313725490,0.976470588235294;0.901960784313726,0.960784313725490,0.976470588235294;0.901960784313726,0.960784313725490,0.976470588235294;0.898039215686275,0.960784313725490,0.976470588235294;0.894117647058824,0.956862745098039,0.972549019607843;0.894117647058824,0.956862745098039,0.972549019607843;0.890196078431373,0.956862745098039,0.968627450980392;0.886274509803922,0.956862745098039,0.968627450980392;0.882352941176471,0.952941176470588,0.964705882352941;0.878431372549020,0.952941176470588,0.960784313725490;0.874509803921569,0.949019607843137,0.956862745098039;0.874509803921569,0.949019607843137,0.956862745098039;0.866666666666667,0.949019607843137,0.952941176470588;0.866666666666667,0.949019607843137,0.952941176470588;0.862745098039216,0.945098039215686,0.949019607843137;0.858823529411765,0.945098039215686,0.945098039215686;0.858823529411765,0.945098039215686,0.945098039215686;0.850980392156863,0.945098039215686,0.941176470588235;0.850980392156863,0.941176470588235,0.937254901960784;0.847058823529412,0.941176470588235,0.937254901960784;0.843137254901961,0.941176470588235,0.933333333333333;0.839215686274510,0.937254901960784,0.933333333333333;0.839215686274510,0.937254901960784,0.929411764705882;0.835294117647059,0.937254901960784,0.929411764705882;0.831372549019608,0.937254901960784,0.925490196078431;0.827450980392157,0.933333333333333,0.921568627450980;0.823529411764706,0.933333333333333,0.921568627450980;0.823529411764706,0.933333333333333,0.917647058823529;0.819607843137255,0.929411764705882,0.917647058823529;0.815686274509804,0.929411764705882,0.913725490196078;0.811764705882353,0.929411764705882,0.909803921568627;0.807843137254902,0.929411764705882,0.909803921568627;0.807843137254902,0.925490196078431,0.905882352941177;0.803921568627451,0.925490196078431,0.905882352941177;0.796078431372549,0.921568627450980,0.898039215686275;0.796078431372549,0.921568627450980,0.898039215686275;0.784313725490196,0.917647058823529,0.890196078431373;0.780392156862745,0.917647058823529,0.890196078431373;0.772549019607843,0.913725490196078,0.886274509803922;0.764705882352941,0.909803921568627,0.882352941176471;0.764705882352941,0.909803921568627,0.882352941176471;0.752941176470588,0.905882352941177,0.874509803921569;0.749019607843137,0.901960784313726,0.870588235294118;0.741176470588235,0.901960784313726,0.866666666666667;0.733333333333333,0.898039215686275,0.862745098039216;0.729411764705882,0.894117647058824,0.858823529411765;0.721568627450980,0.894117647058824,0.854901960784314;0.713725490196078,0.890196078431373,0.850980392156863;0.709803921568628,0.890196078431373,0.850980392156863;0.701960784313725,0.886274509803922,0.847058823529412;0.698039215686275,0.882352941176471,0.843137254901961;0.690196078431373,0.882352941176471,0.839215686274510;0.682352941176471,0.878431372549020,0.835294117647059;0.674509803921569,0.874509803921569,0.831372549019608;0.670588235294118,0.874509803921569,0.827450980392157;0.666666666666667,0.870588235294118,0.823529411764706;0.658823529411765,0.870588235294118,0.819607843137255;0.650980392156863,0.866666666666667,0.815686274509804;0.643137254901961,0.862745098039216,0.811764705882353;0.639215686274510,0.862745098039216,0.811764705882353;0.627450980392157,0.854901960784314,0.803921568627451;0.623529411764706,0.854901960784314,0.803921568627451;0.615686274509804,0.850980392156863,0.796078431372549;0.607843137254902,0.850980392156863,0.792156862745098;0.607843137254902,0.850980392156863,0.792156862745098;0.596078431372549,0.843137254901961,0.784313725490196;0.588235294117647,0.843137254901961,0.780392156862745;0.584313725490196,0.839215686274510,0.776470588235294;0.576470588235294,0.835294117647059,0.772549019607843;0.572549019607843,0.831372549019608,0.764705882352941;0.564705882352941,0.831372549019608,0.760784313725490;0.556862745098039,0.827450980392157,0.756862745098039;0.552941176470588,0.823529411764706,0.752941176470588;0.545098039215686,0.823529411764706,0.749019607843137;0.541176470588235,0.819607843137255,0.745098039215686;0.533333333333333,0.815686274509804,0.737254901960784;0.525490196078431,0.815686274509804,0.733333333333333;0.517647058823530,0.807843137254902,0.725490196078431;0.513725490196078,0.807843137254902,0.725490196078431;0.501960784313726,0.803921568627451,0.717647058823529;0.501960784313726,0.803921568627451,0.717647058823529;0.494117647058824,0.800000000000000,0.709803921568628;0.482352941176471,0.796078431372549,0.701960784313725;0.482352941176471,0.796078431372549,0.701960784313725;0.470588235294118,0.788235294117647,0.694117647058824;0.466666666666667,0.788235294117647,0.690196078431373;0.458823529411765,0.784313725490196,0.686274509803922;0.450980392156863,0.780392156862745,0.678431372549020;0.450980392156863,0.780392156862745,0.678431372549020;0.439215686274510,0.776470588235294,0.670588235294118;0.431372549019608,0.772549019607843,0.666666666666667;0.427450980392157,0.772549019607843,0.662745098039216;0.419607843137255,0.768627450980392,0.658823529411765;0.415686274509804,0.764705882352941,0.650980392156863;0.407843137254902,0.764705882352941,0.647058823529412;0.400000000000000,0.760784313725490,0.643137254901961;0.396078431372549,0.756862745098039,0.639215686274510;0.392156862745098,0.756862745098039,0.631372549019608;0.388235294117647,0.752941176470588,0.627450980392157;0.380392156862745,0.749019607843137,0.619607843137255;0.376470588235294,0.749019607843137,0.615686274509804;0.368627450980392,0.741176470588235,0.607843137254902;0.368627450980392,0.741176470588235,0.603921568627451;0.360784313725490,0.737254901960784,0.592156862745098;0.356862745098039,0.737254901960784,0.592156862745098;0.352941176470588,0.737254901960784,0.588235294117647;0.345098039215686,0.729411764705882,0.576470588235294;0.345098039215686,0.729411764705882,0.576470588235294;0.337254901960784,0.725490196078431,0.564705882352941;0.333333333333333,0.721568627450980,0.560784313725490;0.329411764705882,0.721568627450980,0.552941176470588;0.321568627450980,0.717647058823529,0.549019607843137;0.317647058823529,0.717647058823529,0.541176470588235;0.313725490196078,0.713725490196078,0.537254901960784;0.309803921568627,0.709803921568628,0.529411764705882;0.305882352941177,0.709803921568628,0.525490196078431;0.301960784313725,0.705882352941177,0.517647058823530;0.294117647058824,0.701960784313725,0.513725490196078;0.290196078431373,0.701960784313725,0.509803921568627;0.286274509803922,0.698039215686275,0.501960784313726;0.282352941176471,0.698039215686275,0.498039215686275;0.278431372549020,0.694117647058824,0.490196078431373;0.274509803921569,0.690196078431373,0.486274509803922;0.266666666666667,0.690196078431373,0.478431372549020;0.262745098039216,0.686274509803922,0.474509803921569;0.254901960784314,0.682352941176471,0.462745098039216;0.254901960784314,0.682352941176471,0.462745098039216;0.247058823529412,0.674509803921569,0.450980392156863;0.247058823529412,0.674509803921569,0.447058823529412;0.243137254901961,0.670588235294118,0.443137254901961;0.235294117647059,0.658823529411765,0.431372549019608;0.235294117647059,0.658823529411765,0.431372549019608;0.227450980392157,0.650980392156863,0.419607843137255;0.223529411764706,0.647058823529412,0.415686274509804;0.219607843137255,0.643137254901961,0.407843137254902;0.215686274509804,0.639215686274510,0.403921568627451;0.215686274509804,0.635294117647059,0.396078431372549;0.211764705882353,0.631372549019608,0.392156862745098;0.207843137254902,0.627450980392157,0.384313725490196;0.203921568627451,0.623529411764706,0.380392156862745;0.200000000000000,0.615686274509804,0.372549019607843;0.196078431372549,0.611764705882353,0.364705882352941;0.192156862745098,0.607843137254902,0.360784313725490;0.188235294117647,0.603921568627451,0.352941176470588;0.184313725490196,0.600000000000000,0.349019607843137;0.180392156862745,0.596078431372549,0.341176470588235;0.176470588235294,0.592156862745098,0.337254901960784;0.172549019607843,0.588235294117647,0.329411764705882;0.168627450980392,0.584313725490196,0.325490196078431;0.160784313725490,0.572549019607843,0.313725490196078;0.160784313725490,0.572549019607843,0.313725490196078;0.152941176470588,0.564705882352941,0.301960784313725;0.152941176470588,0.560784313725490,0.298039215686275;0.152941176470588,0.560784313725490,0.294117647058824;0.145098039215686,0.552941176470588,0.282352941176471;0.145098039215686,0.552941176470588,0.282352941176471;0.137254901960784,0.545098039215686,0.270588235294118;0.133333333333333,0.541176470588235,0.266666666666667;0.129411764705882,0.537254901960784,0.262745098039216;0.121568627450980,0.533333333333333,0.258823529411765;0.117647058823529,0.529411764705882,0.258823529411765;0.113725490196078,0.525490196078431,0.254901960784314;0.109803921568627,0.521568627450980,0.250980392156863;0.105882352941176,0.517647058823530,0.247058823529412;0.101960784313725,0.513725490196078,0.243137254901961;0.0980392156862745,0.509803921568627,0.243137254901961;0.0941176470588235,0.505882352941176,0.239215686274510;0.0901960784313726,0.501960784313726,0.235294117647059;0.0823529411764706,0.494117647058824,0.227450980392157;0.0823529411764706,0.494117647058824,0.227450980392157;0.0745098039215686,0.494117647058824,0.227450980392157;0.0705882352941177,0.490196078431373,0.223529411764706;0.0666666666666667,0.486274509803922,0.219607843137255;0.0588235294117647,0.478431372549020,0.215686274509804;0.0588235294117647,0.478431372549020,0.215686274509804;0.0509803921568627,0.470588235294118,0.207843137254902;0.0470588235294118,0.466666666666667,0.203921568627451;0.0470588235294118,0.466666666666667,0.203921568627451;0.0392156862745098,0.458823529411765,0.200000000000000;0.0352941176470588,0.458823529411765,0.200000000000000;0.0274509803921569,0.450980392156863,0.192156862745098;0.0235294117647059,0.447058823529412,0.188235294117647;0.0196078431372549,0.443137254901961,0.188235294117647;0.0156862745098039,0.439215686274510,0.184313725490196;0.0117647058823529,0.435294117647059,0.180392156862745;0.00784313725490196,0.435294117647059,0.176470588235294;0.00392156862745098,0.431372549019608,0.172549019607843;0,0.427450980392157,0.172549019607843;0,0.419607843137255,0.168627450980392;0,0.415686274509804,0.168627450980392;0,0.411764705882353,0.164705882352941;0,0.407843137254902,0.160784313725490;0,0.396078431372549,0.156862745098039;0,0.396078431372549,0.156862745098039;0,0.392156862745098,0.156862745098039;0,0.384313725490196,0.152941176470588;0,0.380392156862745,0.152941176470588;0,0.372549019607843,0.149019607843137;0,0.372549019607843,0.149019607843137;0,0.360784313725490,0.145098039215686;0,0.356862745098039,0.141176470588235;0,0.356862745098039,0.141176470588235;0,0.345098039215686,0.137254901960784;0,0.345098039215686,0.137254901960784;0,0.337254901960784,0.133333333333333;0,0.329411764705882,0.129411764705882;0,0.325490196078431,0.129411764705882;0,0.321568627450980,0.125490196078431;0,0.313725490196078,0.125490196078431;0,0.309803921568627,0.121568627450980;0,0.305882352941177,0.121568627450980;0,0.301960784313725,0.117647058823529;0,0.294117647058824,0.117647058823529;0,0.290196078431373,0.113725490196078;0,0.286274509803922,0.113725490196078;0,0.278431372549020,0.109803921568627;0,0.270588235294118,0.105882352941176;0,0.270588235294118,0.105882352941176;0,0.270588235294118,0.105882352941176]; + [0.996078431372549,0.996078431372549,0.890196078431373;0.996078431372549,0.996078431372549,0.886274509803922;0.996078431372549,0.996078431372549,0.878431372549020;0.992156862745098,0.996078431372549,0.870588235294118;0.992156862745098,0.996078431372549,0.870588235294118;0.992156862745098,0.996078431372549,0.858823529411765;0.988235294117647,0.996078431372549,0.854901960784314;0.988235294117647,0.996078431372549,0.847058823529412;0.988235294117647,0.996078431372549,0.843137254901961;0.988235294117647,0.996078431372549,0.839215686274510;0.984313725490196,0.992156862745098,0.831372549019608;0.984313725490196,0.992156862745098,0.827450980392157;0.984313725490196,0.992156862745098,0.819607843137255;0.984313725490196,0.992156862745098,0.815686274509804;0.980392156862745,0.992156862745098,0.807843137254902;0.980392156862745,0.992156862745098,0.803921568627451;0.980392156862745,0.992156862745098,0.800000000000000;0.980392156862745,0.992156862745098,0.792156862745098;0.976470588235294,0.992156862745098,0.788235294117647;0.976470588235294,0.992156862745098,0.784313725490196;0.976470588235294,0.988235294117647,0.776470588235294;0.976470588235294,0.988235294117647,0.772549019607843;0.972549019607843,0.988235294117647,0.760784313725490;0.972549019607843,0.988235294117647,0.760784313725490;0.972549019607843,0.988235294117647,0.756862745098039;0.972549019607843,0.988235294117647,0.749019607843137;0.968627450980392,0.988235294117647,0.745098039215686;0.968627450980392,0.988235294117647,0.733333333333333;0.968627450980392,0.988235294117647,0.733333333333333;0.964705882352941,0.984313725490196,0.721568627450980;0.960784313725490,0.984313725490196,0.721568627450980;0.960784313725490,0.984313725490196,0.717647058823529;0.956862745098039,0.980392156862745,0.713725490196078;0.956862745098039,0.980392156862745,0.713725490196078;0.949019607843137,0.980392156862745,0.709803921568628;0.945098039215686,0.976470588235294,0.705882352941177;0.941176470588235,0.976470588235294,0.705882352941177;0.937254901960784,0.972549019607843,0.701960784313725;0.933333333333333,0.972549019607843,0.698039215686275;0.929411764705882,0.972549019607843,0.698039215686275;0.925490196078431,0.968627450980392,0.694117647058824;0.921568627450980,0.968627450980392,0.690196078431373;0.917647058823529,0.968627450980392,0.686274509803922;0.913725490196078,0.964705882352941,0.686274509803922;0.909803921568627,0.964705882352941,0.682352941176471;0.905882352941177,0.960784313725490,0.678431372549020;0.898039215686275,0.960784313725490,0.674509803921569;0.898039215686275,0.960784313725490,0.674509803921569;0.898039215686275,0.956862745098039,0.670588235294118;0.894117647058824,0.956862745098039,0.670588235294118;0.890196078431373,0.956862745098039,0.666666666666667;0.882352941176471,0.952941176470588,0.662745098039216;0.882352941176471,0.952941176470588,0.662745098039216;0.874509803921569,0.949019607843137,0.654901960784314;0.870588235294118,0.949019607843137,0.650980392156863;0.866666666666667,0.945098039215686,0.650980392156863;0.862745098039216,0.945098039215686,0.647058823529412;0.862745098039216,0.945098039215686,0.647058823529412;0.854901960784314,0.941176470588235,0.643137254901961;0.850980392156863,0.941176470588235,0.639215686274510;0.847058823529412,0.937254901960784,0.635294117647059;0.843137254901961,0.937254901960784,0.635294117647059;0.835294117647059,0.933333333333333,0.631372549019608;0.831372549019608,0.933333333333333,0.627450980392157;0.827450980392157,0.929411764705882,0.627450980392157;0.819607843137255,0.925490196078431,0.623529411764706;0.815686274509804,0.925490196078431,0.619607843137255;0.807843137254902,0.921568627450980,0.619607843137255;0.803921568627451,0.921568627450980,0.615686274509804;0.800000000000000,0.917647058823529,0.611764705882353;0.788235294117647,0.913725490196078,0.607843137254902;0.788235294117647,0.913725490196078,0.607843137254902;0.776470588235294,0.909803921568627,0.603921568627451;0.772549019607843,0.905882352941177,0.600000000000000;0.772549019607843,0.905882352941177,0.600000000000000;0.760784313725490,0.901960784313726,0.596078431372549;0.760784313725490,0.901960784313726,0.596078431372549;0.749019607843137,0.898039215686275,0.588235294117647;0.745098039215686,0.894117647058824,0.588235294117647;0.741176470588235,0.890196078431373,0.584313725490196;0.733333333333333,0.890196078431373,0.584313725490196;0.729411764705882,0.886274509803922,0.580392156862745;0.721568627450980,0.886274509803922,0.576470588235294;0.717647058823529,0.882352941176471,0.576470588235294;0.713725490196078,0.878431372549020,0.572549019607843;0.705882352941177,0.878431372549020,0.568627450980392;0.701960784313725,0.874509803921569,0.568627450980392;0.698039215686275,0.874509803921569,0.564705882352941;0.690196078431373,0.870588235294118,0.560784313725490;0.686274509803922,0.866666666666667,0.560784313725490;0.678431372549020,0.866666666666667,0.556862745098039;0.674509803921569,0.862745098039216,0.552941176470588;0.666666666666667,0.862745098039216,0.552941176470588;0.662745098039216,0.858823529411765,0.549019607843137;0.647058823529412,0.850980392156863,0.545098039215686;0.647058823529412,0.850980392156863,0.545098039215686;0.635294117647059,0.847058823529412,0.537254901960784;0.631372549019608,0.843137254901961,0.537254901960784;0.627450980392157,0.843137254901961,0.537254901960784;0.615686274509804,0.839215686274510,0.529411764705882;0.611764705882353,0.839215686274510,0.529411764705882;0.603921568627451,0.831372549019608,0.525490196078431;0.596078431372549,0.831372549019608,0.521568627450980;0.588235294117647,0.827450980392157,0.521568627450980;0.584313725490196,0.823529411764706,0.517647058823530;0.576470588235294,0.819607843137255,0.513725490196078;0.568627450980392,0.819607843137255,0.513725490196078;0.564705882352941,0.815686274509804,0.509803921568627;0.556862745098039,0.811764705882353,0.505882352941176;0.549019607843137,0.811764705882353,0.505882352941176;0.545098039215686,0.807843137254902,0.501960784313726;0.537254901960784,0.803921568627451,0.498039215686275;0.529411764705882,0.800000000000000,0.498039215686275;0.525490196078431,0.800000000000000,0.494117647058824;0.517647058823530,0.796078431372549,0.490196078431373;0.509803921568627,0.792156862745098,0.490196078431373;0.501960784313726,0.788235294117647,0.486274509803922;0.498039215686275,0.788235294117647,0.482352941176471;0.486274509803922,0.780392156862745,0.478431372549020;0.486274509803922,0.780392156862745,0.478431372549020;0.470588235294118,0.776470588235294,0.474509803921569;0.466666666666667,0.772549019607843,0.470588235294118;0.466666666666667,0.772549019607843,0.470588235294118;0.450980392156863,0.764705882352941,0.462745098039216;0.447058823529412,0.764705882352941,0.462745098039216;0.439215686274510,0.760784313725490,0.458823529411765;0.431372549019608,0.756862745098039,0.454901960784314;0.423529411764706,0.752941176470588,0.450980392156863;0.419607843137255,0.749019607843137,0.447058823529412;0.411764705882353,0.745098039215686,0.443137254901961;0.403921568627451,0.741176470588235,0.439215686274510;0.396078431372549,0.741176470588235,0.435294117647059;0.392156862745098,0.737254901960784,0.431372549019608;0.384313725490196,0.733333333333333,0.431372549019608;0.376470588235294,0.729411764705882,0.427450980392157;0.368627450980392,0.725490196078431,0.423529411764706;0.364705882352941,0.721568627450980,0.419607843137255;0.349019607843137,0.717647058823529,0.411764705882353;0.349019607843137,0.717647058823529,0.411764705882353;0.345098039215686,0.713725490196078,0.407843137254902;0.333333333333333,0.705882352941177,0.400000000000000;0.329411764705882,0.705882352941177,0.400000000000000;0.317647058823529,0.698039215686275,0.396078431372549;0.317647058823529,0.698039215686275,0.396078431372549;0.301960784313725,0.694117647058824,0.388235294117647;0.294117647058824,0.690196078431373,0.384313725490196;0.294117647058824,0.690196078431373,0.384313725490196;0.282352941176471,0.682352941176471,0.376470588235294;0.278431372549020,0.678431372549020,0.372549019607843;0.270588235294118,0.678431372549020,0.372549019607843;0.262745098039216,0.674509803921569,0.368627450980392;0.254901960784314,0.670588235294118,0.364705882352941;0.250980392156863,0.666666666666667,0.360784313725490;0.247058823529412,0.662745098039216,0.356862745098039;0.243137254901961,0.654901960784314,0.352941176470588;0.239215686274510,0.650980392156863,0.352941176470588;0.235294117647059,0.647058823529412,0.349019607843137;0.231372549019608,0.643137254901961,0.345098039215686;0.227450980392157,0.635294117647059,0.341176470588235;0.223529411764706,0.631372549019608,0.337254901960784;0.219607843137255,0.627450980392157,0.333333333333333;0.215686274509804,0.619607843137255,0.329411764705882;0.215686274509804,0.619607843137255,0.329411764705882;0.211764705882353,0.611764705882353,0.325490196078431;0.203921568627451,0.603921568627451,0.317647058823529;0.203921568627451,0.603921568627451,0.317647058823529;0.196078431372549,0.592156862745098,0.313725490196078;0.196078431372549,0.592156862745098,0.313725490196078;0.188235294117647,0.584313725490196,0.305882352941177;0.184313725490196,0.580392156862745,0.301960784313725;0.184313725490196,0.580392156862745,0.301960784313725;0.176470588235294,0.568627450980392,0.298039215686275;0.172549019607843,0.564705882352941,0.294117647058824;0.168627450980392,0.560784313725490,0.290196078431373;0.164705882352941,0.556862745098039,0.286274509803922;0.160784313725490,0.549019607843137,0.282352941176471;0.156862745098039,0.545098039215686,0.282352941176471;0.152941176470588,0.541176470588235,0.278431372549020;0.152941176470588,0.537254901960784,0.274509803921569;0.149019607843137,0.529411764705882,0.270588235294118;0.145098039215686,0.525490196078431,0.266666666666667;0.141176470588235,0.521568627450980,0.266666666666667;0.137254901960784,0.517647058823530,0.262745098039216;0.133333333333333,0.513725490196078,0.258823529411765;0.129411764705882,0.509803921568627,0.258823529411765;0.117647058823529,0.501960784313726,0.254901960784314;0.117647058823529,0.501960784313726,0.254901960784314;0.113725490196078,0.498039215686275,0.254901960784314;0.105882352941176,0.494117647058824,0.250980392156863;0.105882352941176,0.494117647058824,0.250980392156863;0.0980392156862745,0.486274509803922,0.247058823529412;0.0980392156862745,0.486274509803922,0.247058823529412;0.0901960784313726,0.478431372549020,0.243137254901961;0.0862745098039216,0.474509803921569,0.243137254901961;0.0823529411764706,0.470588235294118,0.243137254901961;0.0745098039215686,0.466666666666667,0.239215686274510;0.0705882352941177,0.466666666666667,0.239215686274510;0.0666666666666667,0.462745098039216,0.239215686274510;0.0627450980392157,0.458823529411765,0.235294117647059;0.0588235294117647,0.454901960784314,0.235294117647059;0.0549019607843137,0.450980392156863,0.231372549019608;0.0509803921568627,0.447058823529412,0.231372549019608;0.0470588235294118,0.443137254901961,0.231372549019608;0.0431372549019608,0.439215686274510,0.227450980392157;0.0392156862745098,0.439215686274510,0.227450980392157;0.0313725490196078,0.435294117647059,0.227450980392157;0.0274509803921569,0.431372549019608,0.223529411764706;0.0235294117647059,0.427450980392157,0.223529411764706;0.0196078431372549,0.423529411764706,0.219607843137255;0.0117647058823529,0.415686274509804,0.219607843137255;0.0117647058823529,0.415686274509804,0.219607843137255;0.00784313725490196,0.411764705882353,0.215686274509804;0,0.407843137254902,0.215686274509804;0,0.407843137254902,0.215686274509804;0,0.396078431372549,0.211764705882353;0,0.392156862745098,0.207843137254902;0,0.388235294117647,0.207843137254902;0,0.384313725490196,0.203921568627451;0,0.380392156862745,0.203921568627451;0,0.376470588235294,0.200000000000000;0,0.372549019607843,0.200000000000000;0,0.368627450980392,0.200000000000000;0,0.364705882352941,0.196078431372549;0,0.360784313725490,0.196078431372549;0,0.352941176470588,0.192156862745098;0,0.349019607843137,0.192156862745098;0,0.345098039215686,0.188235294117647;0,0.341176470588235,0.188235294117647;0,0.337254901960784,0.188235294117647;0,0.333333333333333,0.184313725490196;0,0.329411764705882,0.184313725490196;0,0.321568627450980,0.180392156862745;0,0.321568627450980,0.180392156862745;0,0.309803921568627,0.176470588235294;0,0.309803921568627,0.176470588235294;0,0.305882352941177,0.172549019607843;0,0.298039215686275,0.172549019607843;0,0.298039215686275,0.172549019607843;0,0.290196078431373,0.168627450980392;0,0.286274509803922,0.164705882352941;0,0.282352941176471,0.164705882352941;0,0.278431372549020,0.160784313725490;0,0.274509803921569,0.160784313725490;0,0.274509803921569,0.160784313725490]; + [0.556862745098039,0.00392156862745098,0.321568627450980;0.564705882352941,0.00784313725490196,0.325490196078431;0.568627450980392,0.00784313725490196,0.329411764705882;0.580392156862745,0.0156862745098039,0.341176470588235;0.588235294117647,0.0196078431372549,0.345098039215686;0.596078431372549,0.0235294117647059,0.352941176470588;0.611764705882353,0.0313725490196078,0.364705882352941;0.615686274509804,0.0313725490196078,0.364705882352941;0.631372549019608,0.0392156862745098,0.380392156862745;0.639215686274510,0.0431372549019608,0.384313725490196;0.643137254901961,0.0470588235294118,0.388235294117647;0.654901960784314,0.0509803921568627,0.400000000000000;0.666666666666667,0.0549019607843137,0.403921568627451;0.674509803921569,0.0588235294117647,0.411764705882353;0.690196078431373,0.0666666666666667,0.423529411764706;0.694117647058824,0.0666666666666667,0.427450980392157;0.705882352941177,0.0745098039215686,0.439215686274510;0.713725490196078,0.0784313725490196,0.447058823529412;0.725490196078431,0.0823529411764706,0.450980392156863;0.733333333333333,0.0862745098039216,0.458823529411765;0.741176470588235,0.0901960784313726,0.466666666666667;0.749019607843137,0.0941176470588235,0.470588235294118;0.764705882352941,0.101960784313725,0.486274509803922;0.772549019607843,0.109803921568627,0.490196078431373;0.772549019607843,0.117647058823529,0.494117647058824;0.780392156862745,0.141176470588235,0.505882352941176;0.784313725490196,0.152941176470588,0.513725490196078;0.788235294117647,0.168627450980392,0.521568627450980;0.796078431372549,0.188235294117647,0.533333333333333;0.796078431372549,0.196078431372549,0.537254901960784;0.803921568627451,0.223529411764706,0.552941176470588;0.807843137254902,0.239215686274510,0.560784313725490;0.811764705882353,0.250980392156863,0.568627450980392;0.815686274509804,0.266666666666667,0.576470588235294;0.819607843137255,0.282352941176471,0.584313725490196;0.823529411764706,0.294117647058824,0.588235294117647;0.831372549019608,0.321568627450980,0.603921568627451;0.835294117647059,0.329411764705882,0.607843137254902;0.839215686274510,0.352941176470588,0.619607843137255;0.843137254901961,0.364705882352941,0.627450980392157;0.847058823529412,0.380392156862745,0.635294117647059;0.850980392156863,0.392156862745098,0.643137254901961;0.854901960784314,0.411764705882353,0.654901960784314;0.858823529411765,0.423529411764706,0.658823529411765;0.866666666666667,0.450980392156863,0.674509803921569;0.870588235294118,0.466666666666667,0.682352941176471;0.870588235294118,0.470588235294118,0.682352941176471;0.874509803921569,0.482352941176471,0.694117647058824;0.878431372549020,0.494117647058824,0.701960784313725;0.878431372549020,0.501960784313726,0.705882352941177;0.886274509803922,0.517647058823530,0.717647058823529;0.886274509803922,0.525490196078431,0.721568627450980;0.890196078431373,0.541176470588235,0.733333333333333;0.894117647058824,0.552941176470588,0.741176470588235;0.898039215686275,0.560784313725490,0.749019607843137;0.901960784313726,0.572549019607843,0.752941176470588;0.901960784313726,0.580392156862745,0.760784313725490;0.905882352941177,0.592156862745098,0.768627450980392;0.913725490196078,0.611764705882353,0.780392156862745;0.913725490196078,0.615686274509804,0.784313725490196;0.917647058823529,0.631372549019608,0.796078431372549;0.921568627450980,0.639215686274510,0.803921568627451;0.925490196078431,0.647058823529412,0.807843137254902;0.925490196078431,0.658823529411765,0.815686274509804;0.929411764705882,0.670588235294118,0.823529411764706;0.933333333333333,0.678431372549020,0.827450980392157;0.937254901960784,0.698039215686275,0.843137254901961;0.941176470588235,0.705882352941177,0.850980392156863;0.945098039215686,0.713725490196078,0.854901960784314;0.945098039215686,0.721568627450980,0.858823529411765;0.949019607843137,0.729411764705882,0.862745098039216;0.949019607843137,0.733333333333333,0.862745098039216;0.952941176470588,0.749019607843137,0.870588235294118;0.952941176470588,0.749019607843137,0.870588235294118;0.956862745098039,0.760784313725490,0.878431372549020;0.960784313725490,0.764705882352941,0.882352941176471;0.960784313725490,0.772549019607843,0.882352941176471;0.960784313725490,0.780392156862745,0.886274509803922;0.964705882352941,0.784313725490196,0.890196078431373;0.964705882352941,0.792156862745098,0.894117647058824;0.968627450980392,0.803921568627451,0.898039215686275;0.972549019607843,0.807843137254902,0.901960784313726;0.972549019607843,0.819607843137255,0.905882352941177;0.976470588235294,0.823529411764706,0.909803921568627;0.976470588235294,0.831372549019608,0.913725490196078;0.980392156862745,0.839215686274510,0.917647058823529;0.980392156862745,0.847058823529412,0.917647058823529;0.984313725490196,0.850980392156863,0.921568627450980;0.988235294117647,0.862745098039216,0.929411764705882;0.988235294117647,0.870588235294118,0.933333333333333;0.992156862745098,0.878431372549020,0.937254901960784;0.988235294117647,0.878431372549020,0.937254901960784;0.988235294117647,0.882352941176471,0.937254901960784;0.988235294117647,0.886274509803922,0.937254901960784;0.984313725490196,0.894117647058824,0.941176470588235;0.984313725490196,0.894117647058824,0.941176470588235;0.984313725490196,0.901960784313726,0.945098039215686;0.984313725490196,0.905882352941177,0.945098039215686;0.980392156862745,0.909803921568627,0.945098039215686;0.980392156862745,0.913725490196078,0.949019607843137;0.980392156862745,0.913725490196078,0.949019607843137;0.980392156862745,0.917647058823529,0.949019607843137;0.976470588235294,0.925490196078431,0.952941176470588;0.976470588235294,0.929411764705882,0.952941176470588;0.976470588235294,0.933333333333333,0.956862745098039;0.976470588235294,0.937254901960784,0.956862745098039;0.972549019607843,0.941176470588235,0.956862745098039;0.972549019607843,0.945098039215686,0.956862745098039;0.972549019607843,0.949019607843137,0.960784313725490;0.972549019607843,0.949019607843137,0.960784313725490;0.968627450980392,0.956862745098039,0.964705882352941;0.968627450980392,0.960784313725490,0.964705882352941;0.968627450980392,0.964705882352941,0.964705882352941;0.964705882352941,0.964705882352941,0.964705882352941;0.964705882352941,0.964705882352941,0.956862745098039;0.960784313725490,0.964705882352941,0.952941176470588;0.956862745098039,0.964705882352941,0.941176470588235;0.956862745098039,0.964705882352941,0.937254901960784;0.949019607843137,0.964705882352941,0.929411764705882;0.949019607843137,0.964705882352941,0.921568627450980;0.945098039215686,0.964705882352941,0.917647058823529;0.941176470588235,0.964705882352941,0.909803921568627;0.941176470588235,0.964705882352941,0.901960784313726;0.937254901960784,0.964705882352941,0.898039215686275;0.933333333333333,0.960784313725490,0.886274509803922;0.929411764705882,0.960784313725490,0.878431372549020;0.925490196078431,0.960784313725490,0.874509803921569;0.925490196078431,0.960784313725490,0.866666666666667;0.921568627450980,0.960784313725490,0.862745098039216;0.917647058823529,0.960784313725490,0.854901960784314;0.913725490196078,0.960784313725490,0.847058823529412;0.913725490196078,0.960784313725490,0.843137254901961;0.909803921568627,0.960784313725490,0.831372549019608;0.905882352941177,0.960784313725490,0.827450980392157;0.901960784313726,0.960784313725490,0.819607843137255;0.901960784313726,0.960784313725490,0.815686274509804;0.894117647058824,0.956862745098039,0.803921568627451;0.886274509803922,0.952941176470588,0.792156862745098;0.870588235294118,0.945098039215686,0.768627450980392;0.866666666666667,0.945098039215686,0.760784313725490;0.858823529411765,0.941176470588235,0.745098039215686;0.850980392156863,0.937254901960784,0.733333333333333;0.843137254901961,0.933333333333333,0.721568627450980;0.835294117647059,0.929411764705882,0.709803921568628;0.827450980392157,0.929411764705882,0.694117647058824;0.823529411764706,0.925490196078431,0.690196078431373;0.807843137254902,0.917647058823529,0.666666666666667;0.800000000000000,0.917647058823529,0.654901960784314;0.792156862745098,0.913725490196078,0.643137254901961;0.788235294117647,0.909803921568627,0.631372549019608;0.780392156862745,0.905882352941177,0.619607843137255;0.772549019607843,0.901960784313726,0.607843137254902;0.760784313725490,0.898039215686275,0.588235294117647;0.756862745098039,0.898039215686275,0.584313725490196;0.745098039215686,0.890196078431373,0.564705882352941;0.737254901960784,0.886274509803922,0.552941176470588;0.729411764705882,0.886274509803922,0.541176470588235;0.721568627450980,0.882352941176471,0.529411764705882;0.713725490196078,0.878431372549020,0.517647058823530;0.705882352941177,0.870588235294118,0.505882352941176;0.690196078431373,0.858823529411765,0.486274509803922;0.682352941176471,0.854901960784314,0.478431372549020;0.670588235294118,0.850980392156863,0.466666666666667;0.662745098039216,0.843137254901961,0.454901960784314;0.654901960784314,0.839215686274510,0.443137254901961;0.647058823529412,0.831372549019608,0.435294117647059;0.631372549019608,0.823529411764706,0.419607843137255;0.627450980392157,0.819607843137255,0.411764705882353;0.611764705882353,0.807843137254902,0.392156862745098;0.600000000000000,0.803921568627451,0.380392156862745;0.592156862745098,0.796078431372549,0.368627450980392;0.584313725490196,0.792156862745098,0.360784313725490;0.576470588235294,0.788235294117647,0.349019607843137;0.564705882352941,0.780392156862745,0.337254901960784;0.549019607843137,0.768627450980392,0.317647058823529;0.545098039215686,0.768627450980392,0.313725490196078;0.529411764705882,0.756862745098039,0.294117647058824;0.521568627450980,0.752941176470588,0.286274509803922;0.513725490196078,0.745098039215686,0.274509803921569;0.501960784313726,0.737254901960784,0.258823529411765;0.498039215686275,0.737254901960784,0.254901960784314;0.490196078431373,0.729411764705882,0.247058823529412;0.474509803921569,0.717647058823529,0.239215686274510;0.470588235294118,0.713725490196078,0.235294117647059;0.458823529411765,0.701960784313725,0.227450980392157;0.450980392156863,0.698039215686275,0.223529411764706;0.443137254901961,0.690196078431373,0.219607843137255;0.435294117647059,0.682352941176471,0.211764705882353;0.423529411764706,0.674509803921569,0.207843137254902;0.419607843137255,0.670588235294118,0.203921568627451;0.403921568627451,0.658823529411765,0.192156862745098;0.396078431372549,0.650980392156863,0.188235294117647;0.388235294117647,0.643137254901961,0.184313725490196;0.380392156862745,0.639215686274510,0.180392156862745;0.372549019607843,0.631372549019608,0.172549019607843;0.364705882352941,0.627450980392157,0.168627450980392;0.349019607843137,0.611764705882353,0.160784313725490;0.345098039215686,0.611764705882353,0.156862745098039;0.333333333333333,0.600000000000000,0.149019607843137;0.325490196078431,0.592156862745098,0.145098039215686;0.317647058823529,0.588235294117647,0.141176470588235;0.305882352941177,0.576470588235294,0.129411764705882;0.301960784313725,0.572549019607843,0.129411764705882;0.298039215686275,0.568627450980392,0.125490196078431;0.286274509803922,0.552941176470588,0.125490196078431;0.278431372549020,0.545098039215686,0.121568627450980;0.274509803921569,0.537254901960784,0.121568627450980;0.266666666666667,0.533333333333333,0.121568627450980;0.262745098039216,0.525490196078431,0.117647058823529;0.254901960784314,0.517647058823530,0.117647058823529;0.247058823529412,0.505882352941176,0.117647058823529;0.243137254901961,0.501960784313726,0.117647058823529;0.231372549019608,0.490196078431373,0.113725490196078;0.227450980392157,0.482352941176471,0.113725490196078;0.219607843137255,0.474509803921569,0.109803921568627;0.211764705882353,0.466666666666667,0.109803921568627;0.207843137254902,0.462745098039216,0.109803921568627;0.203921568627451,0.454901960784314,0.105882352941176]; + [0.250980392156863,0,0.294117647058824;0.258823529411765,0.00392156862745098,0.301960784313725;0.266666666666667,0.0117647058823529,0.309803921568627;0.274509803921569,0.0156862745098039,0.317647058823529;0.286274509803922,0.0274509803921569,0.329411764705882;0.290196078431373,0.0313725490196078,0.333333333333333;0.305882352941177,0.0431372549019608,0.352941176470588;0.313725490196078,0.0509803921568627,0.360784313725490;0.325490196078431,0.0549019607843137,0.368627450980392;0.333333333333333,0.0627450980392157,0.376470588235294;0.341176470588235,0.0705882352941177,0.388235294117647;0.349019607843137,0.0745098039215686,0.396078431372549;0.360784313725490,0.0862745098039216,0.407843137254902;0.364705882352941,0.0901960784313726,0.411764705882353;0.380392156862745,0.101960784313725,0.431372549019608;0.392156862745098,0.109803921568627,0.439215686274510;0.400000000000000,0.113725490196078,0.447058823529412;0.407843137254902,0.121568627450980,0.454901960784314;0.415686274509804,0.125490196078431,0.462745098039216;0.423529411764706,0.133333333333333,0.474509803921569;0.439215686274510,0.145098039215686,0.490196078431373;0.443137254901961,0.149019607843137,0.494117647058824;0.454901960784314,0.160784313725490,0.505882352941176;0.462745098039216,0.168627450980392,0.513725490196078;0.470588235294118,0.180392156862745,0.521568627450980;0.474509803921569,0.188235294117647,0.525490196078431;0.482352941176471,0.203921568627451,0.537254901960784;0.486274509803922,0.211764705882353,0.541176470588235;0.494117647058824,0.231372549019608,0.552941176470588;0.501960784313726,0.243137254901961,0.556862745098039;0.505882352941176,0.254901960784314,0.564705882352941;0.513725490196078,0.266666666666667,0.568627450980392;0.517647058823530,0.274509803921569,0.576470588235294;0.521568627450980,0.286274509803922,0.584313725490196;0.533333333333333,0.305882352941177,0.596078431372549;0.533333333333333,0.313725490196078,0.596078431372549;0.545098039215686,0.329411764705882,0.607843137254902;0.549019607843137,0.341176470588235,0.611764705882353;0.556862745098039,0.352941176470588,0.619607843137255;0.560784313725490,0.360784313725490,0.627450980392157;0.564705882352941,0.372549019607843,0.631372549019608;0.572549019607843,0.384313725490196,0.639215686274510;0.580392156862745,0.403921568627451,0.650980392156863;0.588235294117647,0.411764705882353,0.654901960784314;0.592156862745098,0.427450980392157,0.662745098039216;0.600000000000000,0.439215686274510,0.670588235294118;0.603921568627451,0.447058823529412,0.674509803921569;0.611764705882353,0.454901960784314,0.678431372549020;0.619607843137255,0.466666666666667,0.686274509803922;0.623529411764706,0.470588235294118,0.690196078431373;0.635294117647059,0.486274509803922,0.701960784313725;0.643137254901961,0.494117647058824,0.705882352941177;0.647058823529412,0.501960784313726,0.713725490196078;0.654901960784314,0.509803921568627,0.717647058823529;0.662745098039216,0.517647058823530,0.725490196078431;0.666666666666667,0.525490196078431,0.729411764705882;0.678431372549020,0.545098039215686,0.741176470588235;0.682352941176471,0.549019607843137,0.741176470588235;0.694117647058824,0.560784313725490,0.752941176470588;0.698039215686275,0.568627450980392,0.756862745098039;0.705882352941177,0.576470588235294,0.764705882352941;0.709803921568628,0.584313725490196,0.768627450980392;0.717647058823529,0.592156862745098,0.772549019607843;0.725490196078431,0.600000000000000,0.780392156862745;0.737254901960784,0.615686274509804,0.792156862745098;0.741176470588235,0.623529411764706,0.796078431372549;0.749019607843137,0.631372549019608,0.800000000000000;0.756862745098039,0.639215686274510,0.807843137254902;0.760784313725490,0.647058823529412,0.811764705882353;0.768627450980392,0.654901960784314,0.815686274509804;0.776470588235294,0.666666666666667,0.823529411764706;0.780392156862745,0.670588235294118,0.823529411764706;0.788235294117647,0.686274509803922,0.831372549019608;0.796078431372549,0.690196078431373,0.835294117647059;0.800000000000000,0.698039215686275,0.839215686274510;0.807843137254902,0.705882352941177,0.843137254901961;0.811764705882353,0.713725490196078,0.847058823529412;0.819607843137255,0.721568627450980,0.850980392156863;0.831372549019608,0.737254901960784,0.858823529411765;0.831372549019608,0.737254901960784,0.858823529411765;0.843137254901961,0.749019607843137,0.866666666666667;0.847058823529412,0.756862745098039,0.870588235294118;0.850980392156863,0.764705882352941,0.874509803921569;0.858823529411765,0.772549019607843,0.878431372549020;0.862745098039216,0.780392156862745,0.882352941176471;0.870588235294118,0.784313725490196,0.886274509803922;0.882352941176471,0.800000000000000,0.894117647058824;0.886274509803922,0.807843137254902,0.898039215686275;0.894117647058824,0.815686274509804,0.901960784313726;0.898039215686275,0.823529411764706,0.905882352941177;0.905882352941177,0.831372549019608,0.909803921568627;0.905882352941177,0.835294117647059,0.909803921568627;0.909803921568627,0.843137254901961,0.913725490196078;0.909803921568627,0.847058823529412,0.913725490196078;0.917647058823529,0.854901960784314,0.917647058823529;0.917647058823529,0.862745098039216,0.921568627450980;0.921568627450980,0.866666666666667,0.925490196078431;0.925490196078431,0.874509803921569,0.925490196078431;0.925490196078431,0.878431372549020,0.929411764705882;0.929411764705882,0.882352941176471,0.929411764705882;0.933333333333333,0.894117647058824,0.937254901960784;0.937254901960784,0.898039215686275,0.937254901960784;0.937254901960784,0.905882352941177,0.941176470588235;0.941176470588235,0.909803921568627,0.941176470588235;0.945098039215686,0.913725490196078,0.945098039215686;0.945098039215686,0.921568627450980,0.949019607843137;0.949019607843137,0.929411764705882,0.949019607843137;0.949019607843137,0.933333333333333,0.952941176470588;0.956862745098039,0.941176470588235,0.956862745098039;0.956862745098039,0.949019607843137,0.956862745098039;0.960784313725490,0.952941176470588,0.960784313725490;0.964705882352941,0.956862745098039,0.964705882352941;0.964705882352941,0.964705882352941,0.964705882352941;0.964705882352941,0.964705882352941,0.964705882352941;0.956862745098039,0.964705882352941,0.952941176470588;0.956862745098039,0.964705882352941,0.952941176470588;0.945098039215686,0.960784313725490,0.941176470588235;0.941176470588235,0.960784313725490,0.937254901960784;0.937254901960784,0.960784313725490,0.929411764705882;0.933333333333333,0.956862745098039,0.925490196078431;0.929411764705882,0.956862745098039,0.921568627450980;0.921568627450980,0.956862745098039,0.913725490196078;0.913725490196078,0.952941176470588,0.901960784313726;0.909803921568627,0.952941176470588,0.898039215686275;0.905882352941177,0.952941176470588,0.890196078431373;0.898039215686275,0.952941176470588,0.886274509803922;0.894117647058824,0.949019607843137,0.882352941176471;0.886274509803922,0.949019607843137,0.870588235294118;0.886274509803922,0.949019607843137,0.866666666666667;0.882352941176471,0.945098039215686,0.862745098039216;0.870588235294118,0.945098039215686,0.854901960784314;0.866666666666667,0.945098039215686,0.847058823529412;0.862745098039216,0.941176470588235,0.843137254901961;0.858823529411765,0.941176470588235,0.835294117647059;0.854901960784314,0.941176470588235,0.831372549019608;0.850980392156863,0.941176470588235,0.827450980392157;0.835294117647059,0.933333333333333,0.811764705882353;0.831372549019608,0.933333333333333,0.807843137254902;0.819607843137255,0.925490196078431,0.796078431372549;0.811764705882353,0.921568627450980,0.788235294117647;0.803921568627451,0.921568627450980,0.780392156862745;0.792156862745098,0.913725490196078,0.768627450980392;0.788235294117647,0.913725490196078,0.764705882352941;0.780392156862745,0.909803921568627,0.756862745098039;0.764705882352941,0.901960784313726,0.741176470588235;0.756862745098039,0.901960784313726,0.733333333333333;0.749019607843137,0.898039215686275,0.725490196078431;0.741176470588235,0.894117647058824,0.717647058823529;0.733333333333333,0.890196078431373,0.709803921568628;0.717647058823529,0.886274509803922,0.694117647058824;0.713725490196078,0.886274509803922,0.690196078431373;0.709803921568628,0.882352941176471,0.686274509803922;0.694117647058824,0.874509803921569,0.670588235294118;0.686274509803922,0.870588235294118,0.662745098039216;0.678431372549020,0.866666666666667,0.654901960784314;0.670588235294118,0.866666666666667,0.647058823529412;0.662745098039216,0.862745098039216,0.639215686274510;0.654901960784314,0.858823529411765,0.631372549019608;0.631372549019608,0.847058823529412,0.611764705882353;0.627450980392157,0.843137254901961,0.607843137254902;0.607843137254902,0.831372549019608,0.592156862745098;0.596078431372549,0.827450980392157,0.580392156862745;0.584313725490196,0.819607843137255,0.572549019607843;0.564705882352941,0.807843137254902,0.556862745098039;0.560784313725490,0.803921568627451,0.552941176470588;0.549019607843137,0.800000000000000,0.545098039215686;0.525490196078431,0.784313725490196,0.525490196078431;0.513725490196078,0.776470588235294,0.513725490196078;0.501960784313726,0.768627450980392,0.505882352941176;0.490196078431373,0.764705882352941,0.494117647058824;0.478431372549020,0.756862745098039,0.486274509803922;0.454901960784314,0.741176470588235,0.466666666666667;0.447058823529412,0.737254901960784,0.458823529411765;0.443137254901961,0.737254901960784,0.454901960784314;0.419607843137255,0.721568627450980,0.435294117647059;0.407843137254902,0.713725490196078,0.427450980392157;0.396078431372549,0.709803921568628,0.415686274509804;0.380392156862745,0.698039215686275,0.403921568627451;0.372549019607843,0.694117647058824,0.396078431372549;0.352941176470588,0.682352941176471,0.380392156862745;0.341176470588235,0.670588235294118,0.372549019607843;0.337254901960784,0.666666666666667,0.368627450980392;0.321568627450980,0.654901960784314,0.360784313725490;0.313725490196078,0.647058823529412,0.352941176470588;0.301960784313725,0.639215686274510,0.345098039215686;0.286274509803922,0.627450980392157,0.337254901960784;0.282352941176471,0.623529411764706,0.333333333333333;0.274509803921569,0.615686274509804,0.325490196078431;0.254901960784314,0.596078431372549,0.313725490196078;0.243137254901961,0.588235294117647,0.305882352941177;0.235294117647059,0.580392156862745,0.301960784313725;0.223529411764706,0.572549019607843,0.294117647058824;0.215686274509804,0.564705882352941,0.286274509803922;0.196078431372549,0.549019607843137,0.274509803921569;0.192156862745098,0.545098039215686,0.270588235294118;0.188235294117647,0.541176470588235,0.270588235294118;0.168627450980392,0.521568627450980,0.254901960784314;0.156862745098039,0.513725490196078,0.250980392156863;0.149019607843137,0.505882352941176,0.243137254901961;0.133333333333333,0.494117647058824,0.235294117647059;0.129411764705882,0.490196078431373,0.231372549019608;0.109803921568627,0.474509803921569,0.215686274509804;0.101960784313725,0.462745098039216,0.211764705882353;0.0980392156862745,0.458823529411765,0.207843137254902;0.0941176470588235,0.447058823529412,0.203921568627451;0.0901960784313726,0.439215686274510,0.200000000000000;0.0862745098039216,0.431372549019608,0.196078431372549;0.0784313725490196,0.415686274509804,0.184313725490196;0.0784313725490196,0.411764705882353,0.184313725490196;0.0745098039215686,0.407843137254902,0.180392156862745;0.0627450980392157,0.392156862745098,0.172549019607843;0.0588235294117647,0.384313725490196,0.168627450980392;0.0549019607843137,0.376470588235294,0.164705882352941;0.0509803921568627,0.368627450980392,0.160784313725490;0.0470588235294118,0.360784313725490,0.156862745098039;0.0392156862745098,0.345098039215686,0.145098039215686;0.0352941176470588,0.337254901960784,0.141176470588235;0.0352941176470588,0.337254901960784,0.141176470588235]; + [0.329411764705882,0.188235294117647,0.0196078431372549;0.337254901960784,0.192156862745098,0.0196078431372549;0.345098039215686,0.196078431372549,0.0196078431372549;0.352941176470588,0.200000000000000,0.0196078431372549;0.364705882352941,0.207843137254902,0.0196078431372549;0.368627450980392,0.211764705882353,0.0196078431372549;0.388235294117647,0.223529411764706,0.0235294117647059;0.396078431372549,0.227450980392157,0.0235294117647059;0.403921568627451,0.231372549019608,0.0235294117647059;0.411764705882353,0.235294117647059,0.0235294117647059;0.423529411764706,0.243137254901961,0.0274509803921569;0.431372549019608,0.247058823529412,0.0274509803921569;0.443137254901961,0.254901960784314,0.0274509803921569;0.447058823529412,0.258823529411765,0.0274509803921569;0.466666666666667,0.266666666666667,0.0313725490196078;0.474509803921569,0.270588235294118,0.0313725490196078;0.482352941176471,0.278431372549020,0.0313725490196078;0.490196078431373,0.282352941176471,0.0313725490196078;0.498039215686275,0.286274509803922,0.0313725490196078;0.509803921568627,0.294117647058824,0.0352941176470588;0.525490196078431,0.301960784313725,0.0352941176470588;0.529411764705882,0.305882352941177,0.0352941176470588;0.541176470588235,0.313725490196078,0.0352941176470588;0.552941176470588,0.317647058823529,0.0392156862745098;0.560784313725490,0.325490196078431,0.0470588235294118;0.568627450980392,0.333333333333333,0.0509803921568627;0.580392156862745,0.345098039215686,0.0588235294117647;0.584313725490196,0.349019607843137,0.0627450980392157;0.600000000000000,0.364705882352941,0.0705882352941177;0.607843137254902,0.372549019607843,0.0784313725490196;0.615686274509804,0.380392156862745,0.0823529411764706;0.623529411764706,0.384313725490196,0.0901960784313726;0.631372549019608,0.392156862745098,0.0941176470588235;0.639215686274510,0.400000000000000,0.0980392156862745;0.654901960784314,0.415686274509804,0.109803921568627;0.658823529411765,0.419607843137255,0.109803921568627;0.670588235294118,0.431372549019608,0.121568627450980;0.678431372549020,0.439215686274510,0.125490196078431;0.686274509803922,0.443137254901961,0.133333333333333;0.694117647058824,0.450980392156863,0.137254901960784;0.701960784313725,0.458823529411765,0.141176470588235;0.709803921568628,0.466666666666667,0.149019607843137;0.725490196078431,0.482352941176471,0.156862745098039;0.733333333333333,0.490196078431373,0.164705882352941;0.741176470588235,0.498039215686275,0.168627450980392;0.749019607843137,0.505882352941176,0.176470588235294;0.752941176470588,0.513725490196078,0.188235294117647;0.756862745098039,0.525490196078431,0.200000000000000;0.764705882352941,0.537254901960784,0.215686274509804;0.768627450980392,0.545098039215686,0.223529411764706;0.776470588235294,0.564705882352941,0.247058823529412;0.780392156862745,0.572549019607843,0.258823529411765;0.788235294117647,0.584313725490196,0.274509803921569;0.792156862745098,0.592156862745098,0.286274509803922;0.796078431372549,0.603921568627451,0.298039215686275;0.800000000000000,0.615686274509804,0.309803921568627;0.811764705882353,0.635294117647059,0.333333333333333;0.811764705882353,0.639215686274510,0.337254901960784;0.819607843137255,0.654901960784314,0.360784313725490;0.827450980392157,0.662745098039216,0.372549019607843;0.831372549019608,0.674509803921569,0.384313725490196;0.835294117647059,0.682352941176471,0.396078431372549;0.839215686274510,0.694117647058824,0.407843137254902;0.847058823529412,0.701960784313725,0.419607843137255;0.854901960784314,0.725490196078431,0.447058823529412;0.858823529411765,0.733333333333333,0.458823529411765;0.866666666666667,0.745098039215686,0.470588235294118;0.870588235294118,0.752941176470588,0.482352941176471;0.874509803921569,0.760784313725490,0.494117647058824;0.878431372549020,0.768627450980392,0.505882352941176;0.886274509803922,0.776470588235294,0.521568627450980;0.886274509803922,0.780392156862745,0.525490196078431;0.890196078431373,0.792156862745098,0.549019607843137;0.894117647058824,0.796078431372549,0.556862745098039;0.898039215686275,0.803921568627451,0.568627450980392;0.901960784313726,0.807843137254902,0.580392156862745;0.905882352941177,0.815686274509804,0.592156862745098;0.909803921568627,0.819607843137255,0.600000000000000;0.917647058823529,0.831372549019608,0.623529411764706;0.917647058823529,0.835294117647059,0.627450980392157;0.925490196078431,0.843137254901961,0.643137254901961;0.925490196078431,0.850980392156863,0.654901960784314;0.929411764705882,0.854901960784314,0.666666666666667;0.933333333333333,0.862745098039216,0.678431372549020;0.937254901960784,0.866666666666667,0.690196078431373;0.941176470588235,0.874509803921569,0.698039215686275;0.949019607843137,0.886274509803922,0.721568627450980;0.952941176470588,0.890196078431373,0.729411764705882;0.956862745098039,0.898039215686275,0.741176470588235;0.960784313725490,0.901960784313726,0.752941176470588;0.964705882352941,0.909803921568627,0.764705882352941;0.960784313725490,0.909803921568627,0.768627450980392;0.960784313725490,0.913725490196078,0.780392156862745;0.960784313725490,0.913725490196078,0.784313725490196;0.960784313725490,0.917647058823529,0.800000000000000;0.960784313725490,0.921568627450980,0.807843137254902;0.960784313725490,0.921568627450980,0.815686274509804;0.960784313725490,0.925490196078431,0.827450980392157;0.960784313725490,0.925490196078431,0.831372549019608;0.960784313725490,0.929411764705882,0.839215686274510;0.960784313725490,0.933333333333333,0.854901960784314;0.960784313725490,0.933333333333333,0.858823529411765;0.960784313725490,0.937254901960784,0.870588235294118;0.960784313725490,0.937254901960784,0.878431372549020;0.960784313725490,0.941176470588235,0.886274509803922;0.960784313725490,0.941176470588235,0.894117647058824;0.960784313725490,0.945098039215686,0.905882352941177;0.960784313725490,0.945098039215686,0.909803921568627;0.960784313725490,0.949019607843137,0.925490196078431;0.960784313725490,0.952941176470588,0.933333333333333;0.960784313725490,0.952941176470588,0.941176470588235;0.960784313725490,0.956862745098039,0.949019607843137;0.960784313725490,0.956862745098039,0.956862745098039;0.956862745098039,0.956862745098039,0.956862745098039;0.945098039215686,0.952941176470588,0.952941176470588;0.941176470588235,0.952941176470588,0.952941176470588;0.925490196078431,0.952941176470588,0.949019607843137;0.921568627450980,0.949019607843137,0.945098039215686;0.913725490196078,0.949019607843137,0.941176470588235;0.901960784313726,0.945098039215686,0.941176470588235;0.898039215686275,0.945098039215686,0.937254901960784;0.890196078431373,0.941176470588235,0.937254901960784;0.878431372549020,0.941176470588235,0.929411764705882;0.874509803921569,0.937254901960784,0.929411764705882;0.862745098039216,0.937254901960784,0.925490196078431;0.854901960784314,0.933333333333333,0.921568627450980;0.850980392156863,0.933333333333333,0.921568627450980;0.835294117647059,0.929411764705882,0.917647058823529;0.831372549019608,0.929411764705882,0.917647058823529;0.827450980392157,0.929411764705882,0.913725490196078;0.815686274509804,0.925490196078431,0.909803921568627;0.807843137254902,0.921568627450980,0.905882352941177;0.800000000000000,0.921568627450980,0.901960784313726;0.792156862745098,0.917647058823529,0.901960784313726;0.784313725490196,0.917647058823529,0.898039215686275;0.780392156862745,0.917647058823529,0.898039215686275;0.756862745098039,0.905882352941177,0.886274509803922;0.752941176470588,0.905882352941177,0.882352941176471;0.733333333333333,0.898039215686275,0.874509803921569;0.725490196078431,0.894117647058824,0.866666666666667;0.713725490196078,0.890196078431373,0.862745098039216;0.694117647058824,0.882352941176471,0.854901960784314;0.690196078431373,0.878431372549020,0.850980392156863;0.678431372549020,0.874509803921569,0.847058823529412;0.658823529411765,0.866666666666667,0.835294117647059;0.650980392156863,0.862745098039216,0.831372549019608;0.635294117647059,0.858823529411765,0.823529411764706;0.627450980392157,0.854901960784314,0.819607843137255;0.615686274509804,0.847058823529412,0.811764705882353;0.592156862745098,0.839215686274510,0.803921568627451;0.588235294117647,0.839215686274510,0.800000000000000;0.580392156862745,0.835294117647059,0.796078431372549;0.560784313725490,0.827450980392157,0.784313725490196;0.549019607843137,0.823529411764706,0.780392156862745;0.537254901960784,0.815686274509804,0.772549019607843;0.525490196078431,0.811764705882353,0.768627450980392;0.517647058823530,0.807843137254902,0.764705882352941;0.505882352941176,0.803921568627451,0.756862745098039;0.482352941176471,0.788235294117647,0.745098039215686;0.478431372549020,0.784313725490196,0.741176470588235;0.458823529411765,0.772549019607843,0.729411764705882;0.447058823529412,0.764705882352941,0.721568627450980;0.435294117647059,0.756862745098039,0.713725490196078;0.415686274509804,0.745098039215686,0.701960784313725;0.411764705882353,0.741176470588235,0.698039215686275;0.403921568627451,0.733333333333333,0.690196078431373;0.380392156862745,0.713725490196078,0.674509803921569;0.368627450980392,0.705882352941177,0.666666666666667;0.356862745098039,0.698039215686275,0.658823529411765;0.345098039215686,0.690196078431373,0.650980392156863;0.333333333333333,0.682352941176471,0.643137254901961;0.309803921568627,0.666666666666667,0.627450980392157;0.301960784313725,0.658823529411765,0.623529411764706;0.298039215686275,0.654901960784314,0.619607843137255;0.274509803921569,0.639215686274510,0.603921568627451;0.262745098039216,0.631372549019608,0.596078431372549;0.250980392156863,0.623529411764706,0.588235294117647;0.235294117647059,0.611764705882353,0.576470588235294;0.227450980392157,0.607843137254902,0.572549019607843;0.207843137254902,0.592156862745098,0.560784313725490;0.196078431372549,0.584313725490196,0.552941176470588;0.192156862745098,0.580392156862745,0.549019607843137;0.180392156862745,0.568627450980392,0.537254901960784;0.172549019607843,0.560784313725490,0.529411764705882;0.164705882352941,0.552941176470588,0.521568627450980;0.152941176470588,0.541176470588235,0.509803921568627;0.149019607843137,0.537254901960784,0.505882352941176;0.141176470588235,0.529411764705882,0.498039215686275;0.125490196078431,0.513725490196078,0.482352941176471;0.117647058823529,0.505882352941176,0.474509803921569;0.109803921568627,0.498039215686275,0.466666666666667;0.101960784313725,0.494117647058824,0.462745098039216;0.0941176470588235,0.486274509803922,0.454901960784314;0.0784313725490196,0.470588235294118,0.439215686274510;0.0745098039215686,0.466666666666667,0.435294117647059;0.0705882352941177,0.462745098039216,0.431372549019608;0.0549019607843137,0.447058823529412,0.415686274509804;0.0470588235294118,0.439215686274510,0.407843137254902;0.0392156862745098,0.431372549019608,0.400000000000000;0.0274509803921569,0.419607843137255,0.388235294117647;0.0235294117647059,0.415686274509804,0.384313725490196;0.00784313725490196,0.400000000000000,0.368627450980392;0,0.396078431372549,0.364705882352941;0,0.392156862745098,0.360784313725490;0,0.380392156862745,0.349019607843137;0,0.376470588235294,0.341176470588235;0,0.368627450980392,0.333333333333333;0,0.356862745098039,0.321568627450980;0,0.352941176470588,0.317647058823529;0,0.349019607843137,0.313725490196078;0,0.337254901960784,0.298039215686275;0,0.329411764705882,0.294117647058824;0,0.325490196078431,0.286274509803922;0,0.317647058823529,0.278431372549020;0,0.309803921568627,0.270588235294118;0,0.298039215686275,0.258823529411765;0,0.290196078431373,0.250980392156863;0,0.290196078431373,0.250980392156863]; + [0.498039215686275,0.231372549019608,0.0313725490196078;0.505882352941176,0.235294117647059,0.0274509803921569;0.513725490196078,0.239215686274510,0.0274509803921569;0.521568627450980,0.243137254901961,0.0274509803921569;0.533333333333333,0.247058823529412,0.0274509803921569;0.537254901960784,0.250980392156863,0.0274509803921569;0.552941176470588,0.258823529411765,0.0274509803921569;0.560784313725490,0.266666666666667,0.0274509803921569;0.568627450980392,0.270588235294118,0.0274509803921569;0.576470588235294,0.274509803921569,0.0274509803921569;0.584313725490196,0.278431372549020,0.0274509803921569;0.592156862745098,0.282352941176471,0.0274509803921569;0.603921568627451,0.290196078431373,0.0235294117647059;0.607843137254902,0.290196078431373,0.0235294117647059;0.623529411764706,0.301960784313725,0.0235294117647059;0.631372549019608,0.305882352941177,0.0235294117647059;0.639215686274510,0.309803921568627,0.0235294117647059;0.647058823529412,0.313725490196078,0.0235294117647059;0.654901960784314,0.317647058823529,0.0235294117647059;0.662745098039216,0.321568627450980,0.0235294117647059;0.678431372549020,0.333333333333333,0.0235294117647059;0.682352941176471,0.337254901960784,0.0235294117647059;0.694117647058824,0.341176470588235,0.0235294117647059;0.701960784313725,0.345098039215686,0.0235294117647059;0.709803921568628,0.352941176470588,0.0235294117647059;0.717647058823529,0.360784313725490,0.0274509803921569;0.725490196078431,0.368627450980392,0.0274509803921569;0.729411764705882,0.372549019607843,0.0313725490196078;0.745098039215686,0.384313725490196,0.0352941176470588;0.752941176470588,0.392156862745098,0.0392156862745098;0.760784313725490,0.396078431372549,0.0392156862745098;0.764705882352941,0.403921568627451,0.0431372549019608;0.772549019607843,0.411764705882353,0.0431372549019608;0.780392156862745,0.415686274509804,0.0470588235294118;0.792156862745098,0.431372549019608,0.0509803921568627;0.796078431372549,0.431372549019608,0.0509803921568627;0.807843137254902,0.443137254901961,0.0549019607843137;0.815686274509804,0.450980392156863,0.0588235294117647;0.819607843137255,0.454901960784314,0.0588235294117647;0.827450980392157,0.462745098039216,0.0627450980392157;0.835294117647059,0.470588235294118,0.0627450980392157;0.843137254901961,0.474509803921569,0.0666666666666667;0.854901960784314,0.490196078431373,0.0705882352941177;0.862745098039216,0.494117647058824,0.0705882352941177;0.870588235294118,0.501960784313726,0.0745098039215686;0.878431372549020,0.509803921568627,0.0784313725490196;0.882352941176471,0.517647058823530,0.0901960784313726;0.886274509803922,0.525490196078431,0.101960784313725;0.890196078431373,0.537254901960784,0.117647058823529;0.894117647058824,0.541176470588235,0.125490196078431;0.901960784313726,0.556862745098039,0.149019607843137;0.905882352941177,0.564705882352941,0.160784313725490;0.913725490196078,0.572549019607843,0.172549019607843;0.917647058823529,0.584313725490196,0.184313725490196;0.921568627450980,0.592156862745098,0.196078431372549;0.925490196078431,0.600000000000000,0.211764705882353;0.933333333333333,0.615686274509804,0.235294117647059;0.933333333333333,0.619607843137255,0.239215686274510;0.945098039215686,0.631372549019608,0.258823529411765;0.949019607843137,0.639215686274510,0.270588235294118;0.952941176470588,0.647058823529412,0.282352941176471;0.956862745098039,0.658823529411765,0.294117647058824;0.960784313725490,0.666666666666667,0.305882352941177;0.964705882352941,0.674509803921569,0.317647058823529;0.976470588235294,0.690196078431373,0.345098039215686;0.980392156862745,0.698039215686275,0.356862745098039;0.984313725490196,0.705882352941177,0.368627450980392;0.988235294117647,0.713725490196078,0.380392156862745;0.992156862745098,0.721568627450980,0.392156862745098;0.992156862745098,0.729411764705882,0.403921568627451;0.992156862745098,0.737254901960784,0.427450980392157;0.992156862745098,0.741176470588235,0.431372549019608;0.992156862745098,0.752941176470588,0.454901960784314;0.992156862745098,0.760784313725490,0.470588235294118;0.992156862745098,0.764705882352941,0.482352941176471;0.992156862745098,0.772549019607843,0.494117647058824;0.992156862745098,0.776470588235294,0.505882352941176;0.992156862745098,0.784313725490196,0.521568627450980;0.992156862745098,0.796078431372549,0.545098039215686;0.992156862745098,0.800000000000000,0.549019607843137;0.992156862745098,0.807843137254902,0.572549019607843;0.992156862745098,0.815686274509804,0.584313725490196;0.992156862745098,0.819607843137255,0.596078431372549;0.992156862745098,0.827450980392157,0.607843137254902;0.992156862745098,0.835294117647059,0.627450980392157;0.992156862745098,0.839215686274510,0.635294117647059;0.992156862745098,0.850980392156863,0.658823529411765;0.992156862745098,0.858823529411765,0.674509803921569;0.992156862745098,0.862745098039216,0.686274509803922;0.992156862745098,0.870588235294118,0.698039215686275;0.996078431372549,0.878431372549020,0.713725490196078;0.992156862745098,0.878431372549020,0.721568627450980;0.992156862745098,0.886274509803922,0.737254901960784;0.992156862745098,0.886274509803922,0.741176470588235;0.988235294117647,0.894117647058824,0.760784313725490;0.988235294117647,0.898039215686275,0.772549019607843;0.988235294117647,0.901960784313726,0.780392156862745;0.984313725490196,0.905882352941177,0.796078431372549;0.984313725490196,0.909803921568627,0.800000000000000;0.984313725490196,0.913725490196078,0.811764705882353;0.980392156862745,0.917647058823529,0.831372549019608;0.980392156862745,0.921568627450980,0.839215686274510;0.980392156862745,0.925490196078431,0.850980392156863;0.976470588235294,0.929411764705882,0.862745098039216;0.976470588235294,0.933333333333333,0.870588235294118;0.976470588235294,0.937254901960784,0.882352941176471;0.976470588235294,0.941176470588235,0.894117647058824;0.972549019607843,0.945098039215686,0.901960784313726;0.972549019607843,0.949019607843137,0.921568627450980;0.968627450980392,0.952941176470588,0.933333333333333;0.968627450980392,0.956862745098039,0.941176470588235;0.968627450980392,0.960784313725490,0.952941176470588;0.968627450980392,0.964705882352941,0.960784313725490;0.964705882352941,0.964705882352941,0.964705882352941;0.956862745098039,0.956862745098039,0.960784313725490;0.952941176470588,0.956862745098039,0.960784313725490;0.945098039215686,0.945098039215686,0.956862745098039;0.941176470588235,0.941176470588235,0.956862745098039;0.937254901960784,0.937254901960784,0.952941176470588;0.929411764705882,0.933333333333333,0.952941176470588;0.925490196078431,0.929411764705882,0.952941176470588;0.921568627450980,0.925490196078431,0.949019607843137;0.913725490196078,0.913725490196078,0.945098039215686;0.909803921568627,0.909803921568627,0.945098039215686;0.901960784313726,0.905882352941177,0.941176470588235;0.898039215686275,0.901960784313726,0.941176470588235;0.894117647058824,0.898039215686275,0.937254901960784;0.882352941176471,0.890196078431373,0.933333333333333;0.882352941176471,0.886274509803922,0.933333333333333;0.878431372549020,0.882352941176471,0.933333333333333;0.870588235294118,0.874509803921569,0.929411764705882;0.862745098039216,0.870588235294118,0.925490196078431;0.858823529411765,0.866666666666667,0.925490196078431;0.854901960784314,0.862745098039216,0.921568627450980;0.850980392156863,0.858823529411765,0.921568627450980;0.847058823529412,0.854901960784314,0.921568627450980;0.835294117647059,0.839215686274510,0.913725490196078;0.831372549019608,0.835294117647059,0.913725490196078;0.823529411764706,0.823529411764706,0.905882352941177;0.815686274509804,0.815686274509804,0.901960784313726;0.811764705882353,0.807843137254902,0.898039215686275;0.800000000000000,0.800000000000000,0.890196078431373;0.800000000000000,0.796078431372549,0.890196078431373;0.792156862745098,0.788235294117647,0.886274509803922;0.780392156862745,0.772549019607843,0.878431372549020;0.776470588235294,0.764705882352941,0.874509803921569;0.768627450980392,0.760784313725490,0.870588235294118;0.764705882352941,0.752941176470588,0.866666666666667;0.756862745098039,0.745098039215686,0.862745098039216;0.745098039215686,0.729411764705882,0.854901960784314;0.745098039215686,0.725490196078431,0.854901960784314;0.741176470588235,0.721568627450980,0.850980392156863;0.729411764705882,0.709803921568628,0.843137254901961;0.721568627450980,0.701960784313725,0.839215686274510;0.717647058823529,0.694117647058824,0.835294117647059;0.709803921568628,0.686274509803922,0.831372549019608;0.705882352941177,0.678431372549020,0.827450980392157;0.698039215686275,0.670588235294118,0.823529411764706;0.686274509803922,0.654901960784314,0.811764705882353;0.682352941176471,0.650980392156863,0.811764705882353;0.670588235294118,0.639215686274510,0.800000000000000;0.662745098039216,0.631372549019608,0.796078431372549;0.654901960784314,0.619607843137255,0.788235294117647;0.643137254901961,0.607843137254902,0.780392156862745;0.639215686274510,0.603921568627451,0.776470588235294;0.631372549019608,0.596078431372549,0.772549019607843;0.615686274509804,0.576470588235294,0.760784313725490;0.607843137254902,0.568627450980392,0.752941176470588;0.600000000000000,0.560784313725490,0.749019607843137;0.592156862745098,0.552941176470588,0.741176470588235;0.584313725490196,0.545098039215686,0.737254901960784;0.568627450980392,0.525490196078431,0.725490196078431;0.564705882352941,0.521568627450980,0.721568627450980;0.560784313725490,0.517647058823530,0.717647058823529;0.545098039215686,0.501960784313726,0.705882352941177;0.537254901960784,0.490196078431373,0.701960784313725;0.529411764705882,0.482352941176471,0.694117647058824;0.517647058823530,0.470588235294118,0.686274509803922;0.513725490196078,0.466666666666667,0.682352941176471;0.501960784313726,0.450980392156863,0.674509803921569;0.494117647058824,0.439215686274510,0.666666666666667;0.490196078431373,0.431372549019608,0.662745098039216;0.478431372549020,0.415686274509804,0.654901960784314;0.474509803921569,0.403921568627451,0.650980392156863;0.466666666666667,0.392156862745098,0.643137254901961;0.454901960784314,0.372549019607843,0.635294117647059;0.450980392156863,0.364705882352941,0.635294117647059;0.447058823529412,0.356862745098039,0.627450980392157;0.431372549019608,0.333333333333333,0.615686274509804;0.427450980392157,0.321568627450980,0.611764705882353;0.419607843137255,0.309803921568627,0.607843137254902;0.411764705882353,0.298039215686275,0.600000000000000;0.403921568627451,0.286274509803922,0.596078431372549;0.392156862745098,0.262745098039216,0.584313725490196;0.388235294117647,0.254901960784314,0.580392156862745;0.384313725490196,0.250980392156863,0.580392156862745;0.372549019607843,0.227450980392157,0.568627450980392;0.364705882352941,0.215686274509804,0.560784313725490;0.356862745098039,0.203921568627451,0.556862745098039;0.349019607843137,0.188235294117647,0.549019607843137;0.345098039215686,0.180392156862745,0.545098039215686;0.329411764705882,0.156862745098039,0.533333333333333;0.325490196078431,0.149019607843137,0.525490196078431;0.321568627450980,0.145098039215686,0.521568627450980;0.313725490196078,0.137254901960784,0.509803921568627;0.305882352941177,0.129411764705882,0.498039215686275;0.301960784313725,0.125490196078431,0.490196078431373;0.290196078431373,0.113725490196078,0.470588235294118;0.286274509803922,0.109803921568627,0.466666666666667;0.282352941176471,0.105882352941176,0.462745098039216;0.270588235294118,0.0941176470588235,0.443137254901961;0.262745098039216,0.0862745098039216,0.431372549019608;0.258823529411765,0.0823529411764706,0.423529411764706;0.250980392156863,0.0745098039215686,0.415686274509804;0.247058823529412,0.0705882352941177,0.403921568627451;0.235294117647059,0.0588235294117647,0.384313725490196;0.227450980392157,0.0509803921568627,0.376470588235294;0.227450980392157,0.0509803921568627,0.376470588235294]; + [0.403921568627451,0,0.121568627450980;0.411764705882353,0,0.121568627450980;0.415686274509804,0,0.121568627450980;0.435294117647059,0.00784313725490196,0.125490196078431;0.447058823529412,0.0117647058823529,0.125490196078431;0.458823529411765,0.0156862745098039,0.129411764705882;0.478431372549020,0.0235294117647059,0.133333333333333;0.482352941176471,0.0235294117647059,0.133333333333333;0.505882352941176,0.0313725490196078,0.137254901960784;0.517647058823530,0.0352941176470588,0.137254901960784;0.525490196078431,0.0392156862745098,0.141176470588235;0.541176470588235,0.0431372549019608,0.141176470588235;0.552941176470588,0.0470588235294118,0.145098039215686;0.564705882352941,0.0509803921568627,0.145098039215686;0.588235294117647,0.0588235294117647,0.149019607843137;0.592156862745098,0.0588235294117647,0.149019607843137;0.607843137254902,0.0627450980392157,0.152941176470588;0.619607843137255,0.0666666666666667,0.152941176470588;0.631372549019608,0.0705882352941177,0.156862745098039;0.643137254901961,0.0745098039215686,0.156862745098039;0.658823529411765,0.0784313725490196,0.160784313725490;0.666666666666667,0.0823529411764706,0.160784313725490;0.690196078431373,0.0901960784313726,0.164705882352941;0.698039215686275,0.0980392156862745,0.168627450980392;0.701960784313725,0.101960784313725,0.172549019607843;0.709803921568628,0.121568627450980,0.180392156862745;0.713725490196078,0.129411764705882,0.184313725490196;0.721568627450980,0.141176470588235,0.192156862745098;0.729411764705882,0.160784313725490,0.200000000000000;0.733333333333333,0.164705882352941,0.200000000000000;0.745098039215686,0.188235294117647,0.211764705882353;0.749019607843137,0.196078431372549,0.215686274509804;0.752941176470588,0.207843137254902,0.219607843137255;0.760784313725490,0.219607843137255,0.227450980392157;0.764705882352941,0.231372549019608,0.231372549019608;0.772549019607843,0.243137254901961,0.235294117647059;0.780392156862745,0.262745098039216,0.247058823529412;0.784313725490196,0.270588235294118,0.250980392156863;0.792156862745098,0.286274509803922,0.258823529411765;0.800000000000000,0.298039215686275,0.262745098039216;0.803921568627451,0.309803921568627,0.266666666666667;0.807843137254902,0.317647058823529,0.274509803921569;0.815686274509804,0.333333333333333,0.282352941176471;0.819607843137255,0.341176470588235,0.286274509803922;0.831372549019608,0.364705882352941,0.294117647058824;0.839215686274510,0.376470588235294,0.301960784313725;0.839215686274510,0.380392156862745,0.305882352941177;0.847058823529412,0.396078431372549,0.317647058823529;0.850980392156863,0.407843137254902,0.325490196078431;0.854901960784314,0.415686274509804,0.333333333333333;0.862745098039216,0.435294117647059,0.345098039215686;0.866666666666667,0.439215686274510,0.349019607843137;0.874509803921569,0.458823529411765,0.364705882352941;0.878431372549020,0.470588235294118,0.372549019607843;0.882352941176471,0.482352941176471,0.380392156862745;0.886274509803922,0.490196078431373,0.388235294117647;0.894117647058824,0.501960784313726,0.396078431372549;0.898039215686275,0.513725490196078,0.407843137254902;0.905882352941177,0.533333333333333,0.423529411764706;0.909803921568627,0.541176470588235,0.427450980392157;0.917647058823529,0.552941176470588,0.439215686274510;0.921568627450980,0.564705882352941,0.447058823529412;0.925490196078431,0.576470588235294,0.454901960784314;0.929411764705882,0.588235294117647,0.462745098039216;0.933333333333333,0.600000000000000,0.474509803921569;0.937254901960784,0.607843137254902,0.478431372549020;0.949019607843137,0.627450980392157,0.494117647058824;0.952941176470588,0.639215686274510,0.501960784313726;0.956862745098039,0.650980392156863,0.513725490196078;0.956862745098039,0.658823529411765,0.525490196078431;0.956862745098039,0.666666666666667,0.533333333333333;0.960784313725490,0.674509803921569,0.545098039215686;0.960784313725490,0.690196078431373,0.564705882352941;0.960784313725490,0.694117647058824,0.568627450980392;0.964705882352941,0.705882352941177,0.588235294117647;0.968627450980392,0.713725490196078,0.596078431372549;0.968627450980392,0.725490196078431,0.607843137254902;0.968627450980392,0.733333333333333,0.619607843137255;0.972549019607843,0.741176470588235,0.631372549019608;0.972549019607843,0.749019607843137,0.639215686274510;0.976470588235294,0.764705882352941,0.662745098039216;0.976470588235294,0.768627450980392,0.666666666666667;0.976470588235294,0.780392156862745,0.682352941176471;0.980392156862745,0.792156862745098,0.694117647058824;0.980392156862745,0.800000000000000,0.705882352941177;0.980392156862745,0.807843137254902,0.713725490196078;0.984313725490196,0.819607843137255,0.729411764705882;0.984313725490196,0.823529411764706,0.737254901960784;0.988235294117647,0.839215686274510,0.756862745098039;0.988235294117647,0.847058823529412,0.768627450980392;0.992156862745098,0.858823529411765,0.780392156862745;0.992156862745098,0.862745098039216,0.788235294117647;0.992156862745098,0.866666666666667,0.796078431372549;0.992156862745098,0.874509803921569,0.803921568627451;0.992156862745098,0.886274509803922,0.819607843137255;0.992156862745098,0.886274509803922,0.823529411764706;0.992156862745098,0.894117647058824,0.839215686274510;0.992156862745098,0.901960784313726,0.847058823529412;0.992156862745098,0.905882352941177,0.854901960784314;0.992156862745098,0.913725490196078,0.862745098039216;0.992156862745098,0.917647058823529,0.874509803921569;0.992156862745098,0.921568627450980,0.882352941176471;0.996078431372549,0.933333333333333,0.898039215686275;0.996078431372549,0.941176470588235,0.905882352941177;0.996078431372549,0.945098039215686,0.917647058823529;0.996078431372549,0.952941176470588,0.925490196078431;0.996078431372549,0.956862745098039,0.933333333333333;0.996078431372549,0.960784313725490,0.941176470588235;0.996078431372549,0.972549019607843,0.956862745098039;0.996078431372549,0.972549019607843,0.960784313725490;0.996078431372549,0.984313725490196,0.976470588235294;0.996078431372549,0.988235294117647,0.984313725490196;0.996078431372549,0.996078431372549,0.992156862745098;0.996078431372549,0.996078431372549,0.996078431372549;0.992156862745098,0.992156862745098,0.992156862745098;0.984313725490196,0.984313725490196,0.984313725490196;0.976470588235294,0.976470588235294,0.976470588235294;0.976470588235294,0.976470588235294,0.976470588235294;0.968627450980392,0.968627450980392,0.968627450980392;0.960784313725490,0.960784313725490,0.960784313725490;0.956862745098039,0.956862745098039,0.956862745098039;0.952941176470588,0.952941176470588,0.952941176470588;0.949019607843137,0.949019607843137,0.949019607843137;0.945098039215686,0.945098039215686,0.945098039215686;0.933333333333333,0.933333333333333,0.933333333333333;0.929411764705882,0.929411764705882,0.929411764705882;0.925490196078431,0.925490196078431,0.925490196078431;0.917647058823529,0.917647058823529,0.917647058823529;0.913725490196078,0.913725490196078,0.913725490196078;0.909803921568627,0.909803921568627,0.909803921568627;0.901960784313726,0.901960784313726,0.901960784313726;0.901960784313726,0.901960784313726,0.901960784313726;0.890196078431373,0.890196078431373,0.890196078431373;0.886274509803922,0.886274509803922,0.886274509803922;0.882352941176471,0.882352941176471,0.882352941176471;0.878431372549020,0.878431372549020,0.878431372549020;0.870588235294118,0.870588235294118,0.870588235294118;0.866666666666667,0.866666666666667,0.866666666666667;0.854901960784314,0.854901960784314,0.854901960784314;0.850980392156863,0.850980392156863,0.850980392156863;0.843137254901961,0.843137254901961,0.843137254901961;0.835294117647059,0.835294117647059,0.835294117647059;0.831372549019608,0.831372549019608,0.831372549019608;0.823529411764706,0.823529411764706,0.823529411764706;0.815686274509804,0.815686274509804,0.815686274509804;0.811764705882353,0.811764705882353,0.811764705882353;0.800000000000000,0.800000000000000,0.800000000000000;0.796078431372549,0.796078431372549,0.796078431372549;0.788235294117647,0.788235294117647,0.788235294117647;0.784313725490196,0.784313725490196,0.784313725490196;0.776470588235294,0.776470588235294,0.776470588235294;0.772549019607843,0.772549019607843,0.772549019607843;0.760784313725490,0.760784313725490,0.760784313725490;0.760784313725490,0.760784313725490,0.760784313725490;0.749019607843137,0.749019607843137,0.749019607843137;0.741176470588235,0.741176470588235,0.741176470588235;0.737254901960784,0.737254901960784,0.737254901960784;0.729411764705882,0.729411764705882,0.729411764705882;0.725490196078431,0.725490196078431,0.725490196078431;0.717647058823529,0.717647058823529,0.717647058823529;0.701960784313725,0.701960784313725,0.701960784313725;0.698039215686275,0.698039215686275,0.698039215686275;0.686274509803922,0.686274509803922,0.686274509803922;0.678431372549020,0.678431372549020,0.678431372549020;0.670588235294118,0.670588235294118,0.670588235294118;0.662745098039216,0.662745098039216,0.662745098039216;0.650980392156863,0.650980392156863,0.650980392156863;0.647058823529412,0.647058823529412,0.647058823529412;0.631372549019608,0.631372549019608,0.631372549019608;0.623529411764706,0.623529411764706,0.623529411764706;0.615686274509804,0.615686274509804,0.615686274509804;0.607843137254902,0.607843137254902,0.607843137254902;0.600000000000000,0.600000000000000,0.600000000000000;0.592156862745098,0.592156862745098,0.592156862745098;0.576470588235294,0.576470588235294,0.576470588235294;0.572549019607843,0.572549019607843,0.572549019607843;0.560784313725490,0.560784313725490,0.560784313725490;0.552941176470588,0.552941176470588,0.552941176470588;0.545098039215686,0.545098039215686,0.545098039215686;0.533333333333333,0.533333333333333,0.533333333333333;0.529411764705882,0.529411764705882,0.529411764705882;0.517647058823530,0.517647058823530,0.517647058823530;0.501960784313726,0.501960784313726,0.501960784313726;0.494117647058824,0.494117647058824,0.494117647058824;0.482352941176471,0.482352941176471,0.482352941176471;0.474509803921569,0.474509803921569,0.474509803921569;0.466666666666667,0.466666666666667,0.466666666666667;0.454901960784314,0.454901960784314,0.454901960784314;0.443137254901961,0.443137254901961,0.443137254901961;0.439215686274510,0.439215686274510,0.439215686274510;0.419607843137255,0.419607843137255,0.419607843137255;0.411764705882353,0.411764705882353,0.411764705882353;0.403921568627451,0.403921568627451,0.403921568627451;0.392156862745098,0.392156862745098,0.392156862745098;0.384313725490196,0.384313725490196,0.384313725490196;0.376470588235294,0.376470588235294,0.376470588235294;0.356862745098039,0.356862745098039,0.356862745098039;0.352941176470588,0.352941176470588,0.352941176470588;0.341176470588235,0.341176470588235,0.341176470588235;0.329411764705882,0.329411764705882,0.329411764705882;0.321568627450980,0.321568627450980,0.321568627450980;0.309803921568627,0.309803921568627,0.309803921568627;0.305882352941177,0.305882352941177,0.305882352941177;0.298039215686275,0.298039215686275,0.298039215686275;0.282352941176471,0.282352941176471,0.282352941176471;0.270588235294118,0.270588235294118,0.270588235294118;0.266666666666667,0.266666666666667,0.266666666666667;0.254901960784314,0.254901960784314,0.254901960784314;0.250980392156863,0.250980392156863,0.250980392156863;0.239215686274510,0.239215686274510,0.239215686274510;0.227450980392157,0.227450980392157,0.227450980392157;0.223529411764706,0.223529411764706,0.223529411764706;0.207843137254902,0.207843137254902,0.207843137254902;0.203921568627451,0.203921568627451,0.203921568627451;0.192156862745098,0.192156862745098,0.192156862745098;0.184313725490196,0.184313725490196,0.184313725490196;0.180392156862745,0.180392156862745,0.180392156862745;0.172549019607843,0.172549019607843,0.172549019607843]; + [0.403921568627451,0,0.121568627450980;0.411764705882353,0,0.121568627450980;0.423529411764706,0.00392156862745098,0.121568627450980;0.435294117647059,0.00784313725490196,0.125490196078431;0.450980392156863,0.0117647058823529,0.125490196078431;0.458823529411765,0.0156862745098039,0.129411764705882;0.482352941176471,0.0235294117647059,0.133333333333333;0.494117647058824,0.0274509803921569,0.133333333333333;0.505882352941176,0.0313725490196078,0.137254901960784;0.517647058823530,0.0352941176470588,0.137254901960784;0.529411764705882,0.0392156862745098,0.141176470588235;0.541176470588235,0.0431372549019608,0.141176470588235;0.560784313725490,0.0509803921568627,0.145098039215686;0.568627450980392,0.0509803921568627,0.145098039215686;0.588235294117647,0.0588235294117647,0.149019607843137;0.600000000000000,0.0627450980392157,0.152941176470588;0.607843137254902,0.0627450980392157,0.152941176470588;0.619607843137255,0.0666666666666667,0.152941176470588;0.631372549019608,0.0705882352941177,0.156862745098039;0.643137254901961,0.0745098039215686,0.156862745098039;0.666666666666667,0.0823529411764706,0.160784313725490;0.674509803921569,0.0862745098039216,0.164705882352941;0.690196078431373,0.0901960784313726,0.164705882352941;0.698039215686275,0.0980392156862745,0.168627450980392;0.705882352941177,0.109803921568627,0.176470588235294;0.709803921568628,0.121568627450980,0.180392156862745;0.717647058823529,0.133333333333333,0.188235294117647;0.721568627450980,0.141176470588235,0.192156862745098;0.733333333333333,0.164705882352941,0.200000000000000;0.737254901960784,0.176470588235294,0.203921568627451;0.745098039215686,0.188235294117647,0.211764705882353;0.749019607843137,0.196078431372549,0.215686274509804;0.752941176470588,0.207843137254902,0.219607843137255;0.760784313725490,0.219607843137255,0.227450980392157;0.772549019607843,0.239215686274510,0.235294117647059;0.772549019607843,0.247058823529412,0.239215686274510;0.780392156862745,0.262745098039216,0.247058823529412;0.788235294117647,0.274509803921569,0.254901960784314;0.792156862745098,0.286274509803922,0.258823529411765;0.800000000000000,0.298039215686275,0.262745098039216;0.803921568627451,0.309803921568627,0.266666666666667;0.807843137254902,0.317647058823529,0.274509803921569;0.819607843137255,0.341176470588235,0.286274509803922;0.827450980392157,0.349019607843137,0.290196078431373;0.831372549019608,0.364705882352941,0.294117647058824;0.839215686274510,0.376470588235294,0.301960784313725;0.843137254901961,0.384313725490196,0.309803921568627;0.847058823529412,0.396078431372549,0.317647058823529;0.850980392156863,0.411764705882353,0.329411764705882;0.854901960784314,0.415686274509804,0.333333333333333;0.866666666666667,0.439215686274510,0.349019607843137;0.870588235294118,0.447058823529412,0.356862745098039;0.874509803921569,0.458823529411765,0.364705882352941;0.878431372549020,0.470588235294118,0.372549019607843;0.882352941176471,0.482352941176471,0.380392156862745;0.886274509803922,0.490196078431373,0.388235294117647;0.898039215686275,0.513725490196078,0.407843137254902;0.898039215686275,0.517647058823530,0.411764705882353;0.905882352941177,0.533333333333333,0.423529411764706;0.909803921568627,0.545098039215686,0.431372549019608;0.917647058823529,0.552941176470588,0.439215686274510;0.921568627450980,0.564705882352941,0.447058823529412;0.925490196078431,0.576470588235294,0.454901960784314;0.929411764705882,0.588235294117647,0.462745098039216;0.937254901960784,0.607843137254902,0.478431372549020;0.945098039215686,0.619607843137255,0.486274509803922;0.949019607843137,0.627450980392157,0.494117647058824;0.952941176470588,0.639215686274510,0.501960784313726;0.956862745098039,0.650980392156863,0.513725490196078;0.956862745098039,0.658823529411765,0.525490196078431;0.960784313725490,0.670588235294118,0.541176470588235;0.960784313725490,0.674509803921569,0.545098039215686;0.960784313725490,0.690196078431373,0.564705882352941;0.964705882352941,0.698039215686275,0.576470588235294;0.964705882352941,0.705882352941177,0.588235294117647;0.968627450980392,0.713725490196078,0.596078431372549;0.968627450980392,0.725490196078431,0.607843137254902;0.968627450980392,0.733333333333333,0.619607843137255;0.972549019607843,0.749019607843137,0.639215686274510;0.972549019607843,0.752941176470588,0.643137254901961;0.976470588235294,0.764705882352941,0.662745098039216;0.976470588235294,0.772549019607843,0.670588235294118;0.976470588235294,0.780392156862745,0.682352941176471;0.980392156862745,0.792156862745098,0.694117647058824;0.980392156862745,0.800000000000000,0.705882352941177;0.980392156862745,0.807843137254902,0.713725490196078;0.984313725490196,0.823529411764706,0.737254901960784;0.984313725490196,0.831372549019608,0.745098039215686;0.988235294117647,0.839215686274510,0.756862745098039;0.988235294117647,0.847058823529412,0.768627450980392;0.992156862745098,0.858823529411765,0.780392156862745;0.988235294117647,0.862745098039216,0.784313725490196;0.988235294117647,0.870588235294118,0.796078431372549;0.988235294117647,0.870588235294118,0.800000000000000;0.984313725490196,0.878431372549020,0.815686274509804;0.984313725490196,0.882352941176471,0.823529411764706;0.984313725490196,0.886274509803922,0.831372549019608;0.984313725490196,0.890196078431373,0.839215686274510;0.980392156862745,0.894117647058824,0.843137254901961;0.980392156862745,0.898039215686275,0.850980392156863;0.980392156862745,0.909803921568627,0.866666666666667;0.976470588235294,0.913725490196078,0.870588235294118;0.976470588235294,0.917647058823529,0.882352941176471;0.976470588235294,0.921568627450980,0.890196078431373;0.976470588235294,0.925490196078431,0.898039215686275;0.976470588235294,0.929411764705882,0.905882352941177;0.972549019607843,0.933333333333333,0.913725490196078;0.972549019607843,0.937254901960784,0.917647058823529;0.972549019607843,0.949019607843137,0.933333333333333;0.968627450980392,0.952941176470588,0.941176470588235;0.968627450980392,0.956862745098039,0.949019607843137;0.968627450980392,0.960784313725490,0.956862745098039;0.968627450980392,0.964705882352941,0.964705882352941;0.964705882352941,0.964705882352941,0.964705882352941;0.952941176470588,0.960784313725490,0.964705882352941;0.952941176470588,0.960784313725490,0.964705882352941;0.941176470588235,0.952941176470588,0.960784313725490;0.933333333333333,0.952941176470588,0.960784313725490;0.929411764705882,0.949019607843137,0.960784313725490;0.921568627450980,0.945098039215686,0.956862745098039;0.917647058823529,0.945098039215686,0.956862745098039;0.909803921568627,0.941176470588235,0.956862745098039;0.898039215686275,0.933333333333333,0.952941176470588;0.894117647058824,0.933333333333333,0.952941176470588;0.886274509803922,0.929411764705882,0.952941176470588;0.882352941176471,0.925490196078431,0.952941176470588;0.874509803921569,0.925490196078431,0.949019607843137;0.862745098039216,0.917647058823529,0.949019607843137;0.862745098039216,0.917647058823529,0.949019607843137;0.858823529411765,0.913725490196078,0.945098039215686;0.847058823529412,0.909803921568627,0.945098039215686;0.839215686274510,0.905882352941177,0.945098039215686;0.835294117647059,0.905882352941177,0.941176470588235;0.827450980392157,0.901960784313726,0.941176470588235;0.823529411764706,0.898039215686275,0.941176470588235;0.819607843137255,0.898039215686275,0.941176470588235;0.800000000000000,0.886274509803922,0.933333333333333;0.796078431372549,0.886274509803922,0.933333333333333;0.780392156862745,0.874509803921569,0.929411764705882;0.768627450980392,0.870588235294118,0.925490196078431;0.760784313725490,0.866666666666667,0.921568627450980;0.745098039215686,0.858823529411765,0.917647058823529;0.741176470588235,0.854901960784314,0.917647058823529;0.729411764705882,0.850980392156863,0.913725490196078;0.709803921568628,0.843137254901961,0.909803921568627;0.701960784313725,0.835294117647059,0.905882352941177;0.690196078431373,0.831372549019608,0.901960784313726;0.682352941176471,0.827450980392157,0.901960784313726;0.670588235294118,0.823529411764706,0.898039215686275;0.654901960784314,0.811764705882353,0.894117647058824;0.650980392156863,0.811764705882353,0.894117647058824;0.643137254901961,0.807843137254902,0.890196078431373;0.623529411764706,0.796078431372549,0.882352941176471;0.615686274509804,0.792156862745098,0.882352941176471;0.603921568627451,0.788235294117647,0.878431372549020;0.592156862745098,0.784313725490196,0.874509803921569;0.584313725490196,0.776470588235294,0.874509803921569;0.576470588235294,0.772549019607843,0.870588235294118;0.552941176470588,0.760784313725490,0.862745098039216;0.549019607843137,0.756862745098039,0.862745098039216;0.529411764705882,0.745098039215686,0.854901960784314;0.517647058823530,0.737254901960784,0.850980392156863;0.501960784313726,0.729411764705882,0.847058823529412;0.482352941176471,0.717647058823529,0.839215686274510;0.478431372549020,0.713725490196078,0.839215686274510;0.466666666666667,0.705882352941177,0.835294117647059;0.443137254901961,0.690196078431373,0.823529411764706;0.431372549019608,0.682352941176471,0.819607843137255;0.419607843137255,0.674509803921569,0.815686274509804;0.407843137254902,0.666666666666667,0.811764705882353;0.396078431372549,0.658823529411765,0.807843137254902;0.368627450980392,0.643137254901961,0.800000000000000;0.360784313725490,0.639215686274510,0.796078431372549;0.356862745098039,0.635294117647059,0.796078431372549;0.333333333333333,0.619607843137255,0.788235294117647;0.321568627450980,0.611764705882353,0.784313725490196;0.309803921568627,0.603921568627451,0.780392156862745;0.294117647058824,0.592156862745098,0.776470588235294;0.286274509803922,0.588235294117647,0.772549019607843;0.262745098039216,0.576470588235294,0.764705882352941;0.254901960784314,0.568627450980392,0.760784313725490;0.250980392156863,0.564705882352941,0.756862745098039;0.247058823529412,0.552941176470588,0.752941176470588;0.239215686274510,0.545098039215686,0.749019607843137;0.235294117647059,0.541176470588235,0.745098039215686;0.227450980392157,0.529411764705882,0.737254901960784;0.223529411764706,0.525490196078431,0.737254901960784;0.219607843137255,0.517647058823530,0.733333333333333;0.207843137254902,0.505882352941176,0.725490196078431;0.203921568627451,0.498039215686275,0.725490196078431;0.200000000000000,0.490196078431373,0.721568627450980;0.192156862745098,0.486274509803922,0.717647058823529;0.188235294117647,0.478431372549020,0.713725490196078;0.176470588235294,0.462745098039216,0.705882352941177;0.172549019607843,0.458823529411765,0.701960784313725;0.172549019607843,0.458823529411765,0.701960784313725;0.160784313725490,0.443137254901961,0.694117647058824;0.156862745098039,0.435294117647059,0.690196078431373;0.152941176470588,0.427450980392157,0.690196078431373;0.145098039215686,0.419607843137255,0.686274509803922;0.141176470588235,0.415686274509804,0.682352941176471;0.129411764705882,0.400000000000000,0.674509803921569;0.125490196078431,0.392156862745098,0.666666666666667;0.121568627450980,0.388235294117647,0.658823529411765;0.117647058823529,0.376470588235294,0.643137254901961;0.113725490196078,0.368627450980392,0.631372549019608;0.109803921568627,0.360784313725490,0.619607843137255;0.0980392156862745,0.345098039215686,0.600000000000000;0.0980392156862745,0.341176470588235,0.592156862745098;0.0941176470588235,0.337254901960784,0.584313725490196;0.0862745098039216,0.317647058823529,0.564705882352941;0.0823529411764706,0.309803921568627,0.552941176470588;0.0784313725490196,0.301960784313725,0.541176470588235;0.0745098039215686,0.294117647058824,0.529411764705882;0.0705882352941177,0.286274509803922,0.517647058823530;0.0588235294117647,0.270588235294118,0.494117647058824;0.0549019607843137,0.262745098039216,0.486274509803922;0.0549019607843137,0.258823529411765,0.478431372549020]; + [0.647058823529412,0,0.149019607843137;0.650980392156863,0.00392156862745098,0.149019607843137;0.654901960784314,0.00784313725490196,0.149019607843137;0.666666666666667,0.0196078431372549,0.149019607843137;0.674509803921569,0.0274509803921569,0.149019607843137;0.682352941176471,0.0352941176470588,0.149019607843137;0.694117647058824,0.0470588235294118,0.149019607843137;0.698039215686275,0.0509803921568627,0.149019607843137;0.713725490196078,0.0627450980392157,0.149019607843137;0.721568627450980,0.0705882352941177,0.149019607843137;0.725490196078431,0.0745098039215686,0.149019607843137;0.737254901960784,0.0862745098039216,0.149019607843137;0.745098039215686,0.0941176470588235,0.149019607843137;0.752941176470588,0.101960784313725,0.149019607843137;0.768627450980392,0.117647058823529,0.149019607843137;0.772549019607843,0.121568627450980,0.149019607843137;0.784313725490196,0.129411764705882,0.149019607843137;0.792156862745098,0.137254901960784,0.149019607843137;0.800000000000000,0.145098039215686,0.149019607843137;0.807843137254902,0.152941176470588,0.149019607843137;0.815686274509804,0.160784313725490,0.149019607843137;0.823529411764706,0.168627450980392,0.149019607843137;0.839215686274510,0.184313725490196,0.149019607843137;0.843137254901961,0.192156862745098,0.152941176470588;0.843137254901961,0.196078431372549,0.152941176470588;0.850980392156863,0.207843137254902,0.160784313725490;0.854901960784314,0.219607843137255,0.164705882352941;0.862745098039216,0.227450980392157,0.168627450980392;0.870588235294118,0.243137254901961,0.180392156862745;0.870588235294118,0.247058823529412,0.180392156862745;0.878431372549020,0.266666666666667,0.188235294117647;0.882352941176471,0.274509803921569,0.192156862745098;0.886274509803922,0.286274509803922,0.196078431372549;0.894117647058824,0.294117647058824,0.200000000000000;0.898039215686275,0.301960784313725,0.203921568627451;0.901960784313726,0.313725490196078,0.207843137254902;0.909803921568627,0.333333333333333,0.219607843137255;0.913725490196078,0.337254901960784,0.223529411764706;0.917647058823529,0.349019607843137,0.227450980392157;0.925490196078431,0.360784313725490,0.231372549019608;0.929411764705882,0.368627450980392,0.235294117647059;0.933333333333333,0.380392156862745,0.239215686274510;0.937254901960784,0.392156862745098,0.243137254901961;0.941176470588235,0.396078431372549,0.247058823529412;0.949019607843137,0.415686274509804,0.254901960784314;0.956862745098039,0.427450980392157,0.262745098039216;0.956862745098039,0.431372549019608,0.262745098039216;0.956862745098039,0.447058823529412,0.270588235294118;0.960784313725490,0.454901960784314,0.274509803921569;0.960784313725490,0.466666666666667,0.278431372549020;0.964705882352941,0.482352941176471,0.286274509803922;0.964705882352941,0.486274509803922,0.290196078431373;0.964705882352941,0.505882352941176,0.298039215686275;0.968627450980392,0.513725490196078,0.301960784313725;0.968627450980392,0.525490196078431,0.305882352941177;0.968627450980392,0.537254901960784,0.309803921568627;0.972549019607843,0.545098039215686,0.317647058823529;0.972549019607843,0.556862745098039,0.321568627450980;0.976470588235294,0.576470588235294,0.329411764705882;0.976470588235294,0.580392156862745,0.333333333333333;0.980392156862745,0.596078431372549,0.337254901960784;0.980392156862745,0.603921568627451,0.345098039215686;0.980392156862745,0.615686274509804,0.349019607843137;0.984313725490196,0.623529411764706,0.352941176470588;0.984313725490196,0.639215686274510,0.356862745098039;0.984313725490196,0.647058823529412,0.360784313725490;0.988235294117647,0.666666666666667,0.372549019607843;0.988235294117647,0.674509803921569,0.376470588235294;0.992156862745098,0.682352941176471,0.380392156862745;0.992156862745098,0.690196078431373,0.388235294117647;0.992156862745098,0.698039215686275,0.396078431372549;0.992156862745098,0.705882352941177,0.403921568627451;0.992156862745098,0.721568627450980,0.419607843137255;0.992156862745098,0.725490196078431,0.419607843137255;0.992156862745098,0.737254901960784,0.431372549019608;0.992156862745098,0.745098039215686,0.439215686274510;0.992156862745098,0.752941176470588,0.447058823529412;0.992156862745098,0.760784313725490,0.454901960784314;0.992156862745098,0.768627450980392,0.462745098039216;0.992156862745098,0.776470588235294,0.470588235294118;0.992156862745098,0.792156862745098,0.482352941176471;0.992156862745098,0.796078431372549,0.486274509803922;0.992156862745098,0.807843137254902,0.498039215686275;0.992156862745098,0.815686274509804,0.505882352941176;0.992156862745098,0.823529411764706,0.513725490196078;0.992156862745098,0.831372549019608,0.517647058823530;0.992156862745098,0.843137254901961,0.529411764705882;0.992156862745098,0.847058823529412,0.533333333333333;0.992156862745098,0.862745098039216,0.549019607843137;0.992156862745098,0.870588235294118,0.556862745098039;0.996078431372549,0.878431372549020,0.564705882352941;0.996078431372549,0.882352941176471,0.568627450980392;0.996078431372549,0.886274509803922,0.576470588235294;0.996078431372549,0.890196078431373,0.584313725490196;0.996078431372549,0.901960784313726,0.600000000000000;0.996078431372549,0.901960784313726,0.603921568627451;0.996078431372549,0.909803921568627,0.611764705882353;0.996078431372549,0.913725490196078,0.619607843137255;0.996078431372549,0.917647058823529,0.627450980392157;0.996078431372549,0.925490196078431,0.635294117647059;0.996078431372549,0.929411764705882,0.643137254901961;0.996078431372549,0.933333333333333,0.650980392156863;0.996078431372549,0.945098039215686,0.662745098039216;0.996078431372549,0.949019607843137,0.670588235294118;0.996078431372549,0.952941176470588,0.678431372549020;0.996078431372549,0.956862745098039,0.686274509803922;0.996078431372549,0.960784313725490,0.694117647058824;0.996078431372549,0.968627450980392,0.701960784313725;0.996078431372549,0.976470588235294,0.709803921568628;0.996078431372549,0.976470588235294,0.713725490196078;0.996078431372549,0.984313725490196,0.729411764705882;0.996078431372549,0.992156862745098,0.737254901960784;0.996078431372549,0.996078431372549,0.745098039215686;0.996078431372549,0.996078431372549,0.752941176470588;0.992156862745098,0.996078431372549,0.760784313725490;0.984313725490196,0.992156862745098,0.768627450980392;0.976470588235294,0.988235294117647,0.788235294117647;0.976470588235294,0.988235294117647,0.792156862745098;0.968627450980392,0.984313725490196,0.803921568627451;0.960784313725490,0.984313725490196,0.811764705882353;0.956862745098039,0.984313725490196,0.823529411764706;0.952941176470588,0.980392156862745,0.831372549019608;0.949019607843137,0.980392156862745,0.839215686274510;0.945098039215686,0.976470588235294,0.847058823529412;0.933333333333333,0.972549019607843,0.866666666666667;0.929411764705882,0.972549019607843,0.874509803921569;0.925490196078431,0.968627450980392,0.882352941176471;0.917647058823529,0.968627450980392,0.890196078431373;0.913725490196078,0.964705882352941,0.901960784313726;0.909803921568627,0.964705882352941,0.909803921568627;0.901960784313726,0.960784313725490,0.921568627450980;0.901960784313726,0.960784313725490,0.925490196078431;0.890196078431373,0.956862745098039,0.945098039215686;0.886274509803922,0.952941176470588,0.952941176470588;0.882352941176471,0.952941176470588,0.960784313725490;0.878431372549020,0.952941176470588,0.968627450980392;0.866666666666667,0.945098039215686,0.968627450980392;0.858823529411765,0.941176470588235,0.964705882352941;0.843137254901961,0.933333333333333,0.960784313725490;0.839215686274510,0.929411764705882,0.960784313725490;0.827450980392157,0.925490196078431,0.956862745098039;0.819607843137255,0.921568627450980,0.952941176470588;0.811764705882353,0.917647058823529,0.952941176470588;0.803921568627451,0.913725490196078,0.949019607843137;0.792156862745098,0.909803921568627,0.949019607843137;0.788235294117647,0.905882352941177,0.945098039215686;0.768627450980392,0.898039215686275,0.941176470588235;0.760784313725490,0.894117647058824,0.937254901960784;0.752941176470588,0.890196078431373,0.937254901960784;0.745098039215686,0.886274509803922,0.933333333333333;0.737254901960784,0.882352941176471,0.933333333333333;0.729411764705882,0.878431372549020,0.929411764705882;0.717647058823529,0.870588235294118,0.925490196078431;0.713725490196078,0.870588235294118,0.925490196078431;0.698039215686275,0.862745098039216,0.921568627450980;0.690196078431373,0.858823529411765,0.917647058823529;0.682352941176471,0.854901960784314,0.913725490196078;0.674509803921569,0.850980392156863,0.913725490196078;0.662745098039216,0.847058823529412,0.909803921568627;0.654901960784314,0.839215686274510,0.905882352941177;0.639215686274510,0.823529411764706,0.898039215686275;0.635294117647059,0.819607843137255,0.894117647058824;0.623529411764706,0.811764705882353,0.890196078431373;0.611764705882353,0.803921568627451,0.886274509803922;0.603921568627451,0.800000000000000,0.882352941176471;0.596078431372549,0.792156862745098,0.882352941176471;0.584313725490196,0.780392156862745,0.878431372549020;0.580392156862745,0.776470588235294,0.874509803921569;0.564705882352941,0.764705882352941,0.866666666666667;0.552941176470588,0.756862745098039,0.862745098039216;0.545098039215686,0.749019607843137,0.858823529411765;0.537254901960784,0.745098039215686,0.854901960784314;0.529411764705882,0.737254901960784,0.850980392156863;0.521568627450980,0.729411764705882,0.847058823529412;0.505882352941176,0.717647058823529,0.839215686274510;0.498039215686275,0.713725490196078,0.839215686274510;0.486274509803922,0.701960784313725,0.831372549019608;0.478431372549020,0.698039215686275,0.827450980392157;0.470588235294118,0.690196078431373,0.823529411764706;0.458823529411765,0.678431372549020,0.819607843137255;0.454901960784314,0.678431372549020,0.819607843137255;0.447058823529412,0.666666666666667,0.811764705882353;0.431372549019608,0.650980392156863,0.803921568627451;0.427450980392157,0.647058823529412,0.800000000000000;0.415686274509804,0.635294117647059,0.796078431372549;0.407843137254902,0.623529411764706,0.792156862745098;0.403921568627451,0.615686274509804,0.788235294117647;0.396078431372549,0.607843137254902,0.780392156862745;0.384313725490196,0.596078431372549,0.776470588235294;0.380392156862745,0.592156862745098,0.772549019607843;0.364705882352941,0.572549019607843,0.764705882352941;0.360784313725490,0.564705882352941,0.760784313725490;0.352941176470588,0.556862745098039,0.756862745098039;0.345098039215686,0.545098039215686,0.749019607843137;0.337254901960784,0.537254901960784,0.745098039215686;0.329411764705882,0.529411764705882,0.741176470588235;0.313725490196078,0.513725490196078,0.733333333333333;0.313725490196078,0.509803921568627,0.733333333333333;0.301960784313725,0.494117647058824,0.725490196078431;0.294117647058824,0.486274509803922,0.717647058823529;0.286274509803922,0.478431372549020,0.713725490196078;0.274509803921569,0.466666666666667,0.705882352941177;0.270588235294118,0.462745098039216,0.705882352941177;0.266666666666667,0.450980392156863,0.701960784313725;0.262745098039216,0.431372549019608,0.690196078431373;0.258823529411765,0.423529411764706,0.686274509803922;0.254901960784314,0.411764705882353,0.682352941176471;0.250980392156863,0.403921568627451,0.678431372549020;0.247058823529412,0.392156862745098,0.674509803921569;0.247058823529412,0.384313725490196,0.666666666666667;0.239215686274510,0.368627450980392,0.658823529411765;0.239215686274510,0.364705882352941,0.658823529411765;0.231372549019608,0.345098039215686,0.650980392156863;0.231372549019608,0.337254901960784,0.643137254901961;0.227450980392157,0.325490196078431,0.639215686274510;0.223529411764706,0.313725490196078,0.635294117647059;0.219607843137255,0.305882352941177,0.631372549019608;0.219607843137255,0.298039215686275,0.623529411764706]; + [0.647058823529412,0,0.149019607843137;0.650980392156863,0.00392156862745098,0.149019607843137;0.658823529411765,0.0117647058823529,0.149019607843137;0.666666666666667,0.0196078431372549,0.149019607843137;0.682352941176471,0.0352941176470588,0.149019607843137;0.690196078431373,0.0431372549019608,0.149019607843137;0.698039215686275,0.0509803921568627,0.149019607843137;0.705882352941177,0.0588235294117647,0.149019607843137;0.713725490196078,0.0627450980392157,0.149019607843137;0.721568627450980,0.0705882352941177,0.149019607843137;0.733333333333333,0.0823529411764706,0.149019607843137;0.737254901960784,0.0862745098039216,0.149019607843137;0.752941176470588,0.101960784313725,0.149019607843137;0.760784313725490,0.109803921568627,0.149019607843137;0.768627450980392,0.117647058823529,0.149019607843137;0.776470588235294,0.125490196078431,0.149019607843137;0.784313725490196,0.129411764705882,0.149019607843137;0.792156862745098,0.137254901960784,0.149019607843137;0.807843137254902,0.152941176470588,0.149019607843137;0.811764705882353,0.156862745098039,0.149019607843137;0.823529411764706,0.168627450980392,0.149019607843137;0.831372549019608,0.176470588235294,0.149019607843137;0.839215686274510,0.184313725490196,0.149019607843137;0.843137254901961,0.192156862745098,0.152941176470588;0.847058823529412,0.200000000000000,0.156862745098039;0.850980392156863,0.207843137254902,0.160784313725490;0.862745098039216,0.227450980392157,0.168627450980392;0.866666666666667,0.239215686274510,0.176470588235294;0.870588235294118,0.247058823529412,0.180392156862745;0.874509803921569,0.254901960784314,0.184313725490196;0.878431372549020,0.266666666666667,0.188235294117647;0.882352941176471,0.274509803921569,0.192156862745098;0.890196078431373,0.290196078431373,0.200000000000000;0.894117647058824,0.294117647058824,0.200000000000000;0.901960784313726,0.313725490196078,0.207843137254902;0.905882352941177,0.321568627450980,0.211764705882353;0.909803921568627,0.333333333333333,0.219607843137255;0.913725490196078,0.345098039215686,0.223529411764706;0.917647058823529,0.349019607843137,0.227450980392157;0.925490196078431,0.360784313725490,0.231372549019608;0.933333333333333,0.380392156862745,0.239215686274510;0.937254901960784,0.384313725490196,0.243137254901961;0.941176470588235,0.396078431372549,0.247058823529412;0.945098039215686,0.407843137254902,0.250980392156863;0.949019607843137,0.415686274509804,0.254901960784314;0.956862745098039,0.427450980392157,0.262745098039216;0.956862745098039,0.439215686274510,0.266666666666667;0.956862745098039,0.447058823529412,0.270588235294118;0.960784313725490,0.466666666666667,0.278431372549020;0.960784313725490,0.474509803921569,0.282352941176471;0.964705882352941,0.486274509803922,0.290196078431373;0.964705882352941,0.494117647058824,0.294117647058824;0.964705882352941,0.505882352941176,0.298039215686275;0.968627450980392,0.513725490196078,0.301960784313725;0.968627450980392,0.533333333333333,0.309803921568627;0.968627450980392,0.537254901960784,0.309803921568627;0.972549019607843,0.556862745098039,0.321568627450980;0.972549019607843,0.564705882352941,0.325490196078431;0.976470588235294,0.576470588235294,0.329411764705882;0.976470588235294,0.588235294117647,0.333333333333333;0.980392156862745,0.596078431372549,0.337254901960784;0.980392156862745,0.603921568627451,0.345098039215686;0.984313725490196,0.623529411764706,0.352941176470588;0.984313725490196,0.631372549019608,0.356862745098039;0.984313725490196,0.647058823529412,0.360784313725490;0.988235294117647,0.654901960784314,0.368627450980392;0.988235294117647,0.666666666666667,0.372549019607843;0.992156862745098,0.682352941176471,0.380392156862745;0.992156862745098,0.686274509803922,0.384313725490196;0.992156862745098,0.690196078431373,0.388235294117647;0.992156862745098,0.705882352941177,0.400000000000000;0.992156862745098,0.713725490196078,0.407843137254902;0.992156862745098,0.721568627450980,0.415686274509804;0.992156862745098,0.729411764705882,0.419607843137255;0.992156862745098,0.737254901960784,0.427450980392157;0.992156862745098,0.745098039215686,0.431372549019608;0.992156862745098,0.760784313725490,0.447058823529412;0.992156862745098,0.764705882352941,0.447058823529412;0.992156862745098,0.776470588235294,0.458823529411765;0.992156862745098,0.784313725490196,0.466666666666667;0.992156862745098,0.792156862745098,0.470588235294118;0.992156862745098,0.803921568627451,0.482352941176471;0.992156862745098,0.807843137254902,0.486274509803922;0.992156862745098,0.815686274509804,0.490196078431373;0.992156862745098,0.831372549019608,0.505882352941176;0.992156862745098,0.835294117647059,0.509803921568627;0.992156862745098,0.847058823529412,0.517647058823530;0.992156862745098,0.854901960784314,0.525490196078431;0.992156862745098,0.862745098039216,0.529411764705882;0.996078431372549,0.878431372549020,0.545098039215686;0.996078431372549,0.878431372549020,0.549019607843137;0.996078431372549,0.882352941176471,0.552941176470588;0.996078431372549,0.890196078431373,0.568627450980392;0.996078431372549,0.894117647058824,0.576470588235294;0.996078431372549,0.901960784313726,0.584313725490196;0.996078431372549,0.905882352941177,0.592156862745098;0.996078431372549,0.909803921568627,0.600000000000000;0.996078431372549,0.917647058823529,0.615686274509804;0.996078431372549,0.925490196078431,0.623529411764706;0.996078431372549,0.925490196078431,0.627450980392157;0.996078431372549,0.933333333333333,0.639215686274510;0.996078431372549,0.937254901960784,0.647058823529412;0.996078431372549,0.945098039215686,0.654901960784314;0.996078431372549,0.952941176470588,0.666666666666667;0.996078431372549,0.952941176470588,0.670588235294118;0.996078431372549,0.956862745098039,0.678431372549020;0.996078431372549,0.968627450980392,0.694117647058824;0.996078431372549,0.972549019607843,0.701960784313725;0.996078431372549,0.976470588235294,0.709803921568628;0.996078431372549,0.980392156862745,0.717647058823529;0.996078431372549,0.984313725490196,0.725490196078431;0.996078431372549,0.996078431372549,0.741176470588235;0.996078431372549,0.996078431372549,0.741176470588235;0.996078431372549,0.996078431372549,0.741176470588235;0.984313725490196,0.992156862745098,0.725490196078431;0.976470588235294,0.988235294117647,0.717647058823529;0.972549019607843,0.988235294117647,0.709803921568628;0.964705882352941,0.984313725490196,0.701960784313725;0.960784313725490,0.980392156862745,0.694117647058824;0.949019607843137,0.976470588235294,0.678431372549020;0.941176470588235,0.976470588235294,0.670588235294118;0.941176470588235,0.976470588235294,0.666666666666667;0.929411764705882,0.968627450980392,0.654901960784314;0.925490196078431,0.968627450980392,0.647058823529412;0.917647058823529,0.964705882352941,0.639215686274510;0.909803921568627,0.960784313725490,0.627450980392157;0.905882352941177,0.960784313725490,0.623529411764706;0.894117647058824,0.956862745098039,0.607843137254902;0.890196078431373,0.952941176470588,0.600000000000000;0.882352941176471,0.949019607843137,0.592156862745098;0.878431372549020,0.949019607843137,0.584313725490196;0.870588235294118,0.945098039215686,0.576470588235294;0.866666666666667,0.941176470588235,0.568627450980392;0.854901960784314,0.937254901960784,0.552941176470588;0.850980392156863,0.937254901960784,0.549019607843137;0.850980392156863,0.937254901960784,0.545098039215686;0.835294117647059,0.929411764705882,0.533333333333333;0.827450980392157,0.925490196078431,0.529411764705882;0.819607843137255,0.921568627450980,0.521568627450980;0.807843137254902,0.917647058823529,0.517647058823530;0.803921568627451,0.913725490196078,0.513725490196078;0.788235294117647,0.909803921568627,0.501960784313726;0.780392156862745,0.905882352941177,0.498039215686275;0.776470588235294,0.901960784313726,0.494117647058824;0.764705882352941,0.898039215686275,0.486274509803922;0.756862745098039,0.894117647058824,0.482352941176471;0.749019607843137,0.890196078431373,0.478431372549020;0.733333333333333,0.886274509803922,0.466666666666667;0.733333333333333,0.886274509803922,0.466666666666667;0.717647058823529,0.878431372549020,0.458823529411765;0.709803921568628,0.874509803921569,0.450980392156863;0.701960784313725,0.870588235294118,0.447058823529412;0.694117647058824,0.866666666666667,0.443137254901961;0.686274509803922,0.862745098039216,0.435294117647059;0.678431372549020,0.862745098039216,0.431372549019608;0.662745098039216,0.854901960784314,0.419607843137255;0.658823529411765,0.850980392156863,0.415686274509804;0.650980392156863,0.850980392156863,0.415686274509804;0.635294117647059,0.843137254901961,0.411764705882353;0.623529411764706,0.839215686274510,0.411764705882353;0.615686274509804,0.835294117647059,0.411764705882353;0.600000000000000,0.827450980392157,0.407843137254902;0.596078431372549,0.823529411764706,0.407843137254902;0.576470588235294,0.815686274509804,0.403921568627451;0.564705882352941,0.811764705882353,0.403921568627451;0.560784313725490,0.807843137254902,0.403921568627451;0.545098039215686,0.803921568627451,0.403921568627451;0.537254901960784,0.800000000000000,0.400000000000000;0.525490196078431,0.796078431372549,0.400000000000000;0.505882352941176,0.788235294117647,0.400000000000000;0.501960784313726,0.784313725490196,0.400000000000000;0.486274509803922,0.776470588235294,0.396078431372549;0.478431372549020,0.772549019607843,0.396078431372549;0.466666666666667,0.768627450980392,0.392156862745098;0.458823529411765,0.764705882352941,0.392156862745098;0.447058823529412,0.760784313725490,0.392156862745098;0.439215686274510,0.756862745098039,0.392156862745098;0.419607843137255,0.749019607843137,0.388235294117647;0.411764705882353,0.745098039215686,0.388235294117647;0.400000000000000,0.741176470588235,0.388235294117647;0.388235294117647,0.733333333333333,0.384313725490196;0.376470588235294,0.729411764705882,0.380392156862745;0.364705882352941,0.721568627450980,0.376470588235294;0.349019607843137,0.713725490196078,0.376470588235294;0.341176470588235,0.709803921568628,0.372549019607843;0.317647058823529,0.698039215686275,0.364705882352941;0.305882352941177,0.694117647058824,0.364705882352941;0.298039215686275,0.690196078431373,0.360784313725490;0.282352941176471,0.682352941176471,0.356862745098039;0.270588235294118,0.678431372549020,0.352941176470588;0.258823529411765,0.670588235294118,0.352941176470588;0.235294117647059,0.658823529411765,0.345098039215686;0.231372549019608,0.658823529411765,0.345098039215686;0.211764705882353,0.647058823529412,0.341176470588235;0.200000000000000,0.643137254901961,0.337254901960784;0.188235294117647,0.635294117647059,0.333333333333333;0.176470588235294,0.631372549019608,0.329411764705882;0.164705882352941,0.623529411764706,0.329411764705882;0.152941176470588,0.619607843137255,0.325490196078431;0.129411764705882,0.607843137254902,0.317647058823529;0.117647058823529,0.603921568627451,0.317647058823529;0.105882352941176,0.596078431372549,0.313725490196078;0.0980392156862745,0.592156862745098,0.309803921568627;0.0941176470588235,0.584313725490196,0.305882352941177;0.0901960784313726,0.576470588235294,0.301960784313725;0.0823529411764706,0.564705882352941,0.294117647058824;0.0823529411764706,0.560784313725490,0.294117647058824;0.0745098039215686,0.545098039215686,0.286274509803922;0.0705882352941177,0.537254901960784,0.282352941176471;0.0666666666666667,0.533333333333333,0.278431372549020;0.0627450980392157,0.525490196078431,0.274509803921569;0.0588235294117647,0.517647058823530,0.270588235294118;0.0549019607843137,0.509803921568627,0.266666666666667;0.0470588235294118,0.494117647058824,0.258823529411765;0.0431372549019608,0.490196078431373,0.254901960784314;0.0392156862745098,0.478431372549020,0.250980392156863;0.0352941176470588,0.470588235294118,0.247058823529412;0.0313725490196078,0.466666666666667,0.243137254901961]; + [0.619607843137255,0.00392156862745098,0.258823529411765;0.627450980392157,0.0117647058823529,0.258823529411765;0.635294117647059,0.0196078431372549,0.262745098039216;0.643137254901961,0.0313725490196078,0.262745098039216;0.654901960784314,0.0431372549019608,0.266666666666667;0.658823529411765,0.0470588235294118,0.266666666666667;0.678431372549020,0.0666666666666667,0.270588235294118;0.686274509803922,0.0784313725490196,0.274509803921569;0.694117647058824,0.0862745098039216,0.274509803921569;0.701960784313725,0.0941176470588235,0.278431372549020;0.709803921568628,0.105882352941176,0.278431372549020;0.717647058823529,0.113725490196078,0.282352941176471;0.733333333333333,0.129411764705882,0.286274509803922;0.737254901960784,0.133333333333333,0.286274509803922;0.752941176470588,0.152941176470588,0.290196078431373;0.760784313725490,0.160784313725490,0.290196078431373;0.768627450980392,0.172549019607843,0.294117647058824;0.776470588235294,0.180392156862745,0.294117647058824;0.788235294117647,0.188235294117647,0.298039215686275;0.796078431372549,0.200000000000000,0.298039215686275;0.811764705882353,0.219607843137255,0.301960784313725;0.815686274509804,0.223529411764706,0.305882352941177;0.827450980392157,0.235294117647059,0.305882352941177;0.835294117647059,0.243137254901961,0.305882352941177;0.839215686274510,0.250980392156863,0.305882352941177;0.847058823529412,0.258823529411765,0.301960784313725;0.850980392156863,0.270588235294118,0.301960784313725;0.854901960784314,0.274509803921569,0.298039215686275;0.862745098039216,0.286274509803922,0.294117647058824;0.870588235294118,0.294117647058824,0.294117647058824;0.874509803921569,0.301960784313725,0.294117647058824;0.878431372549020,0.309803921568627,0.290196078431373;0.882352941176471,0.317647058823529,0.290196078431373;0.886274509803922,0.325490196078431,0.286274509803922;0.898039215686275,0.337254901960784,0.282352941176471;0.898039215686275,0.341176470588235,0.282352941176471;0.905882352941177,0.352941176470588,0.278431372549020;0.913725490196078,0.360784313725490,0.278431372549020;0.917647058823529,0.368627450980392,0.274509803921569;0.921568627450980,0.376470588235294,0.274509803921569;0.925490196078431,0.380392156862745,0.270588235294118;0.929411764705882,0.388235294117647,0.270588235294118;0.941176470588235,0.403921568627451,0.266666666666667;0.945098039215686,0.411764705882353,0.262745098039216;0.949019607843137,0.419607843137255,0.262745098039216;0.956862745098039,0.427450980392157,0.262745098039216;0.956862745098039,0.435294117647059,0.266666666666667;0.956862745098039,0.447058823529412,0.270588235294118;0.960784313725490,0.458823529411765,0.274509803921569;0.960784313725490,0.466666666666667,0.278431372549020;0.964705882352941,0.486274509803922,0.290196078431373;0.964705882352941,0.494117647058824,0.294117647058824;0.964705882352941,0.505882352941176,0.298039215686275;0.968627450980392,0.513725490196078,0.301960784313725;0.968627450980392,0.525490196078431,0.305882352941177;0.968627450980392,0.537254901960784,0.309803921568627;0.972549019607843,0.556862745098039,0.321568627450980;0.972549019607843,0.560784313725490,0.321568627450980;0.976470588235294,0.576470588235294,0.329411764705882;0.976470588235294,0.584313725490196,0.333333333333333;0.980392156862745,0.596078431372549,0.337254901960784;0.980392156862745,0.603921568627451,0.345098039215686;0.980392156862745,0.615686274509804,0.349019607843137;0.984313725490196,0.623529411764706,0.352941176470588;0.984313725490196,0.647058823529412,0.360784313725490;0.988235294117647,0.654901960784314,0.368627450980392;0.988235294117647,0.666666666666667,0.372549019607843;0.988235294117647,0.674509803921569,0.376470588235294;0.992156862745098,0.682352941176471,0.380392156862745;0.992156862745098,0.690196078431373,0.388235294117647;0.992156862745098,0.701960784313725,0.400000000000000;0.992156862745098,0.705882352941177,0.400000000000000;0.992156862745098,0.721568627450980,0.415686274509804;0.992156862745098,0.729411764705882,0.419607843137255;0.992156862745098,0.737254901960784,0.427450980392157;0.992156862745098,0.745098039215686,0.431372549019608;0.992156862745098,0.752941176470588,0.439215686274510;0.992156862745098,0.760784313725490,0.447058823529412;0.992156862745098,0.776470588235294,0.458823529411765;0.992156862745098,0.780392156862745,0.462745098039216;0.992156862745098,0.792156862745098,0.470588235294118;0.992156862745098,0.800000000000000,0.478431372549020;0.992156862745098,0.807843137254902,0.486274509803922;0.992156862745098,0.815686274509804,0.490196078431373;0.992156862745098,0.823529411764706,0.498039215686275;0.992156862745098,0.831372549019608,0.505882352941176;0.992156862745098,0.847058823529412,0.517647058823530;0.992156862745098,0.854901960784314,0.525490196078431;0.992156862745098,0.862745098039216,0.529411764705882;0.992156862745098,0.870588235294118,0.537254901960784;0.996078431372549,0.878431372549020,0.545098039215686;0.996078431372549,0.882352941176471,0.552941176470588;0.996078431372549,0.890196078431373,0.564705882352941;0.996078431372549,0.890196078431373,0.568627450980392;0.996078431372549,0.901960784313726,0.584313725490196;0.996078431372549,0.905882352941177,0.592156862745098;0.996078431372549,0.909803921568627,0.600000000000000;0.996078431372549,0.913725490196078,0.611764705882353;0.996078431372549,0.917647058823529,0.615686274509804;0.996078431372549,0.925490196078431,0.623529411764706;0.996078431372549,0.933333333333333,0.639215686274510;0.996078431372549,0.937254901960784,0.643137254901961;0.996078431372549,0.945098039215686,0.654901960784314;0.996078431372549,0.949019607843137,0.662745098039216;0.996078431372549,0.952941176470588,0.670588235294118;0.996078431372549,0.956862745098039,0.678431372549020;0.996078431372549,0.964705882352941,0.690196078431373;0.996078431372549,0.968627450980392,0.694117647058824;0.996078431372549,0.976470588235294,0.709803921568628;0.996078431372549,0.980392156862745,0.717647058823529;0.996078431372549,0.984313725490196,0.725490196078431;0.996078431372549,0.992156862745098,0.733333333333333;0.996078431372549,0.996078431372549,0.741176470588235;0.996078431372549,0.996078431372549,0.745098039215686;0.988235294117647,0.996078431372549,0.733333333333333;0.988235294117647,0.996078431372549,0.733333333333333;0.980392156862745,0.992156862745098,0.721568627450980;0.976470588235294,0.988235294117647,0.713725490196078;0.972549019607843,0.988235294117647,0.709803921568628;0.968627450980392,0.988235294117647,0.701960784313725;0.964705882352941,0.984313725490196,0.698039215686275;0.960784313725490,0.984313725490196,0.690196078431373;0.952941176470588,0.980392156862745,0.678431372549020;0.949019607843137,0.980392156862745,0.674509803921569;0.945098039215686,0.976470588235294,0.666666666666667;0.941176470588235,0.976470588235294,0.658823529411765;0.937254901960784,0.972549019607843,0.654901960784314;0.929411764705882,0.972549019607843,0.643137254901961;0.929411764705882,0.972549019607843,0.639215686274510;0.925490196078431,0.968627450980392,0.635294117647059;0.917647058823529,0.964705882352941,0.623529411764706;0.913725490196078,0.964705882352941,0.619607843137255;0.909803921568627,0.964705882352941,0.611764705882353;0.905882352941177,0.960784313725490,0.607843137254902;0.901960784313726,0.960784313725490,0.600000000000000;0.901960784313726,0.960784313725490,0.596078431372549;0.882352941176471,0.952941176470588,0.596078431372549;0.878431372549020,0.952941176470588,0.596078431372549;0.862745098039216,0.945098039215686,0.600000000000000;0.854901960784314,0.941176470588235,0.603921568627451;0.847058823529412,0.937254901960784,0.603921568627451;0.831372549019608,0.929411764705882,0.607843137254902;0.827450980392157,0.929411764705882,0.607843137254902;0.819607843137255,0.925490196078431,0.611764705882353;0.800000000000000,0.917647058823529,0.615686274509804;0.792156862745098,0.913725490196078,0.615686274509804;0.780392156862745,0.909803921568627,0.619607843137255;0.772549019607843,0.905882352941177,0.619607843137255;0.764705882352941,0.901960784313726,0.623529411764706;0.745098039215686,0.898039215686275,0.627450980392157;0.741176470588235,0.898039215686275,0.627450980392157;0.737254901960784,0.894117647058824,0.627450980392157;0.717647058823529,0.886274509803922,0.631372549019608;0.709803921568628,0.882352941176471,0.631372549019608;0.701960784313725,0.878431372549020,0.635294117647059;0.690196078431373,0.874509803921569,0.635294117647059;0.682352941176471,0.870588235294118,0.639215686274510;0.674509803921569,0.866666666666667,0.639215686274510;0.650980392156863,0.858823529411765,0.643137254901961;0.647058823529412,0.858823529411765,0.643137254901961;0.631372549019608,0.850980392156863,0.643137254901961;0.619607843137255,0.847058823529412,0.643137254901961;0.611764705882353,0.843137254901961,0.643137254901961;0.592156862745098,0.835294117647059,0.643137254901961;0.588235294117647,0.835294117647059,0.643137254901961;0.580392156862745,0.831372549019608,0.643137254901961;0.556862745098039,0.819607843137255,0.643137254901961;0.545098039215686,0.815686274509804,0.643137254901961;0.537254901960784,0.811764705882353,0.643137254901961;0.525490196078431,0.807843137254902,0.643137254901961;0.513725490196078,0.803921568627451,0.643137254901961;0.494117647058824,0.796078431372549,0.643137254901961;0.486274509803922,0.792156862745098,0.643137254901961;0.482352941176471,0.792156862745098,0.643137254901961;0.462745098039216,0.784313725490196,0.643137254901961;0.450980392156863,0.780392156862745,0.643137254901961;0.439215686274510,0.776470588235294,0.643137254901961;0.427450980392157,0.772549019607843,0.643137254901961;0.419607843137255,0.768627450980392,0.643137254901961;0.400000000000000,0.760784313725490,0.647058823529412;0.388235294117647,0.749019607843137,0.647058823529412;0.384313725490196,0.745098039215686,0.650980392156863;0.372549019607843,0.733333333333333,0.654901960784314;0.364705882352941,0.721568627450980,0.658823529411765;0.356862745098039,0.713725490196078,0.662745098039216;0.345098039215686,0.701960784313725,0.670588235294118;0.341176470588235,0.694117647058824,0.670588235294118;0.333333333333333,0.686274509803922,0.674509803921569;0.317647058823529,0.670588235294118,0.682352941176471;0.309803921568627,0.658823529411765,0.686274509803922;0.301960784313725,0.650980392156863,0.690196078431373;0.294117647058824,0.643137254901961,0.694117647058824;0.286274509803922,0.635294117647059,0.698039215686275;0.270588235294118,0.615686274509804,0.705882352941177;0.266666666666667,0.611764705882353,0.709803921568628;0.262745098039216,0.607843137254902,0.709803921568628;0.247058823529412,0.588235294117647,0.713725490196078;0.239215686274510,0.580392156862745,0.717647058823529;0.231372549019608,0.572549019607843,0.721568627450980;0.219607843137255,0.556862745098039,0.725490196078431;0.215686274509804,0.552941176470588,0.729411764705882;0.200000000000000,0.537254901960784,0.737254901960784;0.196078431372549,0.525490196078431,0.737254901960784;0.200000000000000,0.521568627450980,0.733333333333333;0.211764705882353,0.509803921568627,0.729411764705882;0.219607843137255,0.501960784313726,0.725490196078431;0.223529411764706,0.490196078431373,0.721568627450980;0.239215686274510,0.474509803921569,0.713725490196078;0.239215686274510,0.470588235294118,0.713725490196078;0.243137254901961,0.466666666666667,0.709803921568628;0.258823529411765,0.447058823529412,0.698039215686275;0.266666666666667,0.439215686274510,0.694117647058824;0.270588235294118,0.431372549019608,0.690196078431373;0.278431372549020,0.423529411764706,0.686274509803922;0.286274509803922,0.411764705882353,0.682352941176471;0.298039215686275,0.396078431372549,0.674509803921569;0.305882352941177,0.388235294117647,0.670588235294118;0.305882352941177,0.384313725490196,0.670588235294118]; + [0.227450980392157,0.298039215686275,0.752941176470588;0.231372549019608,0.301960784313725,0.756862745098039;0.235294117647059,0.309803921568627,0.764705882352941;0.243137254901961,0.317647058823529,0.768627450980392;0.247058823529412,0.325490196078431,0.776470588235294;0.250980392156863,0.329411764705882,0.780392156862745;0.258823529411765,0.345098039215686,0.792156862745098;0.262745098039216,0.352941176470588,0.800000000000000;0.270588235294118,0.356862745098039,0.803921568627451;0.274509803921569,0.364705882352941,0.811764705882353;0.278431372549020,0.372549019607843,0.815686274509804;0.282352941176471,0.376470588235294,0.819607843137255;0.290196078431373,0.388235294117647,0.831372549019608;0.294117647058824,0.392156862745098,0.831372549019608;0.301960784313725,0.403921568627451,0.843137254901961;0.305882352941177,0.411764705882353,0.847058823529412;0.313725490196078,0.419607843137255,0.854901960784314;0.317647058823529,0.423529411764706,0.858823529411765;0.321568627450980,0.431372549019608,0.862745098039216;0.325490196078431,0.439215686274510,0.866666666666667;0.337254901960784,0.450980392156863,0.878431372549020;0.341176470588235,0.454901960784314,0.882352941176471;0.345098039215686,0.462745098039216,0.886274509803922;0.352941176470588,0.470588235294118,0.890196078431373;0.356862745098039,0.474509803921569,0.894117647058824;0.360784313725490,0.482352941176471,0.898039215686275;0.368627450980392,0.490196078431373,0.901960784313726;0.372549019607843,0.494117647058824,0.905882352941177;0.380392156862745,0.509803921568627,0.917647058823529;0.388235294117647,0.513725490196078,0.917647058823529;0.392156862745098,0.521568627450980,0.921568627450980;0.396078431372549,0.525490196078431,0.925490196078431;0.403921568627451,0.533333333333333,0.929411764705882;0.407843137254902,0.537254901960784,0.933333333333333;0.419607843137255,0.552941176470588,0.941176470588235;0.419607843137255,0.552941176470588,0.941176470588235;0.427450980392157,0.564705882352941,0.945098039215686;0.435294117647059,0.568627450980392,0.949019607843137;0.439215686274510,0.576470588235294,0.952941176470588;0.443137254901961,0.580392156862745,0.956862745098039;0.450980392156863,0.584313725490196,0.956862745098039;0.454901960784314,0.592156862745098,0.960784313725490;0.466666666666667,0.603921568627451,0.964705882352941;0.470588235294118,0.607843137254902,0.968627450980392;0.478431372549020,0.615686274509804,0.972549019607843;0.482352941176471,0.619607843137255,0.972549019607843;0.486274509803922,0.627450980392157,0.976470588235294;0.494117647058824,0.631372549019608,0.976470588235294;0.498039215686275,0.639215686274510,0.980392156862745;0.501960784313726,0.643137254901961,0.980392156862745;0.513725490196078,0.650980392156863,0.984313725490196;0.521568627450980,0.658823529411765,0.984313725490196;0.525490196078431,0.662745098039216,0.988235294117647;0.529411764705882,0.666666666666667,0.988235294117647;0.537254901960784,0.674509803921569,0.988235294117647;0.541176470588235,0.678431372549020,0.992156862745098;0.552941176470588,0.686274509803922,0.992156862745098;0.552941176470588,0.690196078431373,0.992156862745098;0.564705882352941,0.698039215686275,0.996078431372549;0.568627450980392,0.701960784313725,0.996078431372549;0.572549019607843,0.705882352941177,0.996078431372549;0.580392156862745,0.709803921568628,0.996078431372549;0.584313725490196,0.717647058823529,0.996078431372549;0.592156862745098,0.721568627450980,0.996078431372549;0.600000000000000,0.729411764705882,0.996078431372549;0.607843137254902,0.733333333333333,0.996078431372549;0.611764705882353,0.737254901960784,0.996078431372549;0.615686274509804,0.741176470588235,0.996078431372549;0.623529411764706,0.745098039215686,0.996078431372549;0.627450980392157,0.749019607843137,0.996078431372549;0.639215686274510,0.756862745098039,0.996078431372549;0.639215686274510,0.756862745098039,0.996078431372549;0.650980392156863,0.764705882352941,0.992156862745098;0.654901960784314,0.768627450980392,0.992156862745098;0.658823529411765,0.772549019607843,0.992156862745098;0.666666666666667,0.776470588235294,0.992156862745098;0.670588235294118,0.780392156862745,0.988235294117647;0.674509803921569,0.784313725490196,0.988235294117647;0.686274509803922,0.792156862745098,0.984313725490196;0.686274509803922,0.792156862745098,0.984313725490196;0.698039215686275,0.796078431372549,0.984313725490196;0.701960784313725,0.800000000000000,0.980392156862745;0.705882352941177,0.803921568627451,0.980392156862745;0.713725490196078,0.807843137254902,0.976470588235294;0.717647058823529,0.811764705882353,0.976470588235294;0.721568627450980,0.811764705882353,0.972549019607843;0.733333333333333,0.819607843137255,0.968627450980392;0.737254901960784,0.819607843137255,0.964705882352941;0.741176470588235,0.823529411764706,0.964705882352941;0.745098039215686,0.827450980392157,0.960784313725490;0.752941176470588,0.827450980392157,0.960784313725490;0.756862745098039,0.831372549019608,0.956862745098039;0.764705882352941,0.835294117647059,0.949019607843137;0.764705882352941,0.835294117647059,0.949019607843137;0.776470588235294,0.839215686274510,0.945098039215686;0.780392156862745,0.839215686274510,0.941176470588235;0.784313725490196,0.843137254901961,0.937254901960784;0.788235294117647,0.843137254901961,0.933333333333333;0.792156862745098,0.847058823529412,0.933333333333333;0.800000000000000,0.847058823529412,0.929411764705882;0.807843137254902,0.850980392156863,0.921568627450980;0.811764705882353,0.850980392156863,0.917647058823529;0.815686274509804,0.854901960784314,0.913725490196078;0.819607843137255,0.854901960784314,0.909803921568627;0.823529411764706,0.854901960784314,0.905882352941177;0.827450980392157,0.858823529411765,0.901960784313726;0.835294117647059,0.858823529411765,0.898039215686275;0.839215686274510,0.858823529411765,0.894117647058824;0.847058823529412,0.858823529411765,0.882352941176471;0.850980392156863,0.862745098039216,0.878431372549020;0.854901960784314,0.862745098039216,0.874509803921569;0.858823529411765,0.862745098039216,0.870588235294118;0.862745098039216,0.862745098039216,0.866666666666667;0.866666666666667,0.862745098039216,0.858823529411765;0.874509803921569,0.858823529411765,0.850980392156863;0.874509803921569,0.858823529411765,0.850980392156863;0.882352941176471,0.854901960784314,0.839215686274510;0.886274509803922,0.850980392156863,0.831372549019608;0.890196078431373,0.850980392156863,0.827450980392157;0.894117647058824,0.847058823529412,0.819607843137255;0.898039215686275,0.847058823529412,0.815686274509804;0.901960784313726,0.843137254901961,0.811764705882353;0.905882352941177,0.839215686274510,0.800000000000000;0.909803921568627,0.835294117647059,0.796078431372549;0.913725490196078,0.831372549019608,0.788235294117647;0.917647058823529,0.827450980392157,0.780392156862745;0.921568627450980,0.827450980392157,0.776470588235294;0.925490196078431,0.819607843137255,0.764705882352941;0.925490196078431,0.819607843137255,0.760784313725490;0.929411764705882,0.815686274509804,0.756862745098039;0.933333333333333,0.811764705882353,0.745098039215686;0.937254901960784,0.807843137254902,0.737254901960784;0.937254901960784,0.803921568627451,0.733333333333333;0.941176470588235,0.800000000000000,0.725490196078431;0.945098039215686,0.796078431372549,0.721568627450980;0.945098039215686,0.792156862745098,0.713725490196078;0.949019607843137,0.784313725490196,0.701960784313725;0.949019607843137,0.784313725490196,0.701960784313725;0.952941176470588,0.776470588235294,0.690196078431373;0.952941176470588,0.772549019607843,0.686274509803922;0.956862745098039,0.768627450980392,0.678431372549020;0.956862745098039,0.760784313725490,0.666666666666667;0.956862745098039,0.760784313725490,0.666666666666667;0.960784313725490,0.756862745098039,0.658823529411765;0.960784313725490,0.749019607843137,0.647058823529412;0.964705882352941,0.741176470588235,0.643137254901961;0.964705882352941,0.737254901960784,0.635294117647059;0.964705882352941,0.733333333333333,0.627450980392157;0.964705882352941,0.729411764705882,0.623529411764706;0.964705882352941,0.717647058823529,0.611764705882353;0.964705882352941,0.717647058823529,0.607843137254902;0.964705882352941,0.713725490196078,0.603921568627451;0.968627450980392,0.701960784313725,0.592156862745098;0.968627450980392,0.698039215686275,0.584313725490196;0.968627450980392,0.694117647058824,0.580392156862745;0.968627450980392,0.690196078431373,0.572549019607843;0.968627450980392,0.682352941176471,0.568627450980392;0.968627450980392,0.678431372549020,0.560784313725490;0.964705882352941,0.666666666666667,0.549019607843137;0.964705882352941,0.666666666666667,0.545098039215686;0.964705882352941,0.654901960784314,0.537254901960784;0.964705882352941,0.650980392156863,0.529411764705882;0.964705882352941,0.643137254901961,0.525490196078431;0.960784313725490,0.635294117647059,0.513725490196078;0.960784313725490,0.631372549019608,0.509803921568627;0.960784313725490,0.627450980392157,0.505882352941176;0.956862745098039,0.615686274509804,0.494117647058824;0.956862745098039,0.607843137254902,0.486274509803922;0.956862745098039,0.603921568627451,0.482352941176471;0.952941176470588,0.596078431372549,0.474509803921569;0.952941176470588,0.588235294117647,0.470588235294118;0.949019607843137,0.576470588235294,0.458823529411765;0.949019607843137,0.572549019607843,0.454901960784314;0.949019607843137,0.568627450980392,0.450980392156863;0.945098039215686,0.556862745098039,0.439215686274510;0.941176470588235,0.552941176470588,0.435294117647059;0.941176470588235,0.545098039215686,0.427450980392157;0.937254901960784,0.533333333333333,0.419607843137255;0.933333333333333,0.529411764705882,0.415686274509804;0.929411764705882,0.517647058823530,0.403921568627451;0.925490196078431,0.509803921568627,0.400000000000000;0.925490196078431,0.505882352941176,0.396078431372549;0.921568627450980,0.498039215686275,0.388235294117647;0.917647058823529,0.490196078431373,0.380392156862745;0.917647058823529,0.482352941176471,0.376470588235294;0.909803921568627,0.470588235294118,0.364705882352941;0.909803921568627,0.466666666666667,0.364705882352941;0.905882352941177,0.458823529411765,0.360784313725490;0.901960784313726,0.447058823529412,0.349019607843137;0.898039215686275,0.439215686274510,0.341176470588235;0.894117647058824,0.431372549019608,0.337254901960784;0.890196078431373,0.423529411764706,0.329411764705882;0.886274509803922,0.415686274509804,0.325490196078431;0.878431372549020,0.400000000000000,0.313725490196078;0.874509803921569,0.396078431372549,0.309803921568627;0.874509803921569,0.392156862745098,0.309803921568627;0.866666666666667,0.376470588235294,0.298039215686275;0.862745098039216,0.368627450980392,0.294117647058824;0.858823529411765,0.360784313725490,0.290196078431373;0.854901960784314,0.349019607843137,0.282352941176471;0.850980392156863,0.345098039215686,0.278431372549020;0.843137254901961,0.329411764705882,0.266666666666667;0.839215686274510,0.321568627450980,0.262745098039216;0.835294117647059,0.313725490196078,0.258823529411765;0.827450980392157,0.301960784313725,0.250980392156863;0.823529411764706,0.294117647058824,0.247058823529412;0.819607843137255,0.286274509803922,0.243137254901961;0.807843137254902,0.266666666666667,0.235294117647059;0.807843137254902,0.262745098039216,0.231372549019608;0.803921568627451,0.258823529411765,0.227450980392157;0.792156862745098,0.239215686274510,0.219607843137255;0.788235294117647,0.231372549019608,0.215686274509804;0.784313725490196,0.219607843137255,0.207843137254902;0.776470588235294,0.207843137254902,0.203921568627451;0.772549019607843,0.196078431372549,0.200000000000000;0.760784313725490,0.176470588235294,0.192156862745098;0.756862745098039,0.168627450980392,0.188235294117647;0.756862745098039,0.164705882352941,0.188235294117647]; + [0,0,1;0.00784313725490196,0.00784313725490196,1;0.0117647058823529,0.0117647058823529,1;0.0235294117647059,0.0235294117647059,1;0.0313725490196078,0.0313725490196078,1;0.0392156862745098,0.0392156862745098,1;0.0509803921568627,0.0509803921568627,1;0.0549019607843137,0.0549019607843137,1;0.0705882352941177,0.0705882352941177,1;0.0784313725490196,0.0784313725490196,1;0.0823529411764706,0.0823529411764706,1;0.0941176470588235,0.0941176470588235,1;0.101960784313725,0.101960784313725,1;0.109803921568627,0.109803921568627,1;0.125490196078431,0.125490196078431,1;0.129411764705882,0.129411764705882,1;0.141176470588235,0.141176470588235,1;0.149019607843137,0.149019607843137,1;0.156862745098039,0.156862745098039,1;0.164705882352941,0.164705882352941,1;0.172549019607843,0.172549019607843,1;0.180392156862745,0.180392156862745,1;0.196078431372549,0.196078431372549,1;0.203921568627451,0.203921568627451,1;0.207843137254902,0.207843137254902,1;0.219607843137255,0.219607843137255,1;0.227450980392157,0.227450980392157,1;0.235294117647059,0.235294117647059,1;0.247058823529412,0.247058823529412,1;0.250980392156863,0.250980392156863,1;0.266666666666667,0.266666666666667,1;0.274509803921569,0.274509803921569,1;0.282352941176471,0.282352941176471,1;0.286274509803922,0.286274509803922,1;0.298039215686275,0.298039215686275,1;0.305882352941177,0.305882352941177,1;0.317647058823529,0.317647058823529,1;0.325490196078431,0.325490196078431,1;0.337254901960784,0.337254901960784,1;0.345098039215686,0.345098039215686,1;0.349019607843137,0.349019607843137,1;0.360784313725490,0.360784313725490,1;0.372549019607843,0.372549019607843,1;0.376470588235294,0.376470588235294,1;0.392156862745098,0.392156862745098,1;0.400000000000000,0.400000000000000,1;0.403921568627451,0.403921568627451,1;0.411764705882353,0.411764705882353,1;0.423529411764706,0.423529411764706,1;0.431372549019608,0.431372549019608,1;0.443137254901961,0.443137254901961,1;0.447058823529412,0.447058823529412,1;0.462745098039216,0.462745098039216,1;0.470588235294118,0.470588235294118,1;0.474509803921569,0.474509803921569,1;0.486274509803922,0.486274509803922,1;0.494117647058824,0.494117647058824,1;0.501960784313726,0.501960784313726,1;0.513725490196078,0.513725490196078,1;0.521568627450980,0.521568627450980,1;0.533333333333333,0.533333333333333,1;0.541176470588235,0.541176470588235,1;0.549019607843137,0.549019607843137,1;0.556862745098039,0.556862745098039,1;0.568627450980392,0.568627450980392,1;0.572549019607843,0.572549019607843,1;0.588235294117647,0.588235294117647,1;0.596078431372549,0.596078431372549,1;0.603921568627451,0.603921568627451,1;0.611764705882353,0.611764705882353,1;0.619607843137255,0.619607843137255,1;0.627450980392157,0.627450980392157,1;0.639215686274510,0.639215686274510,1;0.643137254901961,0.643137254901961,1;0.658823529411765,0.658823529411765,1;0.666666666666667,0.666666666666667,1;0.674509803921569,0.674509803921569,1;0.682352941176471,0.682352941176471,1;0.690196078431373,0.690196078431373,1;0.698039215686275,0.698039215686275,1;0.713725490196078,0.713725490196078,1;0.717647058823529,0.717647058823529,1;0.729411764705882,0.729411764705882,1;0.737254901960784,0.737254901960784,1;0.745098039215686,0.745098039215686,1;0.752941176470588,0.752941176470588,1;0.760784313725490,0.760784313725490,1;0.764705882352941,0.764705882352941,1;0.784313725490196,0.784313725490196,1;0.792156862745098,0.792156862745098,1;0.800000000000000,0.800000000000000,1;0.807843137254902,0.807843137254902,1;0.815686274509804,0.815686274509804,1;0.823529411764706,0.823529411764706,1;0.839215686274510,0.839215686274510,1;0.843137254901961,0.843137254901961,1;0.854901960784314,0.854901960784314,1;0.862745098039216,0.862745098039216,1;0.870588235294118,0.870588235294118,1;0.878431372549020,0.878431372549020,1;0.886274509803922,0.886274509803922,1;0.890196078431373,0.890196078431373,1;0.909803921568627,0.909803921568627,1;0.917647058823529,0.917647058823529,1;0.925490196078431,0.925490196078431,1;0.933333333333333,0.933333333333333,1;0.941176470588235,0.941176470588235,1;0.949019607843137,0.949019607843137,1;0.960784313725490,0.960784313725490,1;0.964705882352941,0.964705882352941,1;0.980392156862745,0.980392156862745,1;0.988235294117647,0.988235294117647,1;0.996078431372549,0.996078431372549,1;1,0.996078431372549,0.996078431372549;1,0.988235294117647,0.988235294117647;1,0.980392156862745,0.980392156862745;1,0.964705882352941,0.964705882352941;1,0.960784313725490,0.960784313725490;1,0.949019607843137,0.949019607843137;1,0.941176470588235,0.941176470588235;1,0.933333333333333,0.933333333333333;1,0.925490196078431,0.925490196078431;1,0.917647058823529,0.917647058823529;1,0.909803921568627,0.909803921568627;1,0.894117647058824,0.894117647058824;1,0.886274509803922,0.886274509803922;1,0.878431372549020,0.878431372549020;1,0.870588235294118,0.870588235294118;1,0.862745098039216,0.862745098039216;1,0.854901960784314,0.854901960784314;1,0.843137254901961,0.843137254901961;1,0.839215686274510,0.839215686274510;1,0.823529411764706,0.823529411764706;1,0.815686274509804,0.815686274509804;1,0.807843137254902,0.807843137254902;1,0.800000000000000,0.800000000000000;1,0.792156862745098,0.792156862745098;1,0.784313725490196,0.784313725490196;1,0.764705882352941,0.764705882352941;1,0.760784313725490,0.760784313725490;1,0.752941176470588,0.752941176470588;1,0.745098039215686,0.745098039215686;1,0.737254901960784,0.737254901960784;1,0.729411764705882,0.729411764705882;1,0.717647058823529,0.717647058823529;1,0.713725490196078,0.713725490196078;1,0.698039215686275,0.698039215686275;1,0.690196078431373,0.690196078431373;1,0.682352941176471,0.682352941176471;1,0.674509803921569,0.674509803921569;1,0.666666666666667,0.666666666666667;1,0.658823529411765,0.658823529411765;1,0.643137254901961,0.643137254901961;1,0.639215686274510,0.639215686274510;1,0.627450980392157,0.627450980392157;1,0.619607843137255,0.619607843137255;1,0.611764705882353,0.611764705882353;1,0.603921568627451,0.603921568627451;1,0.596078431372549,0.596078431372549;1,0.588235294117647,0.588235294117647;1,0.572549019607843,0.572549019607843;1,0.568627450980392,0.568627450980392;1,0.556862745098039,0.556862745098039;1,0.549019607843137,0.549019607843137;1,0.541176470588235,0.541176470588235;1,0.533333333333333,0.533333333333333;1,0.521568627450980,0.521568627450980;1,0.513725490196078,0.513725490196078;1,0.501960784313726,0.501960784313726;1,0.494117647058824,0.494117647058824;1,0.486274509803922,0.486274509803922;1,0.474509803921569,0.474509803921569;1,0.470588235294118,0.470588235294118;1,0.462745098039216,0.462745098039216;1,0.447058823529412,0.447058823529412;1,0.443137254901961,0.443137254901961;1,0.431372549019608,0.431372549019608;1,0.423529411764706,0.423529411764706;1,0.411764705882353,0.411764705882353;1,0.403921568627451,0.403921568627451;1,0.400000000000000,0.400000000000000;1,0.392156862745098,0.392156862745098;1,0.376470588235294,0.376470588235294;1,0.372549019607843,0.372549019607843;1,0.360784313725490,0.360784313725490;1,0.349019607843137,0.349019607843137;1,0.345098039215686,0.345098039215686;1,0.337254901960784,0.337254901960784;1,0.325490196078431,0.325490196078431;1,0.317647058823529,0.317647058823529;1,0.305882352941177,0.305882352941177;1,0.298039215686275,0.298039215686275;1,0.286274509803922,0.286274509803922;1,0.282352941176471,0.282352941176471;1,0.274509803921569,0.274509803921569;1,0.266666666666667,0.266666666666667;1,0.250980392156863,0.250980392156863;1,0.247058823529412,0.247058823529412;1,0.235294117647059,0.235294117647059;1,0.223529411764706,0.223529411764706;1,0.219607843137255,0.219607843137255;1,0.207843137254902,0.207843137254902;1,0.203921568627451,0.203921568627451;1,0.192156862745098,0.192156862745098;1,0.180392156862745,0.180392156862745;1,0.172549019607843,0.172549019607843;1,0.160784313725490,0.160784313725490;1,0.156862745098039,0.156862745098039;1,0.149019607843137,0.149019607843137;1,0.141176470588235,0.141176470588235;1,0.125490196078431,0.125490196078431;1,0.125490196078431,0.125490196078431;1,0.109803921568627,0.109803921568627;1,0.0980392156862745,0.0980392156862745;1,0.0941176470588235,0.0941176470588235;1,0.0823529411764706,0.0823529411764706;1,0.0784313725490196,0.0784313725490196;1,0.0666666666666667,0.0666666666666667]; + [0,0,0.298039215686275;0,0,0.309803921568627;0,0,0.321568627450980;0,0,0.329411764705882;0,0,0.345098039215686;0,0,0.352941176470588;0,0,0.376470588235294;0,0,0.384313725490196;0,0,0.396078431372549;0,0,0.407843137254902;0,0,0.419607843137255;0,0,0.431372549019608;0,0,0.447058823529412;0,0,0.454901960784314;0,0,0.474509803921569;0,0,0.486274509803922;0,0,0.494117647058824;0,0,0.505882352941176;0,0,0.517647058823530;0,0,0.529411764705882;0,0,0.549019607843137;0,0,0.556862745098039;0,0,0.572549019607843;0,0,0.584313725490196;0,0,0.596078431372549;0,0,0.603921568627451;0,0,0.619607843137255;0,0,0.627450980392157;0,0,0.650980392156863;0,0,0.658823529411765;0,0,0.670588235294118;0,0,0.682352941176471;0,0,0.694117647058824;0,0,0.705882352941177;0,0,0.721568627450980;0,0,0.729411764705882;0,0,0.749019607843137;0,0,0.760784313725490;0,0,0.768627450980392;0,0,0.780392156862745;0,0,0.792156862745098;0,0,0.803921568627451;0,0,0.823529411764706;0,0,0.831372549019608;0,0,0.847058823529412;0,0,0.858823529411765;0,0,0.870588235294118;0,0,0.878431372549020;0,0,0.894117647058824;0,0,0.901960784313726;0,0,0.925490196078431;0,0,0.933333333333333;0,0,0.945098039215686;0,0,0.956862745098039;0,0,0.968627450980392;0,0,0.980392156862745;0.00392156862745098,0.00392156862745098,1;0.0117647058823529,0.0117647058823529,1;0.0313725490196078,0.0313725490196078,1;0.0509803921568627,0.0509803921568627,1;0.0666666666666667,0.0666666666666667,1;0.0823529411764706,0.0823529411764706,1;0.0980392156862745,0.0980392156862745,1;0.113725490196078,0.113725490196078,1;0.145098039215686,0.145098039215686,1;0.156862745098039,0.156862745098039,1;0.176470588235294,0.176470588235294,1;0.192156862745098,0.192156862745098,1;0.207843137254902,0.207843137254902,1;0.223529411764706,0.223529411764706,1;0.247058823529412,0.247058823529412,1;0.254901960784314,0.254901960784314,1;0.282352941176471,0.282352941176471,1;0.301960784313725,0.301960784313725,1;0.317647058823529,0.317647058823529,1;0.333333333333333,0.333333333333333,1;0.349019607843137,0.349019607843137,1;0.364705882352941,0.364705882352941,1;0.396078431372549,0.396078431372549,1;0.400000000000000,0.400000000000000,1;0.427450980392157,0.427450980392157,1;0.443137254901961,0.443137254901961,1;0.458823529411765,0.458823529411765,1;0.474509803921569,0.474509803921569,1;0.494117647058824,0.494117647058824,1;0.505882352941176,0.505882352941176,1;0.533333333333333,0.533333333333333,1;0.552941176470588,0.552941176470588,1;0.568627450980392,0.568627450980392,1;0.584313725490196,0.584313725490196,1;0.600000000000000,0.600000000000000,1;0.615686274509804,0.615686274509804,1;0.643137254901961,0.643137254901961,1;0.647058823529412,0.647058823529412,1;0.678431372549020,0.678431372549020,1;0.694117647058824,0.694117647058824,1;0.709803921568628,0.709803921568628,1;0.729411764705882,0.729411764705882,1;0.741176470588235,0.741176470588235,1;0.756862745098039,0.756862745098039,1;0.784313725490196,0.784313725490196,1;0.796078431372549,0.796078431372549,1;0.819607843137255,0.819607843137255,1;0.835294117647059,0.835294117647059,1;0.850980392156863,0.850980392156863,1;0.866666666666667,0.866666666666667,1;0.886274509803922,0.886274509803922,1;0.898039215686275,0.898039215686275,1;0.929411764705882,0.929411764705882,1;0.945098039215686,0.945098039215686,1;0.960784313725490,0.960784313725490,1;0.976470588235294,0.976470588235294,1;0.992156862745098,0.992156862745098,1;1,0.992156862745098,0.992156862745098;1,0.964705882352941,0.964705882352941;1,0.956862745098039,0.956862745098039;1,0.929411764705882,0.929411764705882;1,0.913725490196078,0.913725490196078;1,0.898039215686275,0.898039215686275;1,0.874509803921569,0.874509803921569;1,0.866666666666667,0.866666666666667;1,0.850980392156863,0.850980392156863;1,0.819607843137255,0.819607843137255;1,0.807843137254902,0.807843137254902;1,0.788235294117647,0.788235294117647;1,0.772549019607843,0.772549019607843;1,0.756862745098039,0.756862745098039;1,0.725490196078431,0.725490196078431;1,0.717647058823529,0.717647058823529;1,0.705882352941177,0.705882352941177;1,0.678431372549020,0.678431372549020;1,0.662745098039216,0.662745098039216;1,0.643137254901961,0.643137254901961;1,0.631372549019608,0.631372549019608;1,0.615686274509804,0.615686274509804;1,0.600000000000000,0.600000000000000;1,0.568627450980392,0.568627450980392;1,0.564705882352941,0.564705882352941;1,0.537254901960784,0.537254901960784;1,0.517647058823530,0.517647058823530;1,0.505882352941176,0.505882352941176;1,0.482352941176471,0.482352941176471;1,0.474509803921569,0.474509803921569;1,0.458823529411765,0.458823529411765;1,0.427450980392157,0.427450980392157;1,0.415686274509804,0.415686274509804;1,0.396078431372549,0.396078431372549;1,0.380392156862745,0.380392156862745;1,0.364705882352941,0.364705882352941;1,0.333333333333333,0.333333333333333;1,0.325490196078431,0.325490196078431;1,0.317647058823529,0.317647058823529;1,0.286274509803922,0.286274509803922;1,0.270588235294118,0.270588235294118;1,0.254901960784314,0.254901960784314;1,0.235294117647059,0.235294117647059;1,0.219607843137255,0.219607843137255;1,0.207843137254902,0.207843137254902;1,0.176470588235294,0.176470588235294;1,0.168627450980392,0.168627450980392;1,0.145098039215686,0.145098039215686;1,0.125490196078431,0.125490196078431;1,0.113725490196078,0.113725490196078;1,0.0862745098039216,0.0862745098039216;1,0.0784313725490196,0.0784313725490196;1,0.0627450980392157,0.0627450980392157;1,0.0313725490196078,0.0313725490196078;1,0.0196078431372549,0.0196078431372549;1,0,0;0.992156862745098,0,0;0.984313725490196,0,0;0.968627450980392,0,0;0.964705882352941,0,0;0.960784313725490,0,0;0.945098039215686,0,0;0.937254901960784,0,0;0.929411764705882,0,0;0.917647058823529,0,0;0.913725490196078,0,0;0.898039215686275,0,0;0.890196078431373,0,0;0.886274509803922,0,0;0.874509803921569,0,0;0.866666666666667,0,0;0.858823529411765,0,0;0.847058823529412,0,0;0.843137254901961,0,0;0.835294117647059,0,0;0.819607843137255,0,0;0.811764705882353,0,0;0.803921568627451,0,0;0.796078431372549,0,0;0.788235294117647,0,0;0.772549019607843,0,0;0.768627450980392,0,0;0.764705882352941,0,0;0.749019607843137,0,0;0.741176470588235,0,0;0.733333333333333,0,0;0.721568627450980,0,0;0.717647058823529,0,0;0.701960784313725,0,0;0.694117647058824,0,0;0.690196078431373,0,0;0.678431372549020,0,0;0.670588235294118,0,0;0.662745098039216,0,0;0.647058823529412,0,0;0.643137254901961,0,0;0.639215686274510,0,0;0.623529411764706,0,0;0.615686274509804,0,0;0.607843137254902,0,0;0.600000000000000,0,0;0.592156862745098,0,0;0.576470588235294,0,0;0.568627450980392,0,0;0.568627450980392,0,0]; + [0.266666666666667,0.00392156862745098,0.329411764705882;0.266666666666667,0.00784313725490196,0.333333333333333;0.266666666666667,0.0117647058823529,0.341176470588235;0.270588235294118,0.0235294117647059,0.352941176470588;0.270588235294118,0.0313725490196078,0.356862745098039;0.274509803921569,0.0352941176470588,0.360784313725490;0.274509803921569,0.0431372549019608,0.368627450980392;0.274509803921569,0.0470588235294118,0.372549019607843;0.274509803921569,0.0549019607843137,0.380392156862745;0.278431372549020,0.0588235294117647,0.384313725490196;0.278431372549020,0.0705882352941177,0.396078431372549;0.278431372549020,0.0784313725490196,0.400000000000000;0.278431372549020,0.0823529411764706,0.403921568627451;0.278431372549020,0.0862745098039216,0.411764705882353;0.278431372549020,0.0941176470588235,0.415686274509804;0.282352941176471,0.0980392156862745,0.419607843137255;0.282352941176471,0.101960784313725,0.423529411764706;0.282352941176471,0.113725490196078,0.435294117647059;0.282352941176471,0.117647058823529,0.439215686274510;0.282352941176471,0.125490196078431,0.443137254901961;0.282352941176471,0.129411764705882,0.447058823529412;0.282352941176471,0.133333333333333,0.450980392156863;0.282352941176471,0.137254901960784,0.454901960784314;0.278431372549020,0.145098039215686,0.458823529411765;0.278431372549020,0.152941176470588,0.466666666666667;0.278431372549020,0.156862745098039,0.470588235294118;0.278431372549020,0.164705882352941,0.474509803921569;0.278431372549020,0.168627450980392,0.478431372549020;0.278431372549020,0.172549019607843,0.482352941176471;0.274509803921569,0.176470588235294,0.486274509803922;0.274509803921569,0.184313725490196,0.486274509803922;0.274509803921569,0.192156862745098,0.494117647058824;0.270588235294118,0.196078431372549,0.498039215686275;0.270588235294118,0.203921568627451,0.498039215686275;0.270588235294118,0.207843137254902,0.501960784313726;0.270588235294118,0.211764705882353,0.505882352941176;0.266666666666667,0.215686274509804,0.505882352941176;0.262745098039216,0.223529411764706,0.509803921568627;0.262745098039216,0.231372549019608,0.513725490196078;0.262745098039216,0.235294117647059,0.517647058823530;0.258823529411765,0.239215686274510,0.517647058823530;0.258823529411765,0.243137254901961,0.521568627450980;0.258823529411765,0.250980392156863,0.521568627450980;0.254901960784314,0.254901960784314,0.525490196078431;0.250980392156863,0.258823529411765,0.525490196078431;0.250980392156863,0.266666666666667,0.529411764705882;0.247058823529412,0.270588235294118,0.529411764705882;0.247058823529412,0.278431372549020,0.533333333333333;0.243137254901961,0.282352941176471,0.533333333333333;0.243137254901961,0.286274509803922,0.537254901960784;0.239215686274510,0.290196078431373,0.537254901960784;0.239215686274510,0.294117647058824,0.537254901960784;0.235294117647059,0.301960784313725,0.541176470588235;0.235294117647059,0.305882352941177,0.541176470588235;0.231372549019608,0.313725490196078,0.541176470588235;0.231372549019608,0.317647058823529,0.541176470588235;0.227450980392157,0.321568627450980,0.545098039215686;0.223529411764706,0.325490196078431,0.545098039215686;0.223529411764706,0.333333333333333,0.545098039215686;0.219607843137255,0.337254901960784,0.545098039215686;0.219607843137255,0.341176470588235,0.549019607843137;0.215686274509804,0.345098039215686,0.549019607843137;0.215686274509804,0.349019607843137,0.549019607843137;0.211764705882353,0.352941176470588,0.549019607843137;0.207843137254902,0.356862745098039,0.549019607843137;0.207843137254902,0.364705882352941,0.549019607843137;0.203921568627451,0.368627450980392,0.552941176470588;0.203921568627451,0.372549019607843,0.552941176470588;0.200000000000000,0.376470588235294,0.552941176470588;0.200000000000000,0.380392156862745,0.552941176470588;0.196078431372549,0.384313725490196,0.552941176470588;0.192156862745098,0.392156862745098,0.552941176470588;0.192156862745098,0.396078431372549,0.552941176470588;0.192156862745098,0.400000000000000,0.552941176470588;0.188235294117647,0.403921568627451,0.552941176470588;0.188235294117647,0.407843137254902,0.552941176470588;0.184313725490196,0.411764705882353,0.552941176470588;0.184313725490196,0.415686274509804,0.552941176470588;0.180392156862745,0.423529411764706,0.556862745098039;0.180392156862745,0.427450980392157,0.556862745098039;0.176470588235294,0.431372549019608,0.556862745098039;0.176470588235294,0.435294117647059,0.556862745098039;0.172549019607843,0.439215686274510,0.556862745098039;0.172549019607843,0.443137254901961,0.556862745098039;0.172549019607843,0.447058823529412,0.556862745098039;0.168627450980392,0.454901960784314,0.556862745098039;0.164705882352941,0.458823529411765,0.556862745098039;0.164705882352941,0.462745098039216,0.556862745098039;0.164705882352941,0.466666666666667,0.556862745098039;0.160784313725490,0.470588235294118,0.556862745098039;0.160784313725490,0.474509803921569,0.556862745098039;0.156862745098039,0.478431372549020,0.556862745098039;0.156862745098039,0.482352941176471,0.556862745098039;0.152941176470588,0.486274509803922,0.556862745098039;0.152941176470588,0.490196078431373,0.556862745098039;0.152941176470588,0.494117647058824,0.556862745098039;0.149019607843137,0.498039215686275,0.556862745098039;0.149019607843137,0.501960784313726,0.556862745098039;0.149019607843137,0.505882352941176,0.556862745098039;0.145098039215686,0.513725490196078,0.552941176470588;0.141176470588235,0.517647058823530,0.552941176470588;0.141176470588235,0.521568627450980,0.552941176470588;0.141176470588235,0.525490196078431,0.552941176470588;0.137254901960784,0.529411764705882,0.552941176470588;0.137254901960784,0.533333333333333,0.552941176470588;0.133333333333333,0.537254901960784,0.552941176470588;0.133333333333333,0.541176470588235,0.552941176470588;0.133333333333333,0.545098039215686,0.552941176470588;0.129411764705882,0.549019607843137,0.552941176470588;0.129411764705882,0.552941176470588,0.549019607843137;0.129411764705882,0.556862745098039,0.549019607843137;0.125490196078431,0.560784313725490,0.549019607843137;0.125490196078431,0.564705882352941,0.549019607843137;0.121568627450980,0.572549019607843,0.549019607843137;0.121568627450980,0.576470588235294,0.545098039215686;0.121568627450980,0.580392156862745,0.545098039215686;0.121568627450980,0.584313725490196,0.545098039215686;0.121568627450980,0.588235294117647,0.545098039215686;0.117647058823529,0.592156862745098,0.541176470588235;0.117647058823529,0.596078431372549,0.541176470588235;0.117647058823529,0.600000000000000,0.541176470588235;0.117647058823529,0.603921568627451,0.537254901960784;0.117647058823529,0.607843137254902,0.537254901960784;0.117647058823529,0.611764705882353,0.537254901960784;0.117647058823529,0.615686274509804,0.533333333333333;0.117647058823529,0.619607843137255,0.533333333333333;0.117647058823529,0.627450980392157,0.529411764705882;0.121568627450980,0.631372549019608,0.529411764705882;0.121568627450980,0.635294117647059,0.525490196078431;0.121568627450980,0.639215686274510,0.525490196078431;0.125490196078431,0.643137254901961,0.521568627450980;0.125490196078431,0.647058823529412,0.521568627450980;0.129411764705882,0.650980392156863,0.517647058823530;0.133333333333333,0.654901960784314,0.517647058823530;0.137254901960784,0.658823529411765,0.513725490196078;0.137254901960784,0.662745098039216,0.509803921568627;0.141176470588235,0.666666666666667,0.509803921568627;0.145098039215686,0.670588235294118,0.505882352941176;0.149019607843137,0.674509803921569,0.505882352941176;0.152941176470588,0.678431372549020,0.498039215686275;0.160784313725490,0.686274509803922,0.498039215686275;0.164705882352941,0.690196078431373,0.494117647058824;0.168627450980392,0.694117647058824,0.490196078431373;0.172549019607843,0.694117647058824,0.490196078431373;0.180392156862745,0.698039215686275,0.486274509803922;0.184313725490196,0.701960784313725,0.482352941176471;0.196078431372549,0.709803921568628,0.478431372549020;0.200000000000000,0.713725490196078,0.474509803921569;0.207843137254902,0.717647058823529,0.470588235294118;0.211764705882353,0.721568627450980,0.466666666666667;0.219607843137255,0.725490196078431,0.462745098039216;0.223529411764706,0.725490196078431,0.462745098039216;0.231372549019608,0.729411764705882,0.458823529411765;0.243137254901961,0.737254901960784,0.450980392156863;0.250980392156863,0.741176470588235,0.447058823529412;0.258823529411765,0.745098039215686,0.443137254901961;0.266666666666667,0.745098039215686,0.439215686274510;0.270588235294118,0.749019607843137,0.435294117647059;0.278431372549020,0.752941176470588,0.431372549019608;0.286274509803922,0.756862745098039,0.427450980392157;0.301960784313725,0.760784313725490,0.419607843137255;0.309803921568627,0.764705882352941,0.411764705882353;0.317647058823529,0.768627450980392,0.407843137254902;0.325490196078431,0.772549019607843,0.403921568627451;0.333333333333333,0.776470588235294,0.400000000000000;0.341176470588235,0.776470588235294,0.396078431372549;0.349019607843137,0.780392156862745,0.392156862745098;0.368627450980392,0.788235294117647,0.380392156862745;0.376470588235294,0.788235294117647,0.376470588235294;0.384313725490196,0.792156862745098,0.372549019607843;0.392156862745098,0.796078431372549,0.364705882352941;0.403921568627451,0.800000000000000,0.360784313725490;0.411764705882353,0.800000000000000,0.356862745098039;0.423529411764706,0.803921568627451,0.345098039215686;0.439215686274510,0.807843137254902,0.337254901960784;0.447058823529412,0.811764705882353,0.333333333333333;0.454901960784314,0.815686274509804,0.329411764705882;0.466666666666667,0.815686274509804,0.321568627450980;0.474509803921569,0.819607843137255,0.317647058823529;0.486274509803922,0.823529411764706,0.309803921568627;0.498039215686275,0.823529411764706,0.301960784313725;0.513725490196078,0.827450980392157,0.294117647058824;0.525490196078431,0.831372549019608,0.286274509803922;0.533333333333333,0.835294117647059,0.278431372549020;0.545098039215686,0.835294117647059,0.274509803921569;0.552941176470588,0.839215686274510,0.266666666666667;0.564705882352941,0.839215686274510,0.262745098039216;0.576470588235294,0.843137254901961,0.250980392156863;0.592156862745098,0.847058823529412,0.243137254901961;0.603921568627451,0.847058823529412,0.235294117647059;0.615686274509804,0.850980392156863,0.227450980392157;0.623529411764706,0.850980392156863,0.219607843137255;0.635294117647059,0.854901960784314,0.215686274509804;0.650980392156863,0.854901960784314,0.203921568627451;0.666666666666667,0.858823529411765,0.196078431372549;0.678431372549020,0.862745098039216,0.188235294117647;0.686274509803922,0.862745098039216,0.180392156862745;0.698039215686275,0.866666666666667,0.172549019607843;0.709803921568628,0.866666666666667,0.168627450980392;0.717647058823529,0.866666666666667,0.160784313725490;0.733333333333333,0.870588235294118,0.149019607843137;0.749019607843137,0.874509803921569,0.141176470588235;0.760784313725490,0.874509803921569,0.133333333333333;0.772549019607843,0.874509803921569,0.129411764705882;0.780392156862745,0.878431372549020,0.121568627450980;0.792156862745098,0.878431372549020,0.117647058823529;0.803921568627451,0.878431372549020,0.113725490196078;0.815686274509804,0.882352941176471,0.105882352941176;0.831372549019608,0.882352941176471,0.101960784313725;0.843137254901961,0.886274509803922,0.0980392156862745;0.854901960784314,0.886274509803922,0.0941176470588235;0.862745098039216,0.886274509803922,0.0941176470588235;0.874509803921569,0.890196078431373,0.0941176470588235;0.882352941176471,0.890196078431373,0.0941176470588235;0.905882352941177,0.894117647058824,0.0980392156862745;0.913725490196078,0.894117647058824,0.0980392156862745;0.925490196078431,0.894117647058824,0.101960784313725;0.933333333333333,0.898039215686275,0.105882352941176;0.945098039215686,0.898039215686275,0.109803921568627;0.952941176470588,0.898039215686275,0.117647058823529;0.964705882352941,0.901960784313726,0.121568627450980;0.980392156862745,0.901960784313726,0.133333333333333;0.992156862745098,0.905882352941177,0.141176470588235;0.992156862745098,0.905882352941177,0.141176470588235]; + [0.0470588235294118,0.0274509803921569,0.525490196078431;0.0627450980392157,0.0274509803921569,0.529411764705882;0.0745098039215686,0.0235294117647059,0.537254901960784;0.0941176470588235,0.0235294117647059,0.545098039215686;0.105882352941176,0.0235294117647059,0.549019607843137;0.113725490196078,0.0235294117647059,0.552941176470588;0.121568627450980,0.0196078431372549,0.556862745098039;0.129411764705882,0.0196078431372549,0.560784313725490;0.137254901960784,0.0196078431372549,0.564705882352941;0.145098039215686,0.0196078431372549,0.568627450980392;0.160784313725490,0.0196078431372549,0.576470588235294;0.168627450980392,0.0196078431372549,0.580392156862745;0.176470588235294,0.0156862745098039,0.580392156862745;0.184313725490196,0.0156862745098039,0.584313725490196;0.192156862745098,0.0156862745098039,0.588235294117647;0.200000000000000,0.0156862745098039,0.592156862745098;0.203921568627451,0.0156862745098039,0.596078431372549;0.219607843137255,0.0156862745098039,0.600000000000000;0.227450980392157,0.0156862745098039,0.603921568627451;0.231372549019608,0.0117647058823529,0.603921568627451;0.239215686274510,0.0117647058823529,0.607843137254902;0.247058823529412,0.0117647058823529,0.611764705882353;0.250980392156863,0.0117647058823529,0.611764705882353;0.258823529411765,0.0117647058823529,0.615686274509804;0.270588235294118,0.0117647058823529,0.619607843137255;0.278431372549020,0.00784313725490196,0.623529411764706;0.286274509803922,0.00784313725490196,0.623529411764706;0.290196078431373,0.00784313725490196,0.627450980392157;0.298039215686275,0.00784313725490196,0.631372549019608;0.305882352941177,0.00784313725490196,0.631372549019608;0.309803921568627,0.00784313725490196,0.635294117647059;0.321568627450980,0.00392156862745098,0.639215686274510;0.329411764705882,0.00392156862745098,0.639215686274510;0.337254901960784,0.00392156862745098,0.639215686274510;0.341176470588235,0.00392156862745098,0.643137254901961;0.349019607843137,0.00392156862745098,0.643137254901961;0.352941176470588,0,0.647058823529412;0.364705882352941,0,0.647058823529412;0.372549019607843,0,0.650980392156863;0.380392156862745,0,0.650980392156863;0.384313725490196,0,0.650980392156863;0.392156862745098,0,0.654901960784314;0.396078431372549,0,0.654901960784314;0.403921568627451,0,0.654901960784314;0.411764705882353,0,0.654901960784314;0.423529411764706,0,0.658823529411765;0.427450980392157,0,0.658823529411765;0.435294117647059,0,0.658823529411765;0.439215686274510,0,0.658823529411765;0.447058823529412,0,0.658823529411765;0.450980392156863,0,0.658823529411765;0.458823529411765,0,0.658823529411765;0.470588235294118,0.00392156862745098,0.658823529411765;0.474509803921569,0.00392156862745098,0.658823529411765;0.482352941176471,0.00784313725490196,0.658823529411765;0.486274509803922,0.00784313725490196,0.654901960784314;0.494117647058824,0.0117647058823529,0.654901960784314;0.501960784313726,0.0117647058823529,0.654901960784314;0.509803921568627,0.0156862745098039,0.654901960784314;0.517647058823530,0.0196078431372549,0.650980392156863;0.521568627450980,0.0235294117647059,0.650980392156863;0.525490196078431,0.0274509803921569,0.650980392156863;0.533333333333333,0.0274509803921569,0.647058823529412;0.537254901960784,0.0313725490196078,0.647058823529412;0.545098039215686,0.0352941176470588,0.643137254901961;0.556862745098039,0.0470588235294118,0.643137254901961;0.560784313725490,0.0509803921568627,0.639215686274510;0.564705882352941,0.0549019607843137,0.639215686274510;0.572549019607843,0.0588235294117647,0.635294117647059;0.576470588235294,0.0627450980392157,0.631372549019608;0.584313725490196,0.0666666666666667,0.631372549019608;0.592156862745098,0.0745098039215686,0.627450980392157;0.600000000000000,0.0784313725490196,0.623529411764706;0.603921568627451,0.0823529411764706,0.619607843137255;0.607843137254902,0.0901960784313726,0.619607843137255;0.615686274509804,0.0941176470588235,0.615686274509804;0.619607843137255,0.0980392156862745,0.611764705882353;0.623529411764706,0.101960784313725,0.607843137254902;0.635294117647059,0.109803921568627,0.603921568627451;0.639215686274510,0.113725490196078,0.600000000000000;0.643137254901961,0.117647058823529,0.596078431372549;0.647058823529412,0.121568627450980,0.592156862745098;0.654901960784314,0.129411764705882,0.592156862745098;0.658823529411765,0.133333333333333,0.588235294117647;0.662745098039216,0.137254901960784,0.584313725490196;0.674509803921569,0.145098039215686,0.576470588235294;0.678431372549020,0.149019607843137,0.572549019607843;0.682352941176471,0.152941176470588,0.568627450980392;0.686274509803922,0.156862745098039,0.564705882352941;0.690196078431373,0.164705882352941,0.560784313725490;0.694117647058824,0.168627450980392,0.560784313725490;0.698039215686275,0.172549019607843,0.556862745098039;0.709803921568628,0.180392156862745,0.549019607843137;0.713725490196078,0.184313725490196,0.545098039215686;0.717647058823529,0.188235294117647,0.541176470588235;0.721568627450980,0.196078431372549,0.537254901960784;0.725490196078431,0.200000000000000,0.533333333333333;0.729411764705882,0.203921568627451,0.529411764705882;0.733333333333333,0.207843137254902,0.525490196078431;0.741176470588235,0.215686274509804,0.517647058823530;0.745098039215686,0.219607843137255,0.513725490196078;0.749019607843137,0.223529411764706,0.509803921568627;0.752941176470588,0.231372549019608,0.505882352941176;0.756862745098039,0.235294117647059,0.501960784313726;0.760784313725490,0.239215686274510,0.501960784313726;0.764705882352941,0.243137254901961,0.494117647058824;0.772549019607843,0.250980392156863,0.490196078431373;0.776470588235294,0.254901960784314,0.486274509803922;0.780392156862745,0.258823529411765,0.482352941176471;0.784313725490196,0.266666666666667,0.478431372549020;0.788235294117647,0.270588235294118,0.474509803921569;0.792156862745098,0.274509803921569,0.470588235294118;0.796078431372549,0.278431372549020,0.462745098039216;0.803921568627451,0.286274509803922,0.458823529411765;0.807843137254902,0.290196078431373,0.458823529411765;0.811764705882353,0.294117647058824,0.454901960784314;0.815686274509804,0.301960784313725,0.450980392156863;0.819607843137255,0.305882352941177,0.447058823529412;0.819607843137255,0.309803921568627,0.443137254901961;0.823529411764706,0.313725490196078,0.435294117647059;0.831372549019608,0.321568627450980,0.431372549019608;0.835294117647059,0.325490196078431,0.427450980392157;0.839215686274510,0.333333333333333,0.427450980392157;0.843137254901961,0.337254901960784,0.423529411764706;0.843137254901961,0.341176470588235,0.419607843137255;0.847058823529412,0.345098039215686,0.411764705882353;0.854901960784314,0.352941176470588,0.407843137254902;0.858823529411765,0.356862745098039,0.403921568627451;0.862745098039216,0.364705882352941,0.400000000000000;0.862745098039216,0.368627450980392,0.400000000000000;0.866666666666667,0.372549019607843,0.396078431372549;0.870588235294118,0.376470588235294,0.392156862745098;0.874509803921569,0.380392156862745,0.384313725490196;0.878431372549020,0.392156862745098,0.380392156862745;0.882352941176471,0.396078431372549,0.376470588235294;0.886274509803922,0.400000000000000,0.376470588235294;0.890196078431373,0.403921568627451,0.372549019607843;0.890196078431373,0.407843137254902,0.368627450980392;0.894117647058824,0.415686274509804,0.364705882352941;0.898039215686275,0.419607843137255,0.356862745098039;0.901960784313726,0.427450980392157,0.352941176470588;0.905882352941177,0.431372549019608,0.352941176470588;0.909803921568627,0.439215686274510,0.349019607843137;0.909803921568627,0.443137254901961,0.345098039215686;0.913725490196078,0.447058823529412,0.341176470588235;0.917647058823529,0.450980392156863,0.337254901960784;0.921568627450980,0.462745098039216,0.329411764705882;0.925490196078431,0.466666666666667,0.329411764705882;0.925490196078431,0.470588235294118,0.325490196078431;0.929411764705882,0.474509803921569,0.321568627450980;0.929411764705882,0.482352941176471,0.317647058823529;0.933333333333333,0.486274509803922,0.313725490196078;0.937254901960784,0.490196078431373,0.309803921568627;0.941176470588235,0.501960784313726,0.301960784313725;0.941176470588235,0.505882352941176,0.301960784313725;0.945098039215686,0.509803921568627,0.298039215686275;0.949019607843137,0.517647058823530,0.294117647058824;0.949019607843137,0.521568627450980,0.290196078431373;0.952941176470588,0.525490196078431,0.286274509803922;0.952941176470588,0.529411764705882,0.282352941176471;0.956862745098039,0.541176470588235,0.278431372549020;0.960784313725490,0.545098039215686,0.274509803921569;0.960784313725490,0.552941176470588,0.270588235294118;0.964705882352941,0.556862745098039,0.266666666666667;0.964705882352941,0.560784313725490,0.262745098039216;0.964705882352941,0.568627450980392,0.258823529411765;0.968627450980392,0.572549019607843,0.254901960784314;0.972549019607843,0.584313725490196,0.250980392156863;0.972549019607843,0.588235294117647,0.247058823529412;0.972549019607843,0.596078431372549,0.243137254901961;0.976470588235294,0.600000000000000,0.239215686274510;0.976470588235294,0.603921568627451,0.235294117647059;0.980392156862745,0.611764705882353,0.231372549019608;0.980392156862745,0.619607843137255,0.227450980392157;0.980392156862745,0.627450980392157,0.223529411764706;0.984313725490196,0.635294117647059,0.219607843137255;0.984313725490196,0.639215686274510,0.215686274509804;0.984313725490196,0.643137254901961,0.211764705882353;0.988235294117647,0.650980392156863,0.207843137254902;0.988235294117647,0.654901960784314,0.207843137254902;0.988235294117647,0.662745098039216,0.200000000000000;0.988235294117647,0.674509803921569,0.196078431372549;0.988235294117647,0.678431372549020,0.192156862745098;0.992156862745098,0.686274509803922,0.192156862745098;0.992156862745098,0.690196078431373,0.188235294117647;0.992156862745098,0.698039215686275,0.184313725490196;0.992156862745098,0.701960784313725,0.180392156862745;0.992156862745098,0.709803921568628,0.176470588235294;0.992156862745098,0.721568627450980,0.172549019607843;0.992156862745098,0.725490196078431,0.168627450980392;0.992156862745098,0.733333333333333,0.168627450980392;0.992156862745098,0.737254901960784,0.164705882352941;0.992156862745098,0.745098039215686,0.160784313725490;0.992156862745098,0.752941176470588,0.156862745098039;0.992156862745098,0.764705882352941,0.156862745098039;0.992156862745098,0.768627450980392,0.152941176470588;0.992156862745098,0.776470588235294,0.149019607843137;0.988235294117647,0.780392156862745,0.149019607843137;0.988235294117647,0.788235294117647,0.149019607843137;0.988235294117647,0.796078431372549,0.145098039215686;0.988235294117647,0.803921568627451,0.145098039215686;0.984313725490196,0.815686274509804,0.141176470588235;0.984313725490196,0.819607843137255,0.141176470588235;0.984313725490196,0.827450980392157,0.141176470588235;0.980392156862745,0.835294117647059,0.141176470588235;0.980392156862745,0.839215686274510,0.141176470588235;0.980392156862745,0.847058823529412,0.141176470588235;0.976470588235294,0.854901960784314,0.141176470588235;0.972549019607843,0.866666666666667,0.141176470588235;0.972549019607843,0.874509803921569,0.141176470588235;0.968627450980392,0.878431372549020,0.141176470588235;0.968627450980392,0.886274509803922,0.145098039215686;0.964705882352941,0.894117647058824,0.145098039215686;0.964705882352941,0.898039215686275,0.145098039215686;0.960784313725490,0.913725490196078,0.149019607843137;0.956862745098039,0.917647058823529,0.149019607843137;0.952941176470588,0.925490196078431,0.149019607843137;0.952941176470588,0.933333333333333,0.149019607843137;0.949019607843137,0.941176470588235,0.149019607843137;0.949019607843137,0.945098039215686,0.149019607843137;0.945098039215686,0.952941176470588,0.149019607843137;0.941176470588235,0.964705882352941,0.137254901960784;0.937254901960784,0.972549019607843,0.129411764705882;0.937254901960784,0.972549019607843,0.129411764705882]; + [0,0,0.0117647058823529;0,0,0.0156862745098039;0,0,0.0235294117647059;0.00392156862745098,0,0.0274509803921569;0.00392156862745098,0.00392156862745098,0.0352941176470588;0.00784313725490196,0.00392156862745098,0.0549019607843137;0.00784313725490196,0.00784313725490196,0.0627450980392157;0.0117647058823529,0.00784313725490196,0.0705882352941177;0.0156862745098039,0.0117647058823529,0.0784313725490196;0.0156862745098039,0.0117647058823529,0.0862745098039216;0.0196078431372549,0.0156862745098039,0.0941176470588235;0.0235294117647059,0.0156862745098039,0.105882352941176;0.0313725490196078,0.0235294117647059,0.121568627450980;0.0352941176470588,0.0235294117647059,0.129411764705882;0.0392156862745098,0.0274509803921569,0.137254901960784;0.0431372549019608,0.0274509803921569,0.149019607843137;0.0509803921568627,0.0313725490196078,0.156862745098039;0.0549019607843137,0.0313725490196078,0.164705882352941;0.0588235294117647,0.0352941176470588,0.180392156862745;0.0705882352941177,0.0392156862745098,0.196078431372549;0.0745098039215686,0.0392156862745098,0.203921568627451;0.0784313725490196,0.0431372549019608,0.211764705882353;0.0862745098039216,0.0431372549019608,0.223529411764706;0.0901960784313726,0.0431372549019608,0.231372549019608;0.0980392156862745,0.0431372549019608,0.243137254901961;0.105882352941176,0.0431372549019608,0.254901960784314;0.113725490196078,0.0470588235294118,0.270588235294118;0.121568627450980,0.0470588235294118,0.278431372549020;0.125490196078431,0.0470588235294118,0.290196078431373;0.133333333333333,0.0431372549019608,0.298039215686275;0.141176470588235,0.0431372549019608,0.305882352941177;0.149019607843137,0.0431372549019608,0.313725490196078;0.156862745098039,0.0431372549019608,0.325490196078431;0.168627450980392,0.0392156862745098,0.337254901960784;0.176470588235294,0.0392156862745098,0.345098039215686;0.180392156862745,0.0392156862745098,0.352941176470588;0.188235294117647,0.0392156862745098,0.360784313725490;0.196078431372549,0.0352941176470588,0.364705882352941;0.203921568627451,0.0352941176470588,0.372549019607843;0.215686274509804,0.0352941176470588,0.380392156862745;0.223529411764706,0.0352941176470588,0.384313725490196;0.231372549019608,0.0352941176470588,0.392156862745098;0.235294117647059,0.0352941176470588,0.396078431372549;0.243137254901961,0.0352941176470588,0.400000000000000;0.250980392156863,0.0352941176470588,0.400000000000000;0.258823529411765,0.0352941176470588,0.403921568627451;0.270588235294118,0.0392156862745098,0.411764705882353;0.274509803921569,0.0392156862745098,0.411764705882353;0.282352941176471,0.0431372549019608,0.415686274509804;0.290196078431373,0.0431372549019608,0.415686274509804;0.294117647058824,0.0470588235294118,0.419607843137255;0.301960784313725,0.0470588235294118,0.419607843137255;0.309803921568627,0.0509803921568627,0.423529411764706;0.321568627450980,0.0549019607843137,0.423529411764706;0.325490196078431,0.0549019607843137,0.427450980392157;0.333333333333333,0.0588235294117647,0.427450980392157;0.341176470588235,0.0588235294117647,0.427450980392157;0.345098039215686,0.0627450980392157,0.427450980392157;0.352941176470588,0.0666666666666667,0.427450980392157;0.364705882352941,0.0705882352941177,0.431372549019608;0.372549019607843,0.0705882352941177,0.431372549019608;0.376470588235294,0.0745098039215686,0.431372549019608;0.384313725490196,0.0784313725490196,0.431372549019608;0.388235294117647,0.0784313725490196,0.431372549019608;0.396078431372549,0.0823529411764706,0.431372549019608;0.400000000000000,0.0823529411764706,0.431372549019608;0.415686274509804,0.0901960784313726,0.431372549019608;0.419607843137255,0.0901960784313726,0.431372549019608;0.427450980392157,0.0941176470588235,0.431372549019608;0.431372549019608,0.0941176470588235,0.431372549019608;0.439215686274510,0.0980392156862745,0.431372549019608;0.447058823529412,0.0980392156862745,0.427450980392157;0.450980392156863,0.101960784313725,0.427450980392157;0.462745098039216,0.105882352941176,0.427450980392157;0.470588235294118,0.109803921568627,0.427450980392157;0.478431372549020,0.109803921568627,0.427450980392157;0.482352941176471,0.113725490196078,0.423529411764706;0.490196078431373,0.113725490196078,0.423529411764706;0.494117647058824,0.117647058823529,0.423529411764706;0.501960784313726,0.121568627450980,0.419607843137255;0.513725490196078,0.125490196078431,0.419607843137255;0.521568627450980,0.125490196078431,0.415686274509804;0.525490196078431,0.129411764705882,0.415686274509804;0.533333333333333,0.129411764705882,0.415686274509804;0.537254901960784,0.133333333333333,0.411764705882353;0.545098039215686,0.133333333333333,0.411764705882353;0.552941176470588,0.137254901960784,0.407843137254902;0.564705882352941,0.141176470588235,0.407843137254902;0.568627450980392,0.145098039215686,0.403921568627451;0.576470588235294,0.145098039215686,0.403921568627451;0.584313725490196,0.149019607843137,0.400000000000000;0.588235294117647,0.149019607843137,0.400000000000000;0.596078431372549,0.152941176470588,0.396078431372549;0.603921568627451,0.156862745098039,0.392156862745098;0.611764705882353,0.160784313725490,0.388235294117647;0.619607843137255,0.160784313725490,0.388235294117647;0.627450980392157,0.164705882352941,0.384313725490196;0.631372549019608,0.168627450980392,0.380392156862745;0.639215686274510,0.168627450980392,0.380392156862745;0.643137254901961,0.172549019607843,0.376470588235294;0.650980392156863,0.172549019607843,0.372549019607843;0.662745098039216,0.180392156862745,0.368627450980392;0.670588235294118,0.180392156862745,0.364705882352941;0.674509803921569,0.184313725490196,0.360784313725490;0.682352941176471,0.188235294117647,0.356862745098039;0.686274509803922,0.192156862745098,0.356862745098039;0.694117647058824,0.192156862745098,0.349019607843137;0.705882352941177,0.200000000000000,0.345098039215686;0.709803921568628,0.200000000000000,0.341176470588235;0.717647058823529,0.203921568627451,0.337254901960784;0.721568627450980,0.207843137254902,0.337254901960784;0.729411764705882,0.211764705882353,0.333333333333333;0.733333333333333,0.215686274509804,0.329411764705882;0.741176470588235,0.215686274509804,0.321568627450980;0.749019607843137,0.223529411764706,0.317647058823529;0.756862745098039,0.227450980392157,0.313725490196078;0.760784313725490,0.231372549019608,0.309803921568627;0.768627450980392,0.235294117647059,0.305882352941177;0.772549019607843,0.239215686274510,0.301960784313725;0.780392156862745,0.243137254901961,0.298039215686275;0.784313725490196,0.243137254901961,0.290196078431373;0.796078431372549,0.250980392156863,0.286274509803922;0.800000000000000,0.254901960784314,0.282352941176471;0.803921568627451,0.258823529411765,0.278431372549020;0.811764705882353,0.266666666666667,0.274509803921569;0.815686274509804,0.270588235294118,0.266666666666667;0.819607843137255,0.274509803921569,0.262745098039216;0.831372549019608,0.282352941176471,0.254901960784314;0.835294117647059,0.286274509803922,0.250980392156863;0.839215686274510,0.290196078431373,0.247058823529412;0.843137254901961,0.294117647058824,0.243137254901961;0.850980392156863,0.301960784313725,0.239215686274510;0.854901960784314,0.305882352941177,0.231372549019608;0.858823529411765,0.309803921568627,0.227450980392157;0.866666666666667,0.321568627450980,0.219607843137255;0.870588235294118,0.325490196078431,0.215686274509804;0.874509803921569,0.329411764705882,0.211764705882353;0.878431372549020,0.337254901960784,0.203921568627451;0.886274509803922,0.341176470588235,0.200000000000000;0.890196078431373,0.345098039215686,0.196078431372549;0.894117647058824,0.352941176470588,0.192156862745098;0.901960784313726,0.360784313725490,0.180392156862745;0.901960784313726,0.368627450980392,0.176470588235294;0.905882352941177,0.372549019607843,0.172549019607843;0.909803921568627,0.380392156862745,0.168627450980392;0.913725490196078,0.384313725490196,0.164705882352941;0.917647058823529,0.392156862745098,0.156862745098039;0.921568627450980,0.396078431372549,0.152941176470588;0.929411764705882,0.407843137254902,0.145098039215686;0.929411764705882,0.415686274509804,0.137254901960784;0.933333333333333,0.423529411764706,0.133333333333333;0.937254901960784,0.427450980392157,0.129411764705882;0.941176470588235,0.435294117647059,0.121568627450980;0.941176470588235,0.439215686274510,0.117647058823529;0.945098039215686,0.450980392156863,0.109803921568627;0.949019607843137,0.458823529411765,0.101960784313725;0.952941176470588,0.466666666666667,0.0980392156862745;0.952941176470588,0.474509803921569,0.0941176470588235;0.956862745098039,0.478431372549020,0.0862745098039216;0.960784313725490,0.486274509803922,0.0823529411764706;0.960784313725490,0.494117647058824,0.0784313725490196;0.964705882352941,0.501960784313726,0.0666666666666667;0.968627450980392,0.513725490196078,0.0627450980392157;0.968627450980392,0.521568627450980,0.0549019607843137;0.972549019607843,0.529411764705882,0.0509803921568627;0.972549019607843,0.533333333333333,0.0470588235294118;0.972549019607843,0.541176470588235,0.0431372549019608;0.976470588235294,0.549019607843137,0.0352941176470588;0.976470588235294,0.560784313725490,0.0313725490196078;0.980392156862745,0.568627450980392,0.0274509803921569;0.980392156862745,0.576470588235294,0.0235294117647059;0.980392156862745,0.584313725490196,0.0235294117647059;0.980392156862745,0.592156862745098,0.0235294117647059;0.984313725490196,0.600000000000000,0.0235294117647059;0.984313725490196,0.611764705882353,0.0235294117647059;0.984313725490196,0.619607843137255,0.0274509803921569;0.984313725490196,0.627450980392157,0.0274509803921569;0.984313725490196,0.635294117647059,0.0313725490196078;0.984313725490196,0.643137254901961,0.0392156862745098;0.984313725490196,0.650980392156863,0.0431372549019608;0.984313725490196,0.658823529411765,0.0509803921568627;0.984313725490196,0.670588235294118,0.0588235294117647;0.984313725490196,0.682352941176471,0.0705882352941177;0.984313725490196,0.690196078431373,0.0784313725490196;0.984313725490196,0.694117647058824,0.0862745098039216;0.984313725490196,0.701960784313725,0.0941176470588235;0.984313725490196,0.709803921568628,0.101960784313725;0.984313725490196,0.717647058823529,0.109803921568627;0.980392156862745,0.729411764705882,0.121568627450980;0.980392156862745,0.741176470588235,0.137254901960784;0.980392156862745,0.749019607843137,0.145098039215686;0.980392156862745,0.756862745098039,0.156862745098039;0.976470588235294,0.764705882352941,0.164705882352941;0.976470588235294,0.772549019607843,0.172549019607843;0.976470588235294,0.780392156862745,0.184313725490196;0.972549019607843,0.796078431372549,0.203921568627451;0.972549019607843,0.803921568627451,0.215686274509804;0.968627450980392,0.811764705882353,0.227450980392157;0.968627450980392,0.819607843137255,0.235294117647059;0.964705882352941,0.827450980392157,0.247058823529412;0.964705882352941,0.835294117647059,0.258823529411765;0.960784313725490,0.843137254901961,0.270588235294118;0.956862745098039,0.858823529411765,0.294117647058824;0.956862745098039,0.862745098039216,0.309803921568627;0.952941176470588,0.870588235294118,0.321568627450980;0.952941176470588,0.878431372549020,0.337254901960784;0.952941176470588,0.886274509803922,0.349019607843137;0.949019607843137,0.894117647058824,0.364705882352941;0.949019607843137,0.901960784313726,0.376470588235294;0.945098039215686,0.913725490196078,0.407843137254902;0.945098039215686,0.921568627450980,0.423529411764706;0.945098039215686,0.929411764705882,0.439215686274510;0.945098039215686,0.933333333333333,0.454901960784314;0.945098039215686,0.941176470588235,0.474509803921569;0.945098039215686,0.949019607843137,0.490196078431373;0.949019607843137,0.952941176470588,0.505882352941176;0.952941176470588,0.964705882352941,0.537254901960784;0.956862745098039,0.968627450980392,0.552941176470588;0.960784313725490,0.972549019607843,0.568627450980392;0.964705882352941,0.980392156862745,0.584313725490196;0.968627450980392,0.984313725490196,0.600000000000000;0.976470588235294,0.988235294117647,0.615686274509804;0.984313725490196,0.992156862745098,0.635294117647059;0.988235294117647,0.996078431372549,0.643137254901961]; + [0,0,0.0117647058823529;0,0,0.0156862745098039;0,0,0.0235294117647059;0.00392156862745098,0,0.0274509803921569;0.00392156862745098,0.00392156862745098,0.0352941176470588;0.00784313725490196,0.00784313725490196,0.0509803921568627;0.00784313725490196,0.00784313725490196,0.0588235294117647;0.0117647058823529,0.0117647058823529,0.0666666666666667;0.0156862745098039,0.0117647058823529,0.0745098039215686;0.0156862745098039,0.0156862745098039,0.0823529411764706;0.0196078431372549,0.0156862745098039,0.0901960784313726;0.0235294117647059,0.0196078431372549,0.0980392156862745;0.0313725490196078,0.0235294117647059,0.113725490196078;0.0352941176470588,0.0274509803921569,0.121568627450980;0.0392156862745098,0.0274509803921569,0.133333333333333;0.0431372549019608,0.0313725490196078,0.141176470588235;0.0470588235294118,0.0352941176470588,0.149019607843137;0.0509803921568627,0.0392156862745098,0.156862745098039;0.0549019607843137,0.0392156862745098,0.168627450980392;0.0627450980392157,0.0470588235294118,0.184313725490196;0.0666666666666667,0.0470588235294118,0.192156862745098;0.0705882352941177,0.0509803921568627,0.200000000000000;0.0784313725490196,0.0509803921568627,0.207843137254902;0.0823529411764706,0.0549019607843137,0.219607843137255;0.0862745098039216,0.0549019607843137,0.227450980392157;0.0901960784313726,0.0588235294117647,0.239215686274510;0.101960784313725,0.0627450980392157,0.254901960784314;0.105882352941176,0.0627450980392157,0.266666666666667;0.109803921568627,0.0627450980392157,0.274509803921569;0.117647058823529,0.0627450980392157,0.286274509803922;0.121568627450980,0.0666666666666667,0.294117647058824;0.125490196078431,0.0666666666666667,0.301960784313725;0.133333333333333,0.0666666666666667,0.317647058823529;0.145098039215686,0.0666666666666667,0.333333333333333;0.149019607843137,0.0666666666666667,0.341176470588235;0.156862745098039,0.0666666666666667,0.349019607843137;0.164705882352941,0.0666666666666667,0.360784313725490;0.168627450980392,0.0666666666666667,0.368627450980392;0.180392156862745,0.0627450980392157,0.380392156862745;0.188235294117647,0.0627450980392157,0.396078431372549;0.196078431372549,0.0627450980392157,0.403921568627451;0.203921568627451,0.0627450980392157,0.407843137254902;0.207843137254902,0.0588235294117647,0.415686274509804;0.215686274509804,0.0588235294117647,0.423529411764706;0.223529411764706,0.0588235294117647,0.431372549019608;0.231372549019608,0.0588235294117647,0.439215686274510;0.243137254901961,0.0588235294117647,0.447058823529412;0.250980392156863,0.0588235294117647,0.450980392156863;0.258823529411765,0.0588235294117647,0.454901960784314;0.262745098039216,0.0588235294117647,0.458823529411765;0.270588235294118,0.0588235294117647,0.462745098039216;0.278431372549020,0.0588235294117647,0.466666666666667;0.286274509803922,0.0627450980392157,0.470588235294118;0.294117647058824,0.0627450980392157,0.474509803921569;0.301960784313725,0.0666666666666667,0.478431372549020;0.309803921568627,0.0666666666666667,0.482352941176471;0.313725490196078,0.0705882352941177,0.482352941176471;0.321568627450980,0.0705882352941177,0.486274509803922;0.325490196078431,0.0745098039215686,0.486274509803922;0.341176470588235,0.0784313725490196,0.490196078431373;0.345098039215686,0.0823529411764706,0.494117647058824;0.352941176470588,0.0823529411764706,0.494117647058824;0.356862745098039,0.0862745098039216,0.494117647058824;0.364705882352941,0.0901960784313726,0.494117647058824;0.368627450980392,0.0901960784313726,0.498039215686275;0.376470588235294,0.0941176470588235,0.498039215686275;0.388235294117647,0.0980392156862745,0.498039215686275;0.396078431372549,0.101960784313725,0.501960784313726;0.400000000000000,0.101960784313725,0.501960784313726;0.407843137254902,0.105882352941176,0.501960784313726;0.411764705882353,0.109803921568627,0.501960784313726;0.419607843137255,0.109803921568627,0.501960784313726;0.423529411764706,0.113725490196078,0.501960784313726;0.435294117647059,0.117647058823529,0.505882352941176;0.443137254901961,0.121568627450980,0.505882352941176;0.450980392156863,0.121568627450980,0.505882352941176;0.454901960784314,0.125490196078431,0.505882352941176;0.462745098039216,0.129411764705882,0.505882352941176;0.466666666666667,0.129411764705882,0.505882352941176;0.474509803921569,0.133333333333333,0.505882352941176;0.486274509803922,0.137254901960784,0.505882352941176;0.494117647058824,0.141176470588235,0.505882352941176;0.498039215686275,0.141176470588235,0.505882352941176;0.505882352941176,0.145098039215686,0.505882352941176;0.509803921568627,0.145098039215686,0.505882352941176;0.517647058823530,0.149019607843137,0.505882352941176;0.525490196078431,0.149019607843137,0.505882352941176;0.537254901960784,0.156862745098039,0.505882352941176;0.541176470588235,0.156862745098039,0.505882352941176;0.549019607843137,0.160784313725490,0.501960784313726;0.552941176470588,0.160784313725490,0.501960784313726;0.560784313725490,0.164705882352941,0.501960784313726;0.568627450980392,0.164705882352941,0.501960784313726;0.576470588235294,0.168627450980392,0.501960784313726;0.584313725490196,0.172549019607843,0.501960784313726;0.592156862745098,0.172549019607843,0.498039215686275;0.600000000000000,0.176470588235294,0.498039215686275;0.603921568627451,0.176470588235294,0.498039215686275;0.611764705882353,0.180392156862745,0.498039215686275;0.619607843137255,0.180392156862745,0.494117647058824;0.627450980392157,0.184313725490196,0.494117647058824;0.639215686274510,0.188235294117647,0.494117647058824;0.643137254901961,0.188235294117647,0.490196078431373;0.650980392156863,0.192156862745098,0.490196078431373;0.654901960784314,0.192156862745098,0.490196078431373;0.662745098039216,0.196078431372549,0.486274509803922;0.670588235294118,0.200000000000000,0.482352941176471;0.682352941176471,0.203921568627451,0.482352941176471;0.690196078431373,0.203921568627451,0.482352941176471;0.694117647058824,0.207843137254902,0.478431372549020;0.701960784313725,0.207843137254902,0.478431372549020;0.709803921568628,0.211764705882353,0.474509803921569;0.713725490196078,0.211764705882353,0.474509803921569;0.721568627450980,0.215686274509804,0.470588235294118;0.733333333333333,0.219607843137255,0.466666666666667;0.741176470588235,0.223529411764706,0.466666666666667;0.745098039215686,0.223529411764706,0.462745098039216;0.752941176470588,0.227450980392157,0.458823529411765;0.760784313725490,0.227450980392157,0.458823529411765;0.764705882352941,0.231372549019608,0.454901960784314;0.772549019607843,0.235294117647059,0.450980392156863;0.784313725490196,0.239215686274510,0.447058823529412;0.792156862745098,0.243137254901961,0.447058823529412;0.796078431372549,0.243137254901961,0.443137254901961;0.803921568627451,0.247058823529412,0.439215686274510;0.807843137254902,0.250980392156863,0.439215686274510;0.815686274509804,0.254901960784314,0.435294117647059;0.827450980392157,0.258823529411765,0.427450980392157;0.831372549019608,0.262745098039216,0.427450980392157;0.839215686274510,0.266666666666667,0.423529411764706;0.843137254901961,0.270588235294118,0.419607843137255;0.850980392156863,0.274509803921569,0.415686274509804;0.854901960784314,0.278431372549020,0.411764705882353;0.862745098039216,0.282352941176471,0.411764705882353;0.870588235294118,0.290196078431373,0.403921568627451;0.878431372549020,0.294117647058824,0.400000000000000;0.882352941176471,0.298039215686275,0.400000000000000;0.886274509803922,0.301960784313725,0.396078431372549;0.894117647058824,0.305882352941177,0.392156862745098;0.898039215686275,0.313725490196078,0.388235294117647;0.901960784313726,0.317647058823529,0.384313725490196;0.909803921568627,0.329411764705882,0.380392156862745;0.917647058823529,0.333333333333333,0.376470588235294;0.921568627450980,0.337254901960784,0.376470588235294;0.925490196078431,0.345098039215686,0.372549019607843;0.929411764705882,0.349019607843137,0.372549019607843;0.933333333333333,0.356862745098039,0.368627450980392;0.933333333333333,0.364705882352941,0.364705882352941;0.941176470588235,0.376470588235294,0.364705882352941;0.945098039215686,0.380392156862745,0.360784313725490;0.949019607843137,0.388235294117647,0.360784313725490;0.952941176470588,0.396078431372549,0.360784313725490;0.952941176470588,0.403921568627451,0.356862745098039;0.956862745098039,0.407843137254902,0.356862745098039;0.960784313725490,0.419607843137255,0.356862745098039;0.964705882352941,0.431372549019608,0.356862745098039;0.964705882352941,0.439215686274510,0.356862745098039;0.968627450980392,0.443137254901961,0.356862745098039;0.968627450980392,0.450980392156863,0.360784313725490;0.972549019607843,0.458823529411765,0.360784313725490;0.972549019607843,0.466666666666667,0.360784313725490;0.976470588235294,0.478431372549020,0.360784313725490;0.976470588235294,0.490196078431373,0.364705882352941;0.980392156862745,0.498039215686275,0.368627450980392;0.980392156862745,0.501960784313726,0.368627450980392;0.980392156862745,0.509803921568627,0.372549019607843;0.984313725490196,0.517647058823530,0.376470588235294;0.984313725490196,0.525490196078431,0.376470588235294;0.984313725490196,0.537254901960784,0.380392156862745;0.988235294117647,0.549019607843137,0.388235294117647;0.988235294117647,0.556862745098039,0.388235294117647;0.988235294117647,0.564705882352941,0.392156862745098;0.988235294117647,0.572549019607843,0.396078431372549;0.988235294117647,0.576470588235294,0.400000000000000;0.992156862745098,0.588235294117647,0.403921568627451;0.992156862745098,0.600000000000000,0.411764705882353;0.992156862745098,0.607843137254902,0.415686274509804;0.992156862745098,0.615686274509804,0.419607843137255;0.992156862745098,0.623529411764706,0.423529411764706;0.992156862745098,0.631372549019608,0.431372549019608;0.992156862745098,0.635294117647059,0.435294117647059;0.992156862745098,0.647058823529412,0.439215686274510;0.996078431372549,0.658823529411765,0.450980392156863;0.996078431372549,0.666666666666667,0.454901960784314;0.996078431372549,0.674509803921569,0.458823529411765;0.996078431372549,0.682352941176471,0.462745098039216;0.996078431372549,0.686274509803922,0.470588235294118;0.996078431372549,0.694117647058824,0.474509803921569;0.996078431372549,0.705882352941177,0.482352941176471;0.996078431372549,0.717647058823529,0.490196078431373;0.996078431372549,0.725490196078431,0.498039215686275;0.996078431372549,0.733333333333333,0.501960784313726;0.996078431372549,0.737254901960784,0.509803921568627;0.996078431372549,0.745098039215686,0.513725490196078;0.996078431372549,0.752941176470588,0.521568627450980;0.996078431372549,0.768627450980392,0.533333333333333;0.996078431372549,0.776470588235294,0.537254901960784;0.996078431372549,0.780392156862745,0.545098039215686;0.996078431372549,0.788235294117647,0.552941176470588;0.996078431372549,0.796078431372549,0.556862745098039;0.992156862745098,0.803921568627451,0.564705882352941;0.992156862745098,0.811764705882353,0.572549019607843;0.992156862745098,0.823529411764706,0.584313725490196;0.992156862745098,0.831372549019608,0.592156862745098;0.992156862745098,0.839215686274510,0.596078431372549;0.992156862745098,0.847058823529412,0.603921568627451;0.992156862745098,0.854901960784314,0.611764705882353;0.992156862745098,0.862745098039216,0.615686274509804;0.992156862745098,0.866666666666667,0.623529411764706;0.992156862745098,0.882352941176471,0.639215686274510;0.988235294117647,0.890196078431373,0.647058823529412;0.988235294117647,0.898039215686275,0.650980392156863;0.988235294117647,0.901960784313726,0.658823529411765;0.988235294117647,0.909803921568627,0.666666666666667;0.988235294117647,0.917647058823529,0.674509803921569;0.988235294117647,0.925490196078431,0.682352941176471;0.988235294117647,0.941176470588235,0.694117647058824;0.988235294117647,0.945098039215686,0.701960784313725;0.988235294117647,0.952941176470588,0.709803921568628;0.988235294117647,0.960784313725490,0.717647058823529;0.984313725490196,0.968627450980392,0.725490196078431;0.984313725490196,0.976470588235294,0.733333333333333;0.984313725490196,0.984313725490196,0.745098039215686;0.984313725490196,0.988235294117647,0.749019607843137]; + [0,0.133333333333333,0.301960784313725;0,0.137254901960784,0.309803921568627;0,0.137254901960784,0.313725490196078;0,0.141176470588235,0.321568627450980;0,0.145098039215686,0.329411764705882;0,0.149019607843137,0.333333333333333;0,0.152941176470588,0.349019607843137;0,0.156862745098039,0.356862745098039;0,0.156862745098039,0.360784313725490;0,0.160784313725490,0.368627450980392;0,0.164705882352941,0.384313725490196;0,0.168627450980392,0.392156862745098;0,0.172549019607843,0.400000000000000;0,0.172549019607843,0.403921568627451;0,0.176470588235294,0.411764705882353;0,0.184313725490196,0.427450980392157;0,0.184313725490196,0.435294117647059;0,0.188235294117647,0.439215686274510;0,0.188235294117647,0.439215686274510;0,0.192156862745098,0.439215686274510;0.00784313725490196,0.196078431372549,0.439215686274510;0.0313725490196078,0.200000000000000,0.439215686274510;0.0431372549019608,0.200000000000000,0.439215686274510;0.0549019607843137,0.203921568627451,0.439215686274510;0.0666666666666667,0.207843137254902,0.435294117647059;0.0862745098039216,0.211764705882353,0.435294117647059;0.0941176470588235,0.215686274509804,0.435294117647059;0.101960784313725,0.219607843137255,0.435294117647059;0.113725490196078,0.223529411764706,0.431372549019608;0.113725490196078,0.223529411764706,0.431372549019608;0.121568627450980,0.227450980392157,0.431372549019608;0.133333333333333,0.231372549019608,0.431372549019608;0.141176470588235,0.235294117647059,0.431372549019608;0.145098039215686,0.239215686274510,0.427450980392157;0.156862745098039,0.243137254901961,0.427450980392157;0.164705882352941,0.247058823529412,0.427450980392157;0.168627450980392,0.247058823529412,0.427450980392157;0.172549019607843,0.250980392156863,0.427450980392157;0.180392156862745,0.254901960784314,0.423529411764706;0.184313725490196,0.258823529411765,0.423529411764706;0.192156862745098,0.262745098039216,0.423529411764706;0.196078431372549,0.266666666666667,0.423529411764706;0.203921568627451,0.266666666666667,0.423529411764706;0.207843137254902,0.270588235294118,0.423529411764706;0.215686274509804,0.274509803921569,0.423529411764706;0.215686274509804,0.274509803921569,0.423529411764706;0.223529411764706,0.282352941176471,0.423529411764706;0.227450980392157,0.282352941176471,0.419607843137255;0.231372549019608,0.286274509803922,0.419607843137255;0.243137254901961,0.294117647058824,0.419607843137255;0.247058823529412,0.294117647058824,0.419607843137255;0.250980392156863,0.298039215686275,0.419607843137255;0.254901960784314,0.301960784313725,0.419607843137255;0.258823529411765,0.301960784313725,0.419607843137255;0.262745098039216,0.305882352941177,0.419607843137255;0.270588235294118,0.309803921568627,0.419607843137255;0.274509803921569,0.313725490196078,0.419607843137255;0.278431372549020,0.317647058823529,0.419607843137255;0.282352941176471,0.317647058823529,0.419607843137255;0.290196078431373,0.325490196078431,0.419607843137255;0.294117647058824,0.329411764705882,0.423529411764706;0.298039215686275,0.329411764705882,0.423529411764706;0.301960784313725,0.333333333333333,0.423529411764706;0.305882352941177,0.337254901960784,0.423529411764706;0.309803921568627,0.341176470588235,0.423529411764706;0.313725490196078,0.345098039215686,0.423529411764706;0.317647058823529,0.345098039215686,0.423529411764706;0.321568627450980,0.349019607843137,0.423529411764706;0.329411764705882,0.352941176470588,0.423529411764706;0.329411764705882,0.352941176470588,0.423529411764706;0.337254901960784,0.360784313725490,0.427450980392157;0.341176470588235,0.364705882352941,0.427450980392157;0.345098039215686,0.364705882352941,0.427450980392157;0.349019607843137,0.368627450980392,0.427450980392157;0.352941176470588,0.372549019607843,0.427450980392157;0.356862745098039,0.376470588235294,0.431372549019608;0.360784313725490,0.380392156862745,0.431372549019608;0.364705882352941,0.380392156862745,0.431372549019608;0.368627450980392,0.384313725490196,0.431372549019608;0.372549019607843,0.388235294117647,0.431372549019608;0.380392156862745,0.392156862745098,0.435294117647059;0.380392156862745,0.396078431372549,0.435294117647059;0.384313725490196,0.400000000000000,0.435294117647059;0.392156862745098,0.403921568627451,0.435294117647059;0.396078431372549,0.407843137254902,0.439215686274510;0.400000000000000,0.411764705882353,0.439215686274510;0.403921568627451,0.411764705882353,0.439215686274510;0.407843137254902,0.415686274509804,0.439215686274510;0.407843137254902,0.419607843137255,0.443137254901961;0.415686274509804,0.423529411764706,0.443137254901961;0.419607843137255,0.427450980392157,0.443137254901961;0.423529411764706,0.427450980392157,0.447058823529412;0.431372549019608,0.435294117647059,0.447058823529412;0.431372549019608,0.439215686274510,0.450980392156863;0.431372549019608,0.439215686274510,0.450980392156863;0.439215686274510,0.443137254901961,0.450980392156863;0.443137254901961,0.447058823529412,0.450980392156863;0.447058823529412,0.450980392156863,0.454901960784314;0.454901960784314,0.454901960784314,0.458823529411765;0.454901960784314,0.458823529411765,0.458823529411765;0.458823529411765,0.458823529411765,0.458823529411765;0.462745098039216,0.462745098039216,0.462745098039216;0.466666666666667,0.466666666666667,0.462745098039216;0.470588235294118,0.470588235294118,0.462745098039216;0.474509803921569,0.474509803921569,0.466666666666667;0.478431372549020,0.478431372549020,0.466666666666667;0.482352941176471,0.482352941176471,0.466666666666667;0.486274509803922,0.482352941176471,0.470588235294118;0.494117647058824,0.490196078431373,0.470588235294118;0.498039215686275,0.490196078431373,0.470588235294118;0.501960784313726,0.494117647058824,0.470588235294118;0.505882352941176,0.498039215686275,0.470588235294118;0.509803921568627,0.501960784313726,0.470588235294118;0.517647058823530,0.505882352941176,0.470588235294118;0.521568627450980,0.509803921568627,0.470588235294118;0.521568627450980,0.513725490196078,0.470588235294118;0.525490196078431,0.513725490196078,0.470588235294118;0.533333333333333,0.521568627450980,0.470588235294118;0.533333333333333,0.521568627450980,0.470588235294118;0.541176470588235,0.525490196078431,0.470588235294118;0.545098039215686,0.529411764705882,0.470588235294118;0.549019607843137,0.533333333333333,0.470588235294118;0.552941176470588,0.537254901960784,0.470588235294118;0.560784313725490,0.541176470588235,0.466666666666667;0.564705882352941,0.545098039215686,0.466666666666667;0.568627450980392,0.549019607843137,0.466666666666667;0.572549019607843,0.549019607843137,0.466666666666667;0.576470588235294,0.552941176470588,0.466666666666667;0.580392156862745,0.556862745098039,0.466666666666667;0.588235294117647,0.560784313725490,0.466666666666667;0.592156862745098,0.564705882352941,0.462745098039216;0.596078431372549,0.568627450980392,0.462745098039216;0.603921568627451,0.576470588235294,0.462745098039216;0.607843137254902,0.576470588235294,0.462745098039216;0.611764705882353,0.580392156862745,0.462745098039216;0.615686274509804,0.584313725490196,0.458823529411765;0.619607843137255,0.588235294117647,0.458823529411765;0.623529411764706,0.588235294117647,0.458823529411765;0.631372549019608,0.596078431372549,0.454901960784314;0.635294117647059,0.600000000000000,0.454901960784314;0.639215686274510,0.603921568627451,0.454901960784314;0.647058823529412,0.607843137254902,0.450980392156863;0.647058823529412,0.607843137254902,0.450980392156863;0.650980392156863,0.611764705882353,0.450980392156863;0.658823529411765,0.619607843137255,0.450980392156863;0.662745098039216,0.619607843137255,0.447058823529412;0.666666666666667,0.623529411764706,0.447058823529412;0.674509803921569,0.631372549019608,0.443137254901961;0.678431372549020,0.635294117647059,0.443137254901961;0.682352941176471,0.635294117647059,0.443137254901961;0.686274509803922,0.639215686274510,0.439215686274510;0.690196078431373,0.643137254901961,0.439215686274510;0.694117647058824,0.647058823529412,0.439215686274510;0.701960784313725,0.650980392156863,0.435294117647059;0.705882352941177,0.654901960784314,0.435294117647059;0.709803921568628,0.658823529411765,0.431372549019608;0.713725490196078,0.662745098039216,0.431372549019608;0.721568627450980,0.670588235294118,0.427450980392157;0.725490196078431,0.670588235294118,0.427450980392157;0.729411764705882,0.674509803921569,0.423529411764706;0.733333333333333,0.678431372549020,0.423529411764706;0.737254901960784,0.682352941176471,0.419607843137255;0.745098039215686,0.690196078431373,0.415686274509804;0.749019607843137,0.690196078431373,0.415686274509804;0.756862745098039,0.694117647058824,0.411764705882353;0.760784313725490,0.698039215686275,0.411764705882353;0.768627450980392,0.705882352941177,0.407843137254902;0.768627450980392,0.705882352941177,0.407843137254902;0.776470588235294,0.709803921568628,0.403921568627451;0.780392156862745,0.713725490196078,0.400000000000000;0.784313725490196,0.717647058823529,0.396078431372549;0.788235294117647,0.721568627450980,0.396078431372549;0.796078431372549,0.729411764705882,0.392156862745098;0.800000000000000,0.733333333333333,0.388235294117647;0.803921568627451,0.737254901960784,0.384313725490196;0.807843137254902,0.737254901960784,0.384313725490196;0.811764705882353,0.741176470588235,0.380392156862745;0.815686274509804,0.745098039215686,0.376470588235294;0.827450980392157,0.752941176470588,0.372549019607843;0.831372549019608,0.756862745098039,0.368627450980392;0.835294117647059,0.760784313725490,0.368627450980392;0.843137254901961,0.764705882352941,0.360784313725490;0.847058823529412,0.768627450980392,0.356862745098039;0.850980392156863,0.772549019607843,0.352941176470588;0.854901960784314,0.776470588235294,0.352941176470588;0.858823529411765,0.780392156862745,0.349019607843137;0.862745098039216,0.784313725490196,0.345098039215686;0.874509803921569,0.792156862745098,0.337254901960784;0.878431372549020,0.796078431372549,0.333333333333333;0.882352941176471,0.800000000000000,0.329411764705882;0.890196078431373,0.803921568627451,0.321568627450980;0.890196078431373,0.803921568627451,0.321568627450980;0.894117647058824,0.807843137254902,0.317647058823529;0.901960784313726,0.815686274509804,0.309803921568627;0.909803921568627,0.819607843137255,0.305882352941177;0.913725490196078,0.823529411764706,0.301960784313725;0.921568627450980,0.831372549019608,0.294117647058824;0.925490196078431,0.835294117647059,0.290196078431373;0.929411764705882,0.839215686274510,0.282352941176471;0.933333333333333,0.843137254901961,0.278431372549020;0.937254901960784,0.847058823529412,0.274509803921569;0.945098039215686,0.850980392156863,0.266666666666667;0.952941176470588,0.854901960784314,0.258823529411765;0.956862745098039,0.858823529411765,0.250980392156863;0.960784313725490,0.862745098039216,0.247058823529412;0.964705882352941,0.866666666666667,0.239215686274510;0.976470588235294,0.874509803921569,0.227450980392157;0.976470588235294,0.874509803921569,0.223529411764706;0.984313725490196,0.882352941176471,0.211764705882353;0.992156862745098,0.886274509803922,0.203921568627451;0.992156862745098,0.890196078431373,0.200000000000000;0.992156862745098,0.901960784313726,0.211764705882353;0.992156862745098,0.905882352941177,0.215686274509804;0.992156862745098,0.905882352941177,0.215686274509804]; + [0.200000000000000,0.200000000000000,0.600000000000000;0.192156862745098,0.207843137254902,0.607843137254902;0.188235294117647,0.215686274509804,0.615686274509804;0.184313725490196,0.231372549019608,0.631372549019608;0.176470588235294,0.239215686274510,0.639215686274510;0.172549019607843,0.250980392156863,0.650980392156863;0.168627450980392,0.262745098039216,0.662745098039216;0.160784313725490,0.270588235294118,0.670588235294118;0.156862745098039,0.282352941176471,0.682352941176471;0.152941176470588,0.294117647058824,0.694117647058824;0.145098039215686,0.301960784313725,0.701960784313725;0.141176470588235,0.313725490196078,0.713725490196078;0.137254901960784,0.325490196078431,0.725490196078431;0.129411764705882,0.337254901960784,0.737254901960784;0.125490196078431,0.345098039215686,0.745098039215686;0.113725490196078,0.364705882352941,0.764705882352941;0.113725490196078,0.364705882352941,0.764705882352941;0.105882352941176,0.384313725490196,0.788235294117647;0.0980392156862745,0.392156862745098,0.796078431372549;0.0980392156862745,0.396078431372549,0.796078431372549;0.0901960784313726,0.419607843137255,0.819607843137255;0.0862745098039216,0.423529411764706,0.823529411764706;0.0784313725490196,0.439215686274510,0.839215686274510;0.0745098039215686,0.450980392156863,0.850980392156863;0.0666666666666667,0.458823529411765,0.858823529411765;0.0627450980392157,0.470588235294118,0.870588235294118;0.0549019607843137,0.478431372549020,0.878431372549020;0.0509803921568627,0.490196078431373,0.890196078431373;0.0470588235294118,0.501960784313726,0.901960784313726;0.0431372549019608,0.513725490196078,0.913725490196078;0.0352941176470588,0.521568627450980,0.921568627450980;0.0313725490196078,0.533333333333333,0.933333333333333;0.0274509803921569,0.545098039215686,0.945098039215686;0.0196078431372549,0.552941176470588,0.952941176470588;0.0156862745098039,0.564705882352941,0.964705882352941;0.0117647058823529,0.576470588235294,0.976470588235294;0.00392156862745098,0.584313725490196,0.984313725490196;0,0.600000000000000,0.988235294117647;0,0.603921568627451,0.980392156862745;0,0.619607843137255,0.933333333333333;0,0.619607843137255,0.929411764705882;0,0.635294117647059,0.886274509803922;0,0.643137254901961,0.866666666666667;0,0.643137254901961,0.862745098039216;0,0.658823529411765,0.815686274509804;0,0.662745098039216,0.803921568627451;0,0.674509803921569,0.768627450980392;0,0.682352941176471,0.745098039215686;0,0.690196078431373,0.721568627450980;0,0.698039215686275,0.698039215686275;0,0.705882352941177,0.678431372549020;0,0.713725490196078,0.650980392156863;0,0.721568627450980,0.627450980392157;0,0.729411764705882,0.603921568627451;0,0.737254901960784,0.580392156862745;0,0.745098039215686,0.556862745098039;0,0.756862745098039,0.525490196078431;0,0.760784313725490,0.509803921568627;0,0.768627450980392,0.486274509803922;0,0.776470588235294,0.462745098039216;0,0.784313725490196,0.439215686274510;0.00392156862745098,0.796078431372549,0.403921568627451;0.00392156862745098,0.800000000000000,0.400000000000000;0.0313725490196078,0.803921568627451,0.403921568627451;0.0392156862745098,0.803921568627451,0.403921568627451;0.0666666666666667,0.811764705882353,0.411764705882353;0.0823529411764706,0.815686274509804,0.415686274509804;0.0823529411764706,0.815686274509804,0.415686274509804;0.113725490196078,0.819607843137255,0.419607843137255;0.125490196078431,0.823529411764706,0.423529411764706;0.145098039215686,0.827450980392157,0.427450980392157;0.156862745098039,0.831372549019608,0.431372549019608;0.176470588235294,0.835294117647059,0.435294117647059;0.192156862745098,0.835294117647059,0.435294117647059;0.207843137254902,0.839215686274510,0.439215686274510;0.223529411764706,0.843137254901961,0.443137254901961;0.239215686274510,0.847058823529412,0.447058823529412;0.254901960784314,0.850980392156863,0.450980392156863;0.270588235294118,0.850980392156863,0.450980392156863;0.282352941176471,0.854901960784314,0.454901960784314;0.309803921568627,0.858823529411765,0.458823529411765;0.317647058823529,0.862745098039216,0.462745098039216;0.333333333333333,0.866666666666667,0.466666666666667;0.349019607843137,0.866666666666667,0.466666666666667;0.364705882352941,0.870588235294118,0.470588235294118;0.392156862745098,0.878431372549020,0.478431372549020;0.396078431372549,0.878431372549020,0.478431372549020;0.427450980392157,0.882352941176471,0.482352941176471;0.435294117647059,0.882352941176471,0.482352941176471;0.458823529411765,0.890196078431373,0.490196078431373;0.474509803921569,0.894117647058824,0.494117647058824;0.478431372549020,0.894117647058824,0.494117647058824;0.505882352941176,0.898039215686275,0.498039215686275;0.517647058823530,0.901960784313726,0.501960784313726;0.533333333333333,0.905882352941177,0.505882352941176;0.552941176470588,0.909803921568627,0.509803921568627;0.568627450980392,0.913725490196078,0.513725490196078;0.584313725490196,0.913725490196078,0.513725490196078;0.600000000000000,0.917647058823529,0.517647058823530;0.615686274509804,0.921568627450980,0.521568627450980;0.631372549019608,0.925490196078431,0.525490196078431;0.647058823529412,0.929411764705882,0.529411764705882;0.658823529411765,0.929411764705882,0.529411764705882;0.678431372549020,0.933333333333333,0.533333333333333;0.701960784313725,0.941176470588235,0.541176470588235;0.709803921568628,0.941176470588235,0.541176470588235;0.741176470588235,0.945098039215686,0.545098039215686;0.745098039215686,0.945098039215686,0.545098039215686;0.756862745098039,0.949019607843137,0.549019607843137;0.780392156862745,0.956862745098039,0.556862745098039;0.784313725490196,0.956862745098039,0.556862745098039;0.819607843137255,0.960784313725490,0.560784313725490;0.827450980392157,0.964705882352941,0.564705882352941;0.850980392156863,0.968627450980392,0.568627450980392;0.866666666666667,0.972549019607843,0.572549019607843;0.870588235294118,0.972549019607843,0.572549019607843;0.898039215686275,0.976470588235294,0.576470588235294;0.909803921568627,0.980392156862745,0.580392156862745;0.929411764705882,0.984313725490196,0.584313725490196;0.945098039215686,0.988235294117647,0.588235294117647;0.960784313725490,0.992156862745098,0.592156862745098;0.976470588235294,0.992156862745098,0.592156862745098;0.992156862745098,0.996078431372549,0.596078431372549;0.996078431372549,0.992156862745098,0.596078431372549;0.988235294117647,0.984313725490196,0.592156862745098;0.980392156862745,0.972549019607843,0.588235294117647;0.972549019607843,0.964705882352941,0.584313725490196;0.964705882352941,0.952941176470588,0.580392156862745;0.952941176470588,0.937254901960784,0.572549019607843;0.949019607843137,0.933333333333333,0.568627450980392;0.933333333333333,0.913725490196078,0.560784313725490;0.929411764705882,0.909803921568627,0.560784313725490;0.925490196078431,0.901960784313726,0.556862745098039;0.909803921568627,0.882352941176471,0.549019607843137;0.909803921568627,0.882352941176471,0.549019607843137;0.894117647058824,0.862745098039216,0.541176470588235;0.890196078431373,0.854901960784314,0.537254901960784;0.878431372549020,0.843137254901961,0.533333333333333;0.870588235294118,0.831372549019608,0.529411764705882;0.862745098039216,0.823529411764706,0.525490196078431;0.854901960784314,0.811764705882353,0.521568627450980;0.847058823529412,0.803921568627451,0.513725490196078;0.839215686274510,0.792156862745098,0.509803921568627;0.827450980392157,0.780392156862745,0.505882352941176;0.823529411764706,0.772549019607843,0.501960784313726;0.815686274509804,0.760784313725490,0.498039215686275;0.807843137254902,0.752941176470588,0.494117647058824;0.800000000000000,0.741176470588235,0.490196078431373;0.792156862745098,0.733333333333333,0.486274509803922;0.784313725490196,0.721568627450980,0.482352941176471;0.776470588235294,0.713725490196078,0.478431372549020;0.764705882352941,0.701960784313725,0.474509803921569;0.756862745098039,0.686274509803922,0.466666666666667;0.752941176470588,0.682352941176471,0.462745098039216;0.737254901960784,0.662745098039216,0.454901960784314;0.733333333333333,0.658823529411765,0.454901960784314;0.729411764705882,0.650980392156863,0.450980392156863;0.713725490196078,0.631372549019608,0.443137254901961;0.713725490196078,0.631372549019608,0.443137254901961;0.698039215686275,0.611764705882353,0.435294117647059;0.694117647058824,0.603921568627451,0.431372549019608;0.682352941176471,0.592156862745098,0.427450980392157;0.674509803921569,0.580392156862745,0.423529411764706;0.666666666666667,0.572549019607843,0.419607843137255;0.658823529411765,0.560784313725490,0.415686274509804;0.650980392156863,0.552941176470588,0.407843137254902;0.639215686274510,0.541176470588235,0.403921568627451;0.635294117647059,0.529411764705882,0.400000000000000;0.627450980392157,0.521568627450980,0.396078431372549;0.619607843137255,0.509803921568627,0.392156862745098;0.611764705882353,0.501960784313726,0.388235294117647;0.603921568627451,0.490196078431373,0.384313725490196;0.596078431372549,0.482352941176471,0.380392156862745;0.588235294117647,0.470588235294118,0.376470588235294;0.576470588235294,0.458823529411765,0.372549019607843;0.572549019607843,0.450980392156863,0.368627450980392;0.556862745098039,0.431372549019608,0.356862745098039;0.556862745098039,0.431372549019608,0.356862745098039;0.541176470588235,0.411764705882353,0.349019607843137;0.537254901960784,0.403921568627451,0.345098039215686;0.533333333333333,0.400000000000000,0.345098039215686;0.513725490196078,0.380392156862745,0.337254901960784;0.513725490196078,0.380392156862745,0.337254901960784;0.501960784313726,0.360784313725490,0.329411764705882;0.505882352941176,0.364705882352941,0.337254901960784;0.513725490196078,0.376470588235294,0.345098039215686;0.521568627450980,0.384313725490196,0.356862745098039;0.529411764705882,0.396078431372549,0.368627450980392;0.533333333333333,0.403921568627451,0.376470588235294;0.545098039215686,0.415686274509804,0.388235294117647;0.552941176470588,0.427450980392157,0.400000000000000;0.560784313725490,0.435294117647059,0.407843137254902;0.568627450980392,0.447058823529412,0.419607843137255;0.576470588235294,0.454901960784314,0.431372549019608;0.584313725490196,0.466666666666667,0.439215686274510;0.596078431372549,0.482352941176471,0.458823529411765;0.600000000000000,0.486274509803922,0.462745098039216;0.607843137254902,0.498039215686275,0.474509803921569;0.619607843137255,0.509803921568627,0.486274509803922;0.623529411764706,0.517647058823530,0.494117647058824;0.639215686274510,0.537254901960784,0.513725490196078;0.639215686274510,0.537254901960784,0.513725490196078;0.654901960784314,0.556862745098039,0.537254901960784;0.658823529411765,0.560784313725490,0.541176470588235;0.658823529411765,0.564705882352941,0.545098039215686;0.678431372549020,0.588235294117647,0.568627450980392;0.682352941176471,0.592156862745098,0.572549019607843;0.694117647058824,0.607843137254902,0.588235294117647;0.701960784313725,0.615686274509804,0.600000000000000;0.709803921568628,0.627450980392157,0.607843137254902;0.717647058823529,0.635294117647059,0.619607843137255;0.725490196078431,0.647058823529412,0.631372549019608;0.733333333333333,0.654901960784314,0.639215686274510;0.741176470588235,0.666666666666667,0.650980392156863;0.749019607843137,0.678431372549020,0.662745098039216;0.756862745098039,0.686274509803922,0.670588235294118;0.764705882352941,0.698039215686275,0.682352941176471;0.768627450980392,0.705882352941177,0.694117647058824;0.780392156862745,0.717647058823529,0.701960784313725;0.792156862745098,0.733333333333333,0.721568627450980;0.796078431372549,0.737254901960784,0.725490196078431;0.803921568627451,0.749019607843137,0.733333333333333;0.815686274509804,0.760784313725490,0.749019607843137;0.819607843137255,0.768627450980392,0.756862745098039;0.831372549019608,0.788235294117647,0.776470588235294;0.831372549019608,0.788235294117647,0.776470588235294;0.850980392156863,0.807843137254902,0.800000000000000;0.854901960784314,0.811764705882353,0.803921568627451;0.858823529411765,0.815686274509804,0.807843137254902;0.874509803921569,0.839215686274510,0.831372549019608;0.878431372549020,0.843137254901961,0.835294117647059;0.890196078431373,0.858823529411765,0.850980392156863;0.894117647058824,0.866666666666667,0.862745098039216;0.905882352941177,0.878431372549020,0.870588235294118;0.909803921568627,0.886274509803922,0.882352941176471;0.921568627450980,0.898039215686275,0.894117647058824;0.929411764705882,0.905882352941177,0.901960784313726;0.937254901960784,0.917647058823529,0.913725490196078;0.945098039215686,0.929411764705882,0.925490196078431;0.952941176470588,0.937254901960784,0.933333333333333;0.956862745098039,0.949019607843137,0.945098039215686;0.968627450980392,0.956862745098039,0.956862745098039;0.976470588235294,0.968627450980392,0.964705882352941;0.992156862745098,0.984313725490196,0.984313725490196;0.992156862745098,0.988235294117647,0.988235294117647]; + [0,0.498039215686275,0;0,0.494117647058824,0.00392156862745098;0,0.490196078431373,0.00784313725490196;0,0.482352941176471,0.0117647058823529;0,0.474509803921569,0.0156862745098039;0,0.470588235294118,0.0196078431372549;0,0.462745098039216,0.0235294117647059;0,0.458823529411765,0.0274509803921569;0,0.450980392156863,0.0313725490196078;0,0.447058823529412,0.0352941176470588;0,0.439215686274510,0.0392156862745098;0,0.435294117647059,0.0431372549019608;0,0.427450980392157,0.0470588235294118;0,0.419607843137255,0.0509803921568627;0,0.415686274509804,0.0549019607843137;0,0.403921568627451,0.0627450980392157;0,0.403921568627451,0.0627450980392157;0,0.392156862745098,0.0705882352941177;0,0.388235294117647,0.0745098039215686;0,0.388235294117647,0.0745098039215686;0,0.376470588235294,0.0823529411764706;0,0.372549019607843,0.0823529411764706;0,0.364705882352941,0.0901960784313726;0,0.356862745098039,0.0941176470588235;0,0.349019607843137,0.0980392156862745;0,0.345098039215686,0.101960784313725;0,0.341176470588235,0.105882352941176;0,0.333333333333333,0.109803921568627;0,0.329411764705882,0.113725490196078;0,0.321568627450980,0.117647058823529;0,0.317647058823529,0.121568627450980;0,0.309803921568627,0.125490196078431;0,0.305882352941177,0.125490196078431;0,0.298039215686275,0.133333333333333;0,0.290196078431373,0.137254901960784;0,0.286274509803922,0.141176470588235;0,0.282352941176471,0.141176470588235;0,0.270588235294118,0.152941176470588;0,0.270588235294118,0.152941176470588;0,0.258823529411765,0.156862745098039;0,0.258823529411765,0.156862745098039;0,0.247058823529412,0.168627450980392;0,0.239215686274510,0.172549019607843;0,0.239215686274510,0.172549019607843;0,0.227450980392157,0.180392156862745;0,0.223529411764706,0.184313725490196;0,0.215686274509804,0.188235294117647;0,0.211764705882353,0.188235294117647;0,0.203921568627451,0.196078431372549;0,0.196078431372549,0.200000000000000;0,0.192156862745098,0.203921568627451;0,0.188235294117647,0.203921568627451;0,0.180392156862745,0.211764705882353;0,0.172549019607843,0.215686274509804;0,0.168627450980392,0.219607843137255;0,0.164705882352941,0.219607843137255;0,0.156862745098039,0.227450980392157;0,0.152941176470588,0.231372549019608;0,0.145098039215686,0.235294117647059;0,0.141176470588235,0.235294117647059;0,0.133333333333333,0.243137254901961;0,0.121568627450980,0.250980392156863;0,0.121568627450980,0.250980392156863;0,0.109803921568627,0.254901960784314;0,0.105882352941176,0.258823529411765;0,0.0980392156862745,0.266666666666667;0,0.0941176470588235,0.270588235294118;0,0.0941176470588235,0.270588235294118;0,0.0784313725490196,0.278431372549020;0,0.0745098039215686,0.282352941176471;0,0.0705882352941177,0.286274509803922;0,0.0627450980392157,0.286274509803922;0,0.0588235294117647,0.294117647058824;0,0.0509803921568627,0.298039215686275;0,0.0470588235294118,0.301960784313725;0,0.0392156862745098,0.305882352941177;0,0.0313725490196078,0.309803921568627;0,0.0274509803921569,0.313725490196078;0,0.0235294117647059,0.317647058823529;0,0.0156862745098039,0.317647058823529;0,0.00784313725490196,0.325490196078431;0,0.00392156862745098,0.329411764705882;0,0,0.333333333333333;0,0.00392156862745098,0.337254901960784;0,0.00784313725490196,0.341176470588235;0,0.0196078431372549,0.349019607843137;0,0.0196078431372549,0.349019607843137;0,0.0313725490196078,0.356862745098039;0,0.0352941176470588,0.356862745098039;0,0.0431372549019608,0.364705882352941;0,0.0509803921568627,0.368627450980392;0,0.0509803921568627,0.368627450980392;0,0.0627450980392157,0.376470588235294;0,0.0666666666666667,0.380392156862745;0,0.0745098039215686,0.380392156862745;0,0.0823529411764706,0.388235294117647;0,0.0862745098039216,0.392156862745098;0,0.0941176470588235,0.396078431372549;0,0.0980392156862745,0.400000000000000;0,0.105882352941176,0.403921568627451;0,0.109803921568627,0.407843137254902;0,0.117647058823529,0.411764705882353;0,0.121568627450980,0.411764705882353;0,0.125490196078431,0.419607843137255;0,0.137254901960784,0.427450980392157;0,0.137254901960784,0.427450980392157;0,0.152941176470588,0.435294117647059;0,0.152941176470588,0.435294117647059;0,0.156862745098039,0.439215686274510;0,0.168627450980392,0.443137254901961;0,0.168627450980392,0.443137254901961;0,0.180392156862745,0.454901960784314;0,0.184313725490196,0.458823529411765;0,0.192156862745098,0.462745098039216;0,0.196078431372549,0.466666666666667;0,0.196078431372549,0.466666666666667;0,0.207843137254902,0.474509803921569;0,0.215686274509804,0.474509803921569;0,0.219607843137255,0.482352941176471;0,0.227450980392157,0.486274509803922;0,0.231372549019608,0.490196078431373;0,0.239215686274510,0.494117647058824;0,0.247058823529412,0.498039215686275;0,0.250980392156863,0.501960784313726;0,0.254901960784314,0.505882352941176;0,0.262745098039216,0.509803921568627;0,0.266666666666667,0.513725490196078;0,0.274509803921569,0.513725490196078;0,0.286274509803922,0.525490196078431;0,0.286274509803922,0.525490196078431;0,0.298039215686275,0.533333333333333;0,0.301960784313725,0.533333333333333;0,0.305882352941177,0.537254901960784;0,0.317647058823529,0.545098039215686;0,0.317647058823529,0.545098039215686;0,0.329411764705882,0.552941176470588;0,0.333333333333333,0.556862745098039;0,0.341176470588235,0.560784313725490;0,0.345098039215686,0.564705882352941;0,0.349019607843137,0.568627450980392;0,0.356862745098039,0.572549019607843;0,0.360784313725490,0.576470588235294;0,0.368627450980392,0.576470588235294;0,0.376470588235294,0.584313725490196;0,0.380392156862745,0.588235294117647;0,0.384313725490196,0.592156862745098;0,0.392156862745098,0.596078431372549;0,0.396078431372549,0.600000000000000;0,0.403921568627451,0.603921568627451;0,0.407843137254902,0.607843137254902;0,0.415686274509804,0.611764705882353;0,0.423529411764706,0.615686274509804;0,0.431372549019608,0.623529411764706;0,0.435294117647059,0.623529411764706;0,0.443137254901961,0.631372549019608;0,0.447058823529412,0.631372549019608;0,0.450980392156863,0.635294117647059;0,0.462745098039216,0.639215686274510;0,0.462745098039216,0.639215686274510;0,0.474509803921569,0.650980392156863;0,0.478431372549020,0.654901960784314;0,0.486274509803922,0.658823529411765;0,0.494117647058824,0.662745098039216;0,0.498039215686275,0.666666666666667;0.00784313725490196,0.505882352941176,0.670588235294118;0.0196078431372549,0.509803921568627,0.674509803921569;0.0313725490196078,0.513725490196078,0.678431372549020;0.0431372549019608,0.521568627450980,0.682352941176471;0.0549019607843137,0.525490196078431,0.686274509803922;0.0666666666666667,0.533333333333333,0.690196078431373;0.0784313725490196,0.537254901960784,0.694117647058824;0.0901960784313726,0.545098039215686,0.698039215686275;0.101960784313725,0.549019607843137,0.701960784313725;0.113725490196078,0.556862745098039,0.701960784313725;0.129411764705882,0.564705882352941,0.709803921568628;0.137254901960784,0.568627450980392,0.713725490196078;0.156862745098039,0.580392156862745,0.721568627450980;0.160784313725490,0.580392156862745,0.721568627450980;0.184313725490196,0.592156862745098,0.729411764705882;0.192156862745098,0.596078431372549,0.733333333333333;0.196078431372549,0.596078431372549,0.733333333333333;0.223529411764706,0.611764705882353,0.741176470588235;0.227450980392157,0.611764705882353,0.741176470588235;0.247058823529412,0.623529411764706,0.749019607843137;0.254901960784314,0.627450980392157,0.752941176470588;0.266666666666667,0.635294117647059,0.756862745098039;0.278431372549020,0.639215686274510,0.760784313725490;0.290196078431373,0.643137254901961,0.764705882352941;0.301960784313725,0.650980392156863,0.764705882352941;0.317647058823529,0.658823529411765,0.772549019607843;0.329411764705882,0.662745098039216,0.776470588235294;0.341176470588235,0.670588235294118,0.780392156862745;0.352941176470588,0.674509803921569,0.784313725490196;0.364705882352941,0.682352941176471,0.788235294117647;0.376470588235294,0.686274509803922,0.792156862745098;0.392156862745098,0.698039215686275,0.800000000000000;0.400000000000000,0.698039215686275,0.800000000000000;0.411764705882353,0.705882352941177,0.803921568627451;0.427450980392157,0.713725490196078,0.807843137254902;0.435294117647059,0.717647058823529,0.811764705882353;0.458823529411765,0.729411764705882,0.819607843137255;0.458823529411765,0.729411764705882,0.819607843137255;0.482352941176471,0.741176470588235,0.827450980392157;0.490196078431373,0.745098039215686,0.827450980392157;0.494117647058824,0.745098039215686,0.827450980392157;0.513725490196078,0.756862745098039,0.839215686274510;0.517647058823530,0.760784313725490,0.839215686274510;0.537254901960784,0.768627450980392,0.847058823529412;0.549019607843137,0.772549019607843,0.850980392156863;0.560784313725490,0.780392156862745,0.854901960784314;0.572549019607843,0.784313725490196,0.858823529411765;0.588235294117647,0.792156862745098,0.862745098039216;0.600000000000000,0.800000000000000,0.866666666666667;0.611764705882353,0.803921568627451,0.870588235294118;0.623529411764706,0.811764705882353,0.874509803921569;0.635294117647059,0.815686274509804,0.878431372549020;0.643137254901961,0.823529411764706,0.882352941176471;0.654901960784314,0.827450980392157,0.886274509803922;0.666666666666667,0.831372549019608,0.890196078431373;0.690196078431373,0.843137254901961,0.894117647058824;0.694117647058824,0.847058823529412,0.898039215686275;0.705882352941177,0.850980392156863,0.901960784313726;0.721568627450980,0.858823529411765,0.905882352941177;0.729411764705882,0.862745098039216,0.909803921568627;0.752941176470588,0.874509803921569,0.917647058823529;0.752941176470588,0.874509803921569,0.917647058823529;0.772549019607843,0.886274509803922,0.925490196078431;0.780392156862745,0.890196078431373,0.929411764705882;0.784313725490196,0.890196078431373,0.929411764705882;0.807843137254902,0.901960784313726,0.937254901960784;0.811764705882353,0.905882352941177,0.937254901960784;0.831372549019608,0.913725490196078,0.945098039215686;0.843137254901961,0.921568627450980,0.949019607843137;0.854901960784314,0.925490196078431,0.952941176470588;0.866666666666667,0.933333333333333,0.952941176470588;0.882352941176471,0.941176470588235,0.960784313725490;0.890196078431373,0.945098039215686,0.964705882352941;0.901960784313726,0.952941176470588,0.968627450980392;0.913725490196078,0.956862745098039,0.972549019607843;0.925490196078431,0.960784313725490,0.976470588235294;0.937254901960784,0.968627450980392,0.980392156862745;0.952941176470588,0.972549019607843,0.984313725490196;0.964705882352941,0.980392156862745,0.988235294117647;0.984313725490196,0.992156862745098,0.996078431372549;0.988235294117647,0.992156862745098,0.996078431372549]; + [0,0,0;0.00392156862745098,0,0.00392156862745098;0.00784313725490196,0.00392156862745098,0.00784313725490196;0.0156862745098039,0.00392156862745098,0.0156862745098039;0.0235294117647059,0.00784313725490196,0.0235294117647059;0.0313725490196078,0.00784313725490196,0.0313725490196078;0.0352941176470588,0.0117647058823529,0.0352941176470588;0.0392156862745098,0.0156862745098039,0.0431372549019608;0.0470588235294118,0.0156862745098039,0.0509803921568627;0.0509803921568627,0.0196078431372549,0.0588235294117647;0.0549019607843137,0.0235294117647059,0.0666666666666667;0.0588235294117647,0.0235294117647059,0.0745098039215686;0.0666666666666667,0.0274509803921569,0.0823529411764706;0.0705882352941177,0.0313725490196078,0.0941176470588235;0.0745098039215686,0.0352941176470588,0.0980392156862745;0.0784313725490196,0.0431372549019608,0.113725490196078;0.0784313725490196,0.0431372549019608,0.113725490196078;0.0862745098039216,0.0470588235294118,0.129411764705882;0.0901960784313726,0.0509803921568627,0.137254901960784;0.0901960784313726,0.0509803921568627,0.137254901960784;0.0941176470588235,0.0588235294117647,0.152941176470588;0.0941176470588235,0.0627450980392157,0.156862745098039;0.0980392156862745,0.0705882352941177,0.168627450980392;0.0980392156862745,0.0745098039215686,0.176470588235294;0.0980392156862745,0.0784313725490196,0.184313725490196;0.101960784313725,0.0823529411764706,0.188235294117647;0.101960784313725,0.0862745098039216,0.196078431372549;0.101960784313725,0.0941176470588235,0.203921568627451;0.101960784313725,0.0980392156862745,0.211764705882353;0.101960784313725,0.101960784313725,0.219607843137255;0.101960784313725,0.109803921568627,0.223529411764706;0.101960784313725,0.113725490196078,0.231372549019608;0.101960784313725,0.121568627450980,0.235294117647059;0.101960784313725,0.125490196078431,0.243137254901961;0.101960784313725,0.133333333333333,0.247058823529412;0.101960784313725,0.137254901960784,0.254901960784314;0.0980392156862745,0.145098039215686,0.258823529411765;0.0980392156862745,0.152941176470588,0.266666666666667;0.0980392156862745,0.156862745098039,0.270588235294118;0.0941176470588235,0.168627450980392,0.278431372549020;0.0941176470588235,0.168627450980392,0.278431372549020;0.0941176470588235,0.180392156862745,0.286274509803922;0.0901960784313726,0.188235294117647,0.290196078431373;0.0901960784313726,0.188235294117647,0.290196078431373;0.0901960784313726,0.203921568627451,0.294117647058824;0.0901960784313726,0.207843137254902,0.298039215686275;0.0862745098039216,0.215686274509804,0.298039215686275;0.0862745098039216,0.223529411764706,0.301960784313725;0.0862745098039216,0.227450980392157,0.301960784313725;0.0823529411764706,0.235294117647059,0.301960784313725;0.0823529411764706,0.243137254901961,0.305882352941177;0.0823529411764706,0.250980392156863,0.305882352941177;0.0823529411764706,0.258823529411765,0.305882352941177;0.0823529411764706,0.262745098039216,0.305882352941177;0.0823529411764706,0.270588235294118,0.305882352941177;0.0784313725490196,0.278431372549020,0.305882352941177;0.0784313725490196,0.286274509803922,0.305882352941177;0.0784313725490196,0.290196078431373,0.301960784313725;0.0823529411764706,0.298039215686275,0.301960784313725;0.0823529411764706,0.305882352941177,0.301960784313725;0.0823529411764706,0.309803921568627,0.298039215686275;0.0823529411764706,0.321568627450980,0.294117647058824;0.0823529411764706,0.325490196078431,0.294117647058824;0.0862745098039216,0.337254901960784,0.290196078431373;0.0862745098039216,0.341176470588235,0.290196078431373;0.0901960784313726,0.349019607843137,0.286274509803922;0.0901960784313726,0.356862745098039,0.282352941176471;0.0901960784313726,0.356862745098039,0.282352941176471;0.0980392156862745,0.368627450980392,0.274509803921569;0.101960784313725,0.372549019607843,0.270588235294118;0.105882352941176,0.380392156862745,0.266666666666667;0.105882352941176,0.384313725490196,0.262745098039216;0.109803921568627,0.388235294117647,0.258823529411765;0.117647058823529,0.396078431372549,0.258823529411765;0.121568627450980,0.400000000000000,0.254901960784314;0.125490196078431,0.403921568627451,0.250980392156863;0.129411764705882,0.407843137254902,0.247058823529412;0.137254901960784,0.415686274509804,0.239215686274510;0.141176470588235,0.419607843137255,0.235294117647059;0.149019607843137,0.423529411764706,0.231372549019608;0.156862745098039,0.427450980392157,0.227450980392157;0.160784313725490,0.431372549019608,0.227450980392157;0.168627450980392,0.435294117647059,0.223529411764706;0.176470588235294,0.439215686274510,0.219607843137255;0.184313725490196,0.443137254901961,0.215686274509804;0.196078431372549,0.447058823529412,0.207843137254902;0.200000000000000,0.447058823529412,0.207843137254902;0.215686274509804,0.454901960784314,0.200000000000000;0.219607843137255,0.454901960784314,0.200000000000000;0.235294117647059,0.458823529411765,0.196078431372549;0.243137254901961,0.462745098039216,0.192156862745098;0.243137254901961,0.462745098039216,0.192156862745098;0.262745098039216,0.466666666666667,0.188235294117647;0.270588235294118,0.466666666666667,0.188235294117647;0.282352941176471,0.470588235294118,0.184313725490196;0.294117647058824,0.470588235294118,0.184313725490196;0.305882352941177,0.470588235294118,0.184313725490196;0.317647058823529,0.474509803921569,0.180392156862745;0.325490196078431,0.474509803921569,0.180392156862745;0.337254901960784,0.474509803921569,0.180392156862745;0.349019607843137,0.474509803921569,0.180392156862745;0.360784313725490,0.478431372549020,0.180392156862745;0.372549019607843,0.478431372549020,0.184313725490196;0.384313725490196,0.478431372549020,0.184313725490196;0.403921568627451,0.478431372549020,0.188235294117647;0.407843137254902,0.478431372549020,0.188235294117647;0.431372549019608,0.478431372549020,0.192156862745098;0.435294117647059,0.478431372549020,0.192156862745098;0.443137254901961,0.478431372549020,0.196078431372549;0.466666666666667,0.478431372549020,0.200000000000000;0.470588235294118,0.478431372549020,0.200000000000000;0.494117647058824,0.478431372549020,0.207843137254902;0.501960784313726,0.478431372549020,0.211764705882353;0.517647058823530,0.478431372549020,0.219607843137255;0.529411764705882,0.478431372549020,0.223529411764706;0.533333333333333,0.478431372549020,0.223529411764706;0.552941176470588,0.474509803921569,0.235294117647059;0.564705882352941,0.474509803921569,0.243137254901961;0.576470588235294,0.474509803921569,0.250980392156863;0.588235294117647,0.474509803921569,0.254901960784314;0.600000000000000,0.474509803921569,0.262745098039216;0.607843137254902,0.474509803921569,0.270588235294118;0.619607843137255,0.474509803921569,0.278431372549020;0.631372549019608,0.474509803921569,0.290196078431373;0.643137254901961,0.470588235294118,0.298039215686275;0.650980392156863,0.470588235294118,0.305882352941177;0.662745098039216,0.470588235294118,0.317647058823529;0.670588235294118,0.470588235294118,0.325490196078431;0.686274509803922,0.470588235294118,0.341176470588235;0.690196078431373,0.470588235294118,0.345098039215686;0.709803921568628,0.470588235294118,0.368627450980392;0.713725490196078,0.470588235294118,0.372549019607843;0.717647058823529,0.470588235294118,0.376470588235294;0.733333333333333,0.474509803921569,0.400000000000000;0.733333333333333,0.474509803921569,0.400000000000000;0.749019607843137,0.474509803921569,0.423529411764706;0.752941176470588,0.474509803921569,0.431372549019608;0.760784313725490,0.474509803921569,0.447058823529412;0.768627450980392,0.478431372549020,0.458823529411765;0.776470588235294,0.478431372549020,0.470588235294118;0.780392156862745,0.478431372549020,0.486274509803922;0.788235294117647,0.482352941176471,0.498039215686275;0.792156862745098,0.482352941176471,0.509803921568627;0.796078431372549,0.486274509803922,0.521568627450980;0.800000000000000,0.486274509803922,0.533333333333333;0.803921568627451,0.490196078431373,0.549019607843137;0.807843137254902,0.490196078431373,0.560784313725490;0.811764705882353,0.494117647058824,0.572549019607843;0.815686274509804,0.498039215686275,0.584313725490196;0.819607843137255,0.498039215686275,0.600000000000000;0.819607843137255,0.501960784313726,0.611764705882353;0.823529411764706,0.505882352941176,0.623529411764706;0.827450980392157,0.513725490196078,0.643137254901961;0.827450980392157,0.513725490196078,0.647058823529412;0.831372549019608,0.517647058823530,0.674509803921569;0.831372549019608,0.517647058823530,0.678431372549020;0.831372549019608,0.521568627450980,0.686274509803922;0.831372549019608,0.533333333333333,0.709803921568628;0.831372549019608,0.533333333333333,0.709803921568628;0.831372549019608,0.541176470588235,0.729411764705882;0.831372549019608,0.545098039215686,0.737254901960784;0.831372549019608,0.549019607843137,0.752941176470588;0.827450980392157,0.556862745098039,0.764705882352941;0.827450980392157,0.560784313725490,0.772549019607843;0.827450980392157,0.564705882352941,0.784313725490196;0.823529411764706,0.572549019607843,0.796078431372549;0.823529411764706,0.576470588235294,0.803921568627451;0.823529411764706,0.584313725490196,0.811764705882353;0.819607843137255,0.588235294117647,0.823529411764706;0.815686274509804,0.596078431372549,0.831372549019608;0.815686274509804,0.603921568627451,0.839215686274510;0.811764705882353,0.607843137254902,0.847058823529412;0.811764705882353,0.615686274509804,0.854901960784314;0.807843137254902,0.619607843137255,0.862745098039216;0.803921568627451,0.627450980392157,0.870588235294118;0.803921568627451,0.635294117647059,0.878431372549020;0.796078431372549,0.647058823529412,0.890196078431373;0.796078431372549,0.647058823529412,0.890196078431373;0.792156862745098,0.662745098039216,0.901960784313726;0.788235294117647,0.666666666666667,0.905882352941177;0.788235294117647,0.670588235294118,0.905882352941177;0.784313725490196,0.682352941176471,0.917647058823529;0.784313725490196,0.682352941176471,0.917647058823529;0.780392156862745,0.698039215686275,0.925490196078431;0.776470588235294,0.705882352941177,0.929411764705882;0.772549019607843,0.713725490196078,0.933333333333333;0.772549019607843,0.717647058823529,0.937254901960784;0.768627450980392,0.725490196078431,0.937254901960784;0.768627450980392,0.733333333333333,0.941176470588235;0.764705882352941,0.741176470588235,0.945098039215686;0.764705882352941,0.749019607843137,0.945098039215686;0.760784313725490,0.756862745098039,0.949019607843137;0.760784313725490,0.760784313725490,0.949019607843137;0.760784313725490,0.768627450980392,0.949019607843137;0.756862745098039,0.776470588235294,0.952941176470588;0.756862745098039,0.788235294117647,0.952941176470588;0.756862745098039,0.792156862745098,0.952941176470588;0.756862745098039,0.796078431372549,0.952941176470588;0.756862745098039,0.807843137254902,0.952941176470588;0.756862745098039,0.811764705882353,0.952941176470588;0.756862745098039,0.823529411764706,0.952941176470588;0.756862745098039,0.823529411764706,0.952941176470588;0.756862745098039,0.835294117647059,0.952941176470588;0.760784313725490,0.839215686274510,0.949019607843137;0.760784313725490,0.843137254901961,0.949019607843137;0.764705882352941,0.854901960784314,0.949019607843137;0.764705882352941,0.854901960784314,0.949019607843137;0.768627450980392,0.866666666666667,0.945098039215686;0.768627450980392,0.870588235294118,0.945098039215686;0.772549019607843,0.878431372549020,0.945098039215686;0.776470588235294,0.882352941176471,0.945098039215686;0.780392156862745,0.886274509803922,0.941176470588235;0.784313725490196,0.894117647058824,0.941176470588235;0.784313725490196,0.898039215686275,0.941176470588235;0.792156862745098,0.901960784313726,0.937254901960784;0.796078431372549,0.905882352941177,0.937254901960784;0.800000000000000,0.909803921568627,0.937254901960784;0.803921568627451,0.913725490196078,0.937254901960784;0.807843137254902,0.921568627450980,0.937254901960784;0.819607843137255,0.929411764705882,0.933333333333333;0.819607843137255,0.929411764705882,0.933333333333333;0.823529411764706,0.933333333333333,0.933333333333333;0.831372549019608,0.937254901960784,0.933333333333333;0.835294117647059,0.941176470588235,0.933333333333333;0.850980392156863,0.945098039215686,0.933333333333333;0.850980392156863,0.945098039215686,0.933333333333333;0.862745098039216,0.952941176470588,0.937254901960784;0.866666666666667,0.956862745098039,0.937254901960784;0.870588235294118,0.956862745098039,0.937254901960784;0.882352941176471,0.960784313725490,0.941176470588235;0.886274509803922,0.960784313725490,0.941176470588235;0.898039215686275,0.968627450980392,0.941176470588235;0.905882352941177,0.968627450980392,0.945098039215686;0.909803921568627,0.972549019607843,0.949019607843137;0.917647058823529,0.972549019607843,0.949019607843137;0.925490196078431,0.976470588235294,0.952941176470588;0.933333333333333,0.980392156862745,0.956862745098039;0.941176470588235,0.980392156862745,0.960784313725490;0.949019607843137,0.984313725490196,0.964705882352941;0.956862745098039,0.984313725490196,0.968627450980392;0.960784313725490,0.988235294117647,0.972549019607843;0.968627450980392,0.988235294117647,0.976470588235294;0.976470588235294,0.992156862745098,0.980392156862745;0.992156862745098,0.996078431372549,0.992156862745098;0.992156862745098,0.996078431372549,0.992156862745098]; + [0.498039215686275,0,1;0.490196078431373,0.0117647058823529,0.996078431372549;0.486274509803922,0.0196078431372549,0.996078431372549;0.474509803921569,0.0352941176470588,0.996078431372549;0.466666666666667,0.0470588235294118,0.996078431372549;0.458823529411765,0.0588235294117647,0.996078431372549;0.450980392156863,0.0705882352941177,0.996078431372549;0.443137254901961,0.0823529411764706,0.996078431372549;0.435294117647059,0.0980392156862745,0.996078431372549;0.427450980392157,0.109803921568627,0.996078431372549;0.419607843137255,0.121568627450980,0.996078431372549;0.411764705882353,0.133333333333333,0.996078431372549;0.403921568627451,0.145098039215686,0.996078431372549;0.392156862745098,0.160784313725490,0.996078431372549;0.388235294117647,0.168627450980392,0.996078431372549;0.372549019607843,0.192156862745098,0.992156862745098;0.372549019607843,0.196078431372549,0.992156862745098;0.356862745098039,0.219607843137255,0.992156862745098;0.349019607843137,0.227450980392157,0.992156862745098;0.349019607843137,0.231372549019608,0.992156862745098;0.333333333333333,0.254901960784314,0.988235294117647;0.329411764705882,0.258823529411765,0.988235294117647;0.317647058823529,0.278431372549020,0.988235294117647;0.309803921568627,0.290196078431373,0.988235294117647;0.301960784313725,0.301960784313725,0.984313725490196;0.294117647058824,0.313725490196078,0.984313725490196;0.286274509803922,0.321568627450980,0.984313725490196;0.278431372549020,0.337254901960784,0.984313725490196;0.270588235294118,0.349019607843137,0.980392156862745;0.262745098039216,0.360784313725490,0.980392156862745;0.254901960784314,0.372549019607843,0.980392156862745;0.247058823529412,0.380392156862745,0.980392156862745;0.239215686274510,0.396078431372549,0.976470588235294;0.231372549019608,0.403921568627451,0.976470588235294;0.223529411764706,0.415686274509804,0.976470588235294;0.215686274509804,0.427450980392157,0.972549019607843;0.207843137254902,0.439215686274510,0.972549019607843;0.196078431372549,0.454901960784314,0.968627450980392;0.192156862745098,0.458823529411765,0.968627450980392;0.176470588235294,0.482352941176471,0.964705882352941;0.176470588235294,0.486274509803922,0.964705882352941;0.160784313725490,0.501960784313726,0.964705882352941;0.152941176470588,0.513725490196078,0.960784313725490;0.152941176470588,0.513725490196078,0.960784313725490;0.137254901960784,0.533333333333333,0.956862745098039;0.133333333333333,0.541176470588235,0.956862745098039;0.121568627450980,0.556862745098039,0.952941176470588;0.113725490196078,0.564705882352941,0.952941176470588;0.105882352941176,0.576470588235294,0.952941176470588;0.0980392156862745,0.584313725490196,0.949019607843137;0.0901960784313726,0.596078431372549,0.949019607843137;0.0823529411764706,0.603921568627451,0.945098039215686;0.0745098039215686,0.615686274509804,0.945098039215686;0.0666666666666667,0.623529411764706,0.941176470588235;0.0588235294117647,0.635294117647059,0.937254901960784;0.0509803921568627,0.643137254901961,0.937254901960784;0.0392156862745098,0.658823529411765,0.933333333333333;0.0352941176470588,0.662745098039216,0.933333333333333;0.0274509803921569,0.670588235294118,0.929411764705882;0.0196078431372549,0.682352941176471,0.929411764705882;0.0117647058823529,0.690196078431373,0.925490196078431;0,0.701960784313725,0.921568627450980;0,0.705882352941177,0.921568627450980;0.0156862745098039,0.725490196078431,0.917647058823529;0.0196078431372549,0.729411764705882,0.917647058823529;0.0313725490196078,0.741176470588235,0.909803921568627;0.0392156862745098,0.749019607843137,0.909803921568627;0.0392156862745098,0.749019607843137,0.909803921568627;0.0549019607843137,0.764705882352941,0.901960784313726;0.0588235294117647,0.768627450980392,0.901960784313726;0.0705882352941177,0.780392156862745,0.898039215686275;0.0784313725490196,0.788235294117647,0.894117647058824;0.0862745098039216,0.796078431372549,0.894117647058824;0.0941176470588235,0.803921568627451,0.890196078431373;0.101960784313725,0.811764705882353,0.886274509803922;0.109803921568627,0.819607843137255,0.886274509803922;0.117647058823529,0.823529411764706,0.882352941176471;0.125490196078431,0.831372549019608,0.878431372549020;0.133333333333333,0.839215686274510,0.874509803921569;0.141176470588235,0.843137254901961,0.874509803921569;0.152941176470588,0.854901960784314,0.870588235294118;0.156862745098039,0.858823529411765,0.866666666666667;0.164705882352941,0.862745098039216,0.862745098039216;0.172549019607843,0.870588235294118,0.862745098039216;0.180392156862745,0.874509803921569,0.858823529411765;0.192156862745098,0.886274509803922,0.850980392156863;0.196078431372549,0.886274509803922,0.850980392156863;0.211764705882353,0.898039215686275,0.843137254901961;0.215686274509804,0.898039215686275,0.843137254901961;0.227450980392157,0.909803921568627,0.839215686274510;0.235294117647059,0.913725490196078,0.835294117647059;0.235294117647059,0.913725490196078,0.835294117647059;0.250980392156863,0.925490196078431,0.827450980392157;0.258823529411765,0.929411764705882,0.823529411764706;0.266666666666667,0.933333333333333,0.819607843137255;0.274509803921569,0.937254901960784,0.819607843137255;0.282352941176471,0.941176470588235,0.815686274509804;0.290196078431373,0.945098039215686,0.811764705882353;0.298039215686275,0.949019607843137,0.807843137254902;0.305882352941177,0.952941176470588,0.803921568627451;0.313725490196078,0.956862745098039,0.800000000000000;0.321568627450980,0.960784313725490,0.796078431372549;0.329411764705882,0.964705882352941,0.792156862745098;0.337254901960784,0.964705882352941,0.788235294117647;0.349019607843137,0.972549019607843,0.780392156862745;0.352941176470588,0.972549019607843,0.780392156862745;0.368627450980392,0.976470588235294,0.772549019607843;0.368627450980392,0.976470588235294,0.772549019607843;0.376470588235294,0.980392156862745,0.768627450980392;0.392156862745098,0.984313725490196,0.760784313725490;0.392156862745098,0.984313725490196,0.760784313725490;0.407843137254902,0.988235294117647,0.752941176470588;0.411764705882353,0.988235294117647,0.749019607843137;0.423529411764706,0.992156862745098,0.745098039215686;0.431372549019608,0.992156862745098,0.741176470588235;0.431372549019608,0.992156862745098,0.741176470588235;0.447058823529412,0.996078431372549,0.733333333333333;0.454901960784314,0.996078431372549,0.729411764705882;0.462745098039216,0.996078431372549,0.725490196078431;0.470588235294118,0.996078431372549,0.721568627450980;0.478431372549020,0.996078431372549,0.717647058823529;0.486274509803922,0.996078431372549,0.709803921568628;0.494117647058824,0.996078431372549,0.705882352941177;0.501960784313726,0.996078431372549,0.701960784313725;0.509803921568627,0.996078431372549,0.698039215686275;0.517647058823530,0.996078431372549,0.694117647058824;0.525490196078431,0.996078431372549,0.690196078431373;0.533333333333333,0.996078431372549,0.686274509803922;0.545098039215686,0.996078431372549,0.678431372549020;0.549019607843137,0.996078431372549,0.674509803921569;0.564705882352941,0.992156862745098,0.666666666666667;0.568627450980392,0.992156862745098,0.666666666666667;0.572549019607843,0.992156862745098,0.662745098039216;0.588235294117647,0.988235294117647,0.654901960784314;0.588235294117647,0.988235294117647,0.654901960784314;0.603921568627451,0.984313725490196,0.643137254901961;0.607843137254902,0.980392156862745,0.639215686274510;0.619607843137255,0.980392156862745,0.635294117647059;0.627450980392157,0.976470588235294,0.631372549019608;0.635294117647059,0.976470588235294,0.623529411764706;0.643137254901961,0.972549019607843,0.619607843137255;0.650980392156863,0.968627450980392,0.615686274509804;0.658823529411765,0.964705882352941,0.611764705882353;0.666666666666667,0.964705882352941,0.603921568627451;0.674509803921569,0.960784313725490,0.600000000000000;0.682352941176471,0.956862745098039,0.596078431372549;0.690196078431373,0.952941176470588,0.592156862745098;0.698039215686275,0.949019607843137,0.584313725490196;0.705882352941177,0.945098039215686,0.580392156862745;0.713725490196078,0.941176470588235,0.576470588235294;0.721568627450980,0.937254901960784,0.572549019607843;0.729411764705882,0.933333333333333,0.564705882352941;0.741176470588235,0.925490196078431,0.556862745098039;0.745098039215686,0.925490196078431,0.556862745098039;0.760784313725490,0.913725490196078,0.545098039215686;0.764705882352941,0.913725490196078,0.545098039215686;0.768627450980392,0.909803921568627,0.541176470588235;0.784313725490196,0.898039215686275,0.529411764705882;0.784313725490196,0.898039215686275,0.529411764705882;0.800000000000000,0.886274509803922,0.517647058823530;0.803921568627451,0.882352941176471,0.513725490196078;0.815686274509804,0.874509803921569,0.509803921568627;0.823529411764706,0.870588235294118,0.501960784313726;0.831372549019608,0.862745098039216,0.498039215686275;0.839215686274510,0.858823529411765,0.494117647058824;0.847058823529412,0.850980392156863,0.486274509803922;0.854901960784314,0.843137254901961,0.482352941176471;0.862745098039216,0.839215686274510,0.478431372549020;0.870588235294118,0.831372549019608,0.470588235294118;0.878431372549020,0.823529411764706,0.466666666666667;0.886274509803922,0.819607843137255,0.458823529411765;0.894117647058824,0.811764705882353,0.454901960784314;0.901960784313726,0.803921568627451,0.450980392156863;0.909803921568627,0.796078431372549,0.443137254901961;0.917647058823529,0.788235294117647,0.439215686274510;0.925490196078431,0.780392156862745,0.431372549019608;0.941176470588235,0.764705882352941,0.423529411764706;0.941176470588235,0.764705882352941,0.423529411764706;0.956862745098039,0.749019607843137,0.411764705882353;0.960784313725490,0.745098039215686,0.407843137254902;0.964705882352941,0.741176470588235,0.403921568627451;0.980392156862745,0.725490196078431,0.392156862745098;0.980392156862745,0.725490196078431,0.392156862745098;0.996078431372549,0.705882352941177,0.380392156862745;1,0.698039215686275,0.376470588235294;1,0.690196078431373,0.372549019607843;1,0.682352941176471,0.364705882352941;1,0.670588235294118,0.360784313725490;1,0.662745098039216,0.352941176470588;1,0.654901960784314,0.349019607843137;1,0.643137254901961,0.341176470588235;1,0.635294117647059,0.337254901960784;1,0.623529411764706,0.329411764705882;1,0.615686274509804,0.325490196078431;1,0.603921568627451,0.317647058823529;1,0.588235294117647,0.309803921568627;1,0.584313725490196,0.305882352941177;1,0.576470588235294,0.301960784313725;1,0.560784313725490,0.294117647058824;1,0.556862745098039,0.290196078431373;1,0.533333333333333,0.278431372549020;1,0.533333333333333,0.278431372549020;1,0.513725490196078,0.266666666666667;1,0.505882352941176,0.262745098039216;1,0.501960784313726,0.258823529411765;1,0.482352941176471,0.247058823529412;1,0.478431372549020,0.247058823529412;1,0.458823529411765,0.235294117647059;1,0.450980392156863,0.231372549019608;1,0.439215686274510,0.223529411764706;1,0.427450980392157,0.219607843137255;1,0.415686274509804,0.211764705882353;1,0.403921568627451,0.207843137254902;1,0.392156862745098,0.200000000000000;1,0.380392156862745,0.192156862745098;1,0.372549019607843,0.188235294117647;1,0.360784313725490,0.180392156862745;1,0.349019607843137,0.176470588235294;1,0.337254901960784,0.168627450980392;1,0.317647058823529,0.160784313725490;1,0.313725490196078,0.156862745098039;1,0.301960784313725,0.152941176470588;1,0.286274509803922,0.145098039215686;1,0.278431372549020,0.141176470588235;1,0.254901960784314,0.125490196078431;1,0.254901960784314,0.125490196078431;1,0.231372549019608,0.113725490196078;1,0.223529411764706,0.109803921568627;1,0.219607843137255,0.109803921568627;1,0.192156862745098,0.0980392156862745;1,0.188235294117647,0.0941176470588235;1,0.168627450980392,0.0823529411764706;1,0.156862745098039,0.0784313725490196;1,0.145098039215686,0.0705882352941177;1,0.133333333333333,0.0666666666666667;1,0.121568627450980,0.0588235294117647;1,0.109803921568627,0.0549019607843137;1,0.0980392156862745,0.0470588235294118;1,0.0823529411764706,0.0392156862745098;1,0.0705882352941177,0.0352941176470588;1,0.0588235294117647,0.0274509803921569;1,0.0470588235294118,0.0235294117647059;1,0.0352941176470588,0.0156862745098039;1,0.0156862745098039,0.00392156862745098;1,0.0117647058823529,0.00392156862745098;1,0,0;1,0,0]; + [0.882352941176471,0.847058823529412,0.886274509803922;0.878431372549020,0.850980392156863,0.886274509803922;0.878431372549020,0.850980392156863,0.882352941176471;0.870588235294118,0.850980392156863,0.878431372549020;0.866666666666667,0.850980392156863,0.878431372549020;0.858823529411765,0.847058823529412,0.874509803921569;0.850980392156863,0.847058823529412,0.870588235294118;0.847058823529412,0.843137254901961,0.866666666666667;0.839215686274510,0.839215686274510,0.862745098039216;0.827450980392157,0.835294117647059,0.858823529411765;0.823529411764706,0.835294117647059,0.854901960784314;0.807843137254902,0.827450980392157,0.847058823529412;0.800000000000000,0.823529411764706,0.847058823529412;0.792156862745098,0.819607843137255,0.843137254901961;0.776470588235294,0.811764705882353,0.835294117647059;0.772549019607843,0.811764705882353,0.831372549019608;0.752941176470588,0.803921568627451,0.827450980392157;0.745098039215686,0.796078431372549,0.823529411764706;0.729411764705882,0.792156862745098,0.815686274509804;0.717647058823529,0.784313725490196,0.811764705882353;0.705882352941177,0.780392156862745,0.807843137254902;0.694117647058824,0.772549019607843,0.803921568627451;0.678431372549020,0.764705882352941,0.800000000000000;0.670588235294118,0.760784313725490,0.800000000000000;0.658823529411765,0.752941176470588,0.796078431372549;0.643137254901961,0.745098039215686,0.792156862745098;0.635294117647059,0.741176470588235,0.788235294117647;0.619607843137255,0.733333333333333,0.784313725490196;0.611764705882353,0.729411764705882,0.784313725490196;0.596078431372549,0.717647058823529,0.780392156862745;0.588235294117647,0.709803921568628,0.776470588235294;0.576470588235294,0.705882352941177,0.776470588235294;0.564705882352941,0.698039215686275,0.772549019607843;0.552941176470588,0.690196078431373,0.772549019607843;0.545098039215686,0.682352941176471,0.772549019607843;0.537254901960784,0.674509803921569,0.768627450980392;0.525490196078431,0.670588235294118,0.768627450980392;0.517647058823530,0.662745098039216,0.764705882352941;0.505882352941176,0.650980392156863,0.764705882352941;0.501960784313726,0.647058823529412,0.764705882352941;0.490196078431373,0.635294117647059,0.760784313725490;0.482352941176471,0.627450980392157,0.760784313725490;0.474509803921569,0.619607843137255,0.756862745098039;0.466666666666667,0.611764705882353,0.756862745098039;0.458823529411765,0.607843137254902,0.756862745098039;0.450980392156863,0.600000000000000,0.756862745098039;0.447058823529412,0.592156862745098,0.752941176470588;0.439215686274510,0.584313725490196,0.752941176470588;0.435294117647059,0.576470588235294,0.752941176470588;0.427450980392157,0.564705882352941,0.749019607843137;0.423529411764706,0.560784313725490,0.749019607843137;0.415686274509804,0.545098039215686,0.745098039215686;0.411764705882353,0.537254901960784,0.745098039215686;0.407843137254902,0.529411764705882,0.745098039215686;0.403921568627451,0.521568627450980,0.741176470588235;0.400000000000000,0.517647058823530,0.741176470588235;0.396078431372549,0.505882352941176,0.741176470588235;0.392156862745098,0.498039215686275,0.737254901960784;0.392156862745098,0.490196078431373,0.737254901960784;0.388235294117647,0.482352941176471,0.733333333333333;0.384313725490196,0.466666666666667,0.729411764705882;0.384313725490196,0.462745098039216,0.729411764705882;0.380392156862745,0.450980392156863,0.725490196078431;0.380392156862745,0.447058823529412,0.725490196078431;0.376470588235294,0.431372549019608,0.721568627450980;0.376470588235294,0.423529411764706,0.717647058823529;0.376470588235294,0.419607843137255,0.717647058823529;0.372549019607843,0.407843137254902,0.713725490196078;0.372549019607843,0.400000000000000,0.709803921568628;0.372549019607843,0.388235294117647,0.705882352941177;0.372549019607843,0.380392156862745,0.705882352941177;0.372549019607843,0.368627450980392,0.701960784313725;0.368627450980392,0.360784313725490,0.698039215686275;0.368627450980392,0.349019607843137,0.690196078431373;0.368627450980392,0.341176470588235,0.690196078431373;0.368627450980392,0.329411764705882,0.682352941176471;0.368627450980392,0.321568627450980,0.678431372549020;0.368627450980392,0.313725490196078,0.674509803921569;0.368627450980392,0.301960784313725,0.666666666666667;0.368627450980392,0.294117647058824,0.666666666666667;0.364705882352941,0.282352941176471,0.654901960784314;0.364705882352941,0.270588235294118,0.650980392156863;0.364705882352941,0.262745098039216,0.643137254901961;0.364705882352941,0.250980392156863,0.639215686274510;0.360784313725490,0.243137254901961,0.631372549019608;0.360784313725490,0.235294117647059,0.623529411764706;0.360784313725490,0.219607843137255,0.611764705882353;0.360784313725490,0.211764705882353,0.607843137254902;0.356862745098039,0.203921568627451,0.600000000000000;0.356862745098039,0.192156862745098,0.588235294117647;0.352941176470588,0.188235294117647,0.584313725490196;0.352941176470588,0.172549019607843,0.568627450980392;0.349019607843137,0.164705882352941,0.560784313725490;0.345098039215686,0.156862745098039,0.549019607843137;0.341176470588235,0.145098039215686,0.537254901960784;0.341176470588235,0.137254901960784,0.529411764705882;0.337254901960784,0.129411764705882,0.513725490196078;0.329411764705882,0.121568627450980,0.498039215686275;0.325490196078431,0.117647058823529,0.490196078431373;0.321568627450980,0.109803921568627,0.478431372549020;0.313725490196078,0.101960784313725,0.462745098039216;0.313725490196078,0.0980392156862745,0.450980392156863;0.301960784313725,0.0901960784313726,0.431372549019608;0.301960784313725,0.0901960784313726,0.423529411764706;0.290196078431373,0.0823529411764706,0.403921568627451;0.286274509803922,0.0823529411764706,0.392156862745098;0.282352941176471,0.0784313725490196,0.384313725490196;0.270588235294118,0.0745098039215686,0.364705882352941;0.266666666666667,0.0705882352941177,0.352941176470588;0.258823529411765,0.0705882352941177,0.341176470588235;0.250980392156863,0.0666666666666667,0.329411764705882;0.243137254901961,0.0666666666666667,0.313725490196078;0.239215686274510,0.0666666666666667,0.305882352941177;0.227450980392157,0.0627450980392157,0.290196078431373;0.227450980392157,0.0627450980392157,0.282352941176471;0.219607843137255,0.0627450980392157,0.270588235294118;0.211764705882353,0.0627450980392157,0.258823529411765;0.211764705882353,0.0627450980392157,0.254901960784314;0.203921568627451,0.0666666666666667,0.243137254901961;0.200000000000000,0.0666666666666667,0.239215686274510;0.196078431372549,0.0666666666666667,0.231372549019608;0.192156862745098,0.0705882352941177,0.223529411764706;0.188235294117647,0.0745098039215686,0.215686274509804;0.184313725490196,0.0784313725490196,0.211764705882353;0.192156862745098,0.0705882352941177,0.211764705882353;0.192156862745098,0.0705882352941177,0.215686274509804;0.200000000000000,0.0666666666666667,0.215686274509804;0.207843137254902,0.0666666666666667,0.219607843137255;0.207843137254902,0.0666666666666667,0.219607843137255;0.215686274509804,0.0666666666666667,0.223529411764706;0.219607843137255,0.0666666666666667,0.223529411764706;0.231372549019608,0.0666666666666667,0.227450980392157;0.239215686274510,0.0666666666666667,0.231372549019608;0.247058823529412,0.0666666666666667,0.235294117647059;0.254901960784314,0.0666666666666667,0.239215686274510;0.262745098039216,0.0705882352941177,0.243137254901961;0.270588235294118,0.0705882352941177,0.247058823529412;0.286274509803922,0.0705882352941177,0.254901960784314;0.290196078431373,0.0745098039215686,0.254901960784314;0.298039215686275,0.0745098039215686,0.258823529411765;0.313725490196078,0.0784313725490196,0.266666666666667;0.317647058823529,0.0784313725490196,0.266666666666667;0.333333333333333,0.0823529411764706,0.274509803921569;0.341176470588235,0.0823529411764706,0.278431372549020;0.352941176470588,0.0862745098039216,0.282352941176471;0.364705882352941,0.0901960784313726,0.286274509803922;0.372549019607843,0.0901960784313726,0.286274509803922;0.384313725490196,0.0941176470588235,0.294117647058824;0.400000000000000,0.0980392156862745,0.298039215686275;0.403921568627451,0.0980392156862745,0.298039215686275;0.415686274509804,0.101960784313725,0.301960784313725;0.431372549019608,0.105882352941176,0.305882352941177;0.435294117647059,0.109803921568627,0.305882352941177;0.450980392156863,0.113725490196078,0.305882352941177;0.458823529411765,0.117647058823529,0.309803921568627;0.470588235294118,0.121568627450980,0.309803921568627;0.482352941176471,0.125490196078431,0.309803921568627;0.486274509803922,0.129411764705882,0.309803921568627;0.501960784313726,0.137254901960784,0.313725490196078;0.509803921568627,0.141176470588235,0.313725490196078;0.517647058823530,0.145098039215686,0.313725490196078;0.529411764705882,0.152941176470588,0.313725490196078;0.537254901960784,0.156862745098039,0.313725490196078;0.545098039215686,0.164705882352941,0.313725490196078;0.560784313725490,0.172549019607843,0.313725490196078;0.564705882352941,0.176470588235294,0.313725490196078;0.576470588235294,0.188235294117647,0.309803921568627;0.584313725490196,0.196078431372549,0.309803921568627;0.588235294117647,0.196078431372549,0.309803921568627;0.600000000000000,0.207843137254902,0.309803921568627;0.603921568627451,0.211764705882353,0.309803921568627;0.611764705882353,0.223529411764706,0.309803921568627;0.619607843137255,0.231372549019608,0.309803921568627;0.627450980392157,0.239215686274510,0.309803921568627;0.635294117647059,0.247058823529412,0.309803921568627;0.639215686274510,0.254901960784314,0.309803921568627;0.647058823529412,0.262745098039216,0.309803921568627;0.654901960784314,0.274509803921569,0.309803921568627;0.658823529411765,0.282352941176471,0.313725490196078;0.666666666666667,0.290196078431373,0.313725490196078;0.674509803921569,0.301960784313725,0.313725490196078;0.678431372549020,0.305882352941177,0.313725490196078;0.686274509803922,0.317647058823529,0.317647058823529;0.690196078431373,0.329411764705882,0.317647058823529;0.698039215686275,0.337254901960784,0.321568627450980;0.701960784313725,0.345098039215686,0.321568627450980;0.705882352941177,0.352941176470588,0.321568627450980;0.709803921568628,0.364705882352941,0.325490196078431;0.717647058823529,0.376470588235294,0.329411764705882;0.721568627450980,0.380392156862745,0.333333333333333;0.725490196078431,0.392156862745098,0.337254901960784;0.729411764705882,0.403921568627451,0.341176470588235;0.733333333333333,0.407843137254902,0.341176470588235;0.737254901960784,0.423529411764706,0.349019607843137;0.741176470588235,0.427450980392157,0.352941176470588;0.745098039215686,0.443137254901961,0.356862745098039;0.749019607843137,0.450980392156863,0.364705882352941;0.752941176470588,0.458823529411765,0.364705882352941;0.756862745098039,0.470588235294118,0.376470588235294;0.760784313725490,0.482352941176471,0.384313725490196;0.760784313725490,0.490196078431373,0.388235294117647;0.764705882352941,0.498039215686275,0.396078431372549;0.768627450980392,0.513725490196078,0.407843137254902;0.768627450980392,0.517647058823530,0.411764705882353;0.772549019607843,0.533333333333333,0.423529411764706;0.776470588235294,0.537254901960784,0.427450980392157;0.780392156862745,0.552941176470588,0.439215686274510;0.780392156862745,0.560784313725490,0.447058823529412;0.780392156862745,0.568627450980392,0.454901960784314;0.784313725490196,0.580392156862745,0.470588235294118;0.788235294117647,0.592156862745098,0.478431372549020;0.788235294117647,0.600000000000000,0.490196078431373;0.792156862745098,0.611764705882353,0.501960784313726;0.792156862745098,0.619607843137255,0.513725490196078;0.796078431372549,0.631372549019608,0.521568627450980;0.800000000000000,0.643137254901961,0.541176470588235;0.800000000000000,0.647058823529412,0.549019607843137;0.803921568627451,0.662745098039216,0.564705882352941;0.807843137254902,0.670588235294118,0.576470588235294;0.807843137254902,0.674509803921569,0.584313725490196;0.811764705882353,0.690196078431373,0.603921568627451;0.811764705882353,0.698039215686275,0.615686274509804;0.819607843137255,0.705882352941177,0.631372549019608;0.819607843137255,0.717647058823529,0.643137254901961;0.823529411764706,0.725490196078431,0.658823529411765;0.827450980392157,0.733333333333333,0.670588235294118;0.831372549019608,0.741176470588235,0.686274509803922;0.835294117647059,0.749019607843137,0.698039215686275;0.839215686274510,0.760784313725490,0.717647058823529;0.843137254901961,0.764705882352941,0.729411764705882;0.847058823529412,0.772549019607843,0.737254901960784;0.850980392156863,0.784313725490196,0.756862745098039;0.850980392156863,0.788235294117647,0.764705882352941;0.858823529411765,0.800000000000000,0.784313725490196;0.858823529411765,0.807843137254902,0.792156862745098;0.862745098039216,0.811764705882353,0.803921568627451;0.866666666666667,0.819607843137255,0.815686274509804;0.866666666666667,0.823529411764706,0.823529411764706;0.870588235294118,0.827450980392157,0.835294117647059;0.874509803921569,0.835294117647059,0.847058823529412;0.874509803921569,0.839215686274510,0.850980392156863;0.878431372549020,0.839215686274510,0.858823529411765;0.882352941176471,0.843137254901961,0.866666666666667;0.882352941176471,0.847058823529412,0.870588235294118;0.882352941176471,0.847058823529412,0.878431372549020;0.882352941176471,0.847058823529412,0.882352941176471;0.882352941176471,0.847058823529412,0.882352941176471]; + [0.505882352941176,0.784313725490196,0.509803921568627;0.517647058823530,0.780392156862745,0.525490196078431;0.525490196078431,0.776470588235294,0.537254901960784;0.537254901960784,0.772549019607843,0.549019607843137;0.545098039215686,0.768627450980392,0.564705882352941;0.556862745098039,0.764705882352941,0.576470588235294;0.564705882352941,0.760784313725490,0.588235294117647;0.576470588235294,0.756862745098039,0.603921568627451;0.584313725490196,0.752941176470588,0.615686274509804;0.596078431372549,0.745098039215686,0.627450980392157;0.603921568627451,0.741176470588235,0.639215686274510;0.611764705882353,0.737254901960784,0.654901960784314;0.623529411764706,0.733333333333333,0.666666666666667;0.631372549019608,0.729411764705882,0.678431372549020;0.643137254901961,0.725490196078431,0.694117647058824;0.650980392156863,0.721568627450980,0.705882352941177;0.662745098039216,0.717647058823529,0.717647058823529;0.670588235294118,0.713725490196078,0.733333333333333;0.682352941176471,0.709803921568628,0.745098039215686;0.690196078431373,0.705882352941177,0.756862745098039;0.701960784313725,0.701960784313725,0.772549019607843;0.709803921568628,0.698039215686275,0.784313725490196;0.721568627450980,0.694117647058824,0.796078431372549;0.729411764705882,0.690196078431373,0.811764705882353;0.737254901960784,0.686274509803922,0.823529411764706;0.749019607843137,0.682352941176471,0.827450980392157;0.760784313725490,0.686274509803922,0.811764705882353;0.768627450980392,0.690196078431373,0.800000000000000;0.780392156862745,0.694117647058824,0.788235294117647;0.792156862745098,0.694117647058824,0.776470588235294;0.800000000000000,0.698039215686275,0.760784313725490;0.811764705882353,0.701960784313725,0.749019607843137;0.823529411764706,0.705882352941177,0.737254901960784;0.831372549019608,0.705882352941177,0.721568627450980;0.843137254901961,0.709803921568628,0.709803921568628;0.854901960784314,0.713725490196078,0.698039215686275;0.862745098039216,0.717647058823529,0.682352941176471;0.874509803921569,0.717647058823529,0.670588235294118;0.886274509803922,0.721568627450980,0.658823529411765;0.894117647058824,0.725490196078431,0.643137254901961;0.905882352941177,0.729411764705882,0.631372549019608;0.917647058823529,0.733333333333333,0.619607843137255;0.925490196078431,0.733333333333333,0.607843137254902;0.937254901960784,0.737254901960784,0.592156862745098;0.949019607843137,0.741176470588235,0.580392156862745;0.956862745098039,0.745098039215686,0.568627450980392;0.968627450980392,0.745098039215686,0.552941176470588;0.980392156862745,0.749019607843137,0.541176470588235;0.988235294117647,0.752941176470588,0.529411764705882;0.992156862745098,0.760784313725490,0.529411764705882;0.992156862745098,0.772549019607843,0.529411764705882;0.992156862745098,0.784313725490196,0.533333333333333;0.992156862745098,0.792156862745098,0.537254901960784;0.992156862745098,0.803921568627451,0.541176470588235;0.992156862745098,0.815686274509804,0.545098039215686;0.996078431372549,0.823529411764706,0.545098039215686;0.996078431372549,0.835294117647059,0.549019607843137;0.996078431372549,0.847058823529412,0.552941176470588;0.996078431372549,0.854901960784314,0.556862745098039;0.996078431372549,0.866666666666667,0.560784313725490;0.996078431372549,0.878431372549020,0.564705882352941;0.996078431372549,0.886274509803922,0.564705882352941;0.996078431372549,0.898039215686275,0.568627450980392;0.996078431372549,0.909803921568627,0.572549019607843;0.996078431372549,0.917647058823529,0.576470588235294;0.996078431372549,0.929411764705882,0.580392156862745;1,0.941176470588235,0.580392156862745;1,0.949019607843137,0.584313725490196;1,0.960784313725490,0.588235294117647;1,0.972549019607843,0.592156862745098;1,0.980392156862745,0.596078431372549;1,0.992156862745098,0.596078431372549;0.992156862745098,0.992156862745098,0.600000000000000;0.956862745098039,0.968627450980392,0.603921568627451;0.925490196078431,0.945098039215686,0.607843137254902;0.894117647058824,0.921568627450980,0.611764705882353;0.858823529411765,0.894117647058824,0.615686274509804;0.827450980392157,0.870588235294118,0.619607843137255;0.792156862745098,0.847058823529412,0.623529411764706;0.760784313725490,0.823529411764706,0.627450980392157;0.725490196078431,0.800000000000000,0.631372549019608;0.694117647058824,0.772549019607843,0.635294117647059;0.658823529411765,0.749019607843137,0.639215686274510;0.627450980392157,0.725490196078431,0.643137254901961;0.596078431372549,0.701960784313725,0.647058823529412;0.560784313725490,0.674509803921569,0.650980392156863;0.529411764705882,0.650980392156863,0.654901960784314;0.494117647058824,0.627450980392157,0.658823529411765;0.462745098039216,0.603921568627451,0.662745098039216;0.427450980392157,0.576470588235294,0.666666666666667;0.396078431372549,0.552941176470588,0.670588235294118;0.360784313725490,0.529411764705882,0.674509803921569;0.329411764705882,0.505882352941176,0.678431372549020;0.294117647058824,0.478431372549020,0.682352941176471;0.262745098039216,0.454901960784314,0.686274509803922;0.231372549019608,0.431372549019608,0.690196078431373;0.239215686274510,0.411764705882353,0.686274509803922;0.270588235294118,0.392156862745098,0.674509803921569;0.301960784313725,0.376470588235294,0.666666666666667;0.333333333333333,0.356862745098039,0.658823529411765;0.364705882352941,0.341176470588235,0.650980392156863;0.392156862745098,0.321568627450980,0.643137254901961;0.423529411764706,0.305882352941177,0.635294117647059;0.454901960784314,0.286274509803922,0.627450980392157;0.486274509803922,0.270588235294118,0.619607843137255;0.517647058823530,0.250980392156863,0.611764705882353;0.549019607843137,0.235294117647059,0.603921568627451;0.576470588235294,0.215686274509804,0.596078431372549;0.607843137254902,0.200000000000000,0.588235294117647;0.639215686274510,0.180392156862745,0.580392156862745;0.670588235294118,0.164705882352941,0.568627450980392;0.701960784313725,0.145098039215686,0.560784313725490;0.729411764705882,0.129411764705882,0.552941176470588;0.760784313725490,0.109803921568627,0.545098039215686;0.792156862745098,0.0941176470588235,0.537254901960784;0.823529411764706,0.0745098039215686,0.529411764705882;0.854901960784314,0.0588235294117647,0.521568627450980;0.882352941176471,0.0392156862745098,0.513725490196078;0.913725490196078,0.0235294117647059,0.505882352941176;0.941176470588235,0.00784313725490196,0.494117647058824;0.933333333333333,0.0235294117647059,0.478431372549020;0.925490196078431,0.0352941176470588,0.462745098039216;0.917647058823529,0.0509803921568627,0.447058823529412;0.909803921568627,0.0627450980392157,0.431372549019608;0.901960784313726,0.0784313725490196,0.415686274509804;0.894117647058824,0.0901960784313726,0.400000000000000;0.886274509803922,0.105882352941176,0.384313725490196;0.878431372549020,0.117647058823529,0.368627450980392;0.874509803921569,0.133333333333333,0.352941176470588;0.866666666666667,0.145098039215686,0.337254901960784;0.858823529411765,0.160784313725490,0.321568627450980;0.850980392156863,0.172549019607843,0.305882352941177;0.843137254901961,0.188235294117647,0.290196078431373;0.835294117647059,0.200000000000000,0.274509803921569;0.827450980392157,0.215686274509804,0.258823529411765;0.819607843137255,0.227450980392157,0.243137254901961;0.811764705882353,0.239215686274510,0.223529411764706;0.803921568627451,0.254901960784314,0.207843137254902;0.796078431372549,0.266666666666667,0.192156862745098;0.792156862745098,0.282352941176471,0.176470588235294;0.784313725490196,0.294117647058824,0.160784313725490;0.776470588235294,0.309803921568627,0.145098039215686;0.768627450980392,0.321568627450980,0.129411764705882;0.760784313725490,0.337254901960784,0.113725490196078;0.752941176470588,0.349019607843137,0.0980392156862745;0.752941176470588,0.349019607843137,0.0980392156862745]; + [0.200000000000000,0.00784313725490196,0.800000000000000;0.196078431372549,0.0196078431372549,0.803921568627451;0.192156862745098,0.0313725490196078,0.807843137254902;0.192156862745098,0.0431372549019608,0.807843137254902;0.188235294117647,0.0549019607843137,0.811764705882353;0.188235294117647,0.0666666666666667,0.811764705882353;0.184313725490196,0.0784313725490196,0.815686274509804;0.180392156862745,0.0901960784313726,0.819607843137255;0.180392156862745,0.101960784313725,0.819607843137255;0.176470588235294,0.113725490196078,0.823529411764706;0.176470588235294,0.125490196078431,0.823529411764706;0.172549019607843,0.137254901960784,0.827450980392157;0.168627450980392,0.149019607843137,0.831372549019608;0.168627450980392,0.160784313725490,0.831372549019608;0.164705882352941,0.172549019607843,0.835294117647059;0.164705882352941,0.184313725490196,0.835294117647059;0.160784313725490,0.196078431372549,0.839215686274510;0.156862745098039,0.207843137254902,0.843137254901961;0.156862745098039,0.219607843137255,0.843137254901961;0.152941176470588,0.231372549019608,0.847058823529412;0.152941176470588,0.243137254901961,0.847058823529412;0.149019607843137,0.254901960784314,0.850980392156863;0.145098039215686,0.266666666666667,0.854901960784314;0.145098039215686,0.278431372549020,0.854901960784314;0.141176470588235,0.290196078431373,0.858823529411765;0.141176470588235,0.301960784313725,0.858823529411765;0.137254901960784,0.313725490196078,0.862745098039216;0.133333333333333,0.325490196078431,0.866666666666667;0.133333333333333,0.337254901960784,0.866666666666667;0.129411764705882,0.349019607843137,0.870588235294118;0.129411764705882,0.360784313725490,0.870588235294118;0.125490196078431,0.372549019607843,0.874509803921569;0.121568627450980,0.384313725490196,0.878431372549020;0.121568627450980,0.396078431372549,0.878431372549020;0.117647058823529,0.407843137254902,0.882352941176471;0.117647058823529,0.419607843137255,0.882352941176471;0.113725490196078,0.431372549019608,0.886274509803922;0.109803921568627,0.443137254901961,0.890196078431373;0.109803921568627,0.454901960784314,0.890196078431373;0.105882352941176,0.466666666666667,0.894117647058824;0.105882352941176,0.478431372549020,0.894117647058824;0.101960784313725,0.490196078431373,0.898039215686275;0.0980392156862745,0.501960784313726,0.901960784313726;0.0980392156862745,0.513725490196078,0.901960784313726;0.0941176470588235,0.525490196078431,0.905882352941177;0.0941176470588235,0.537254901960784,0.905882352941177;0.0901960784313726,0.549019607843137,0.909803921568627;0.0862745098039216,0.560784313725490,0.913725490196078;0.0862745098039216,0.572549019607843,0.913725490196078;0.0823529411764706,0.584313725490196,0.917647058823529;0.0823529411764706,0.596078431372549,0.917647058823529;0.0784313725490196,0.607843137254902,0.921568627450980;0.0745098039215686,0.619607843137255,0.925490196078431;0.0745098039215686,0.631372549019608,0.925490196078431;0.0705882352941177,0.643137254901961,0.929411764705882;0.0705882352941177,0.654901960784314,0.929411764705882;0.0666666666666667,0.666666666666667,0.933333333333333;0.0627450980392157,0.678431372549020,0.937254901960784;0.0627450980392157,0.690196078431373,0.937254901960784;0.0588235294117647,0.701960784313725,0.941176470588235;0.0588235294117647,0.713725490196078,0.941176470588235;0.0549019607843137,0.725490196078431,0.945098039215686;0.0509803921568627,0.737254901960784,0.949019607843137;0.0509803921568627,0.749019607843137,0.949019607843137;0.0470588235294118,0.760784313725490,0.952941176470588;0.0470588235294118,0.772549019607843,0.952941176470588;0.0431372549019608,0.784313725490196,0.956862745098039;0.0392156862745098,0.800000000000000,0.960784313725490;0.0392156862745098,0.811764705882353,0.960784313725490;0.0352941176470588,0.823529411764706,0.964705882352941;0.0313725490196078,0.835294117647059,0.968627450980392;0.0313725490196078,0.847058823529412,0.968627450980392;0.0274509803921569,0.858823529411765,0.972549019607843;0.0274509803921569,0.870588235294118,0.972549019607843;0.0235294117647059,0.882352941176471,0.976470588235294;0.0196078431372549,0.894117647058824,0.980392156862745;0.0196078431372549,0.905882352941177,0.980392156862745;0.0156862745098039,0.917647058823529,0.984313725490196;0.0156862745098039,0.929411764705882,0.984313725490196;0.0117647058823529,0.941176470588235,0.988235294117647;0.00784313725490196,0.952941176470588,0.992156862745098;0.00784313725490196,0.964705882352941,0.992156862745098;0.00392156862745098,0.976470588235294,0.996078431372549;0.00392156862745098,0.988235294117647,0.996078431372549;0,1,1;0.0156862745098039,1,1;0.0352941176470588,1,1;0.0549019607843137,1,1;0.0745098039215686,1,1;0.0941176470588235,1,1;0.113725490196078,1,1;0.133333333333333,1,1;0.149019607843137,1,1;0.168627450980392,1,1;0.188235294117647,1,1;0.207843137254902,1,1;0.227450980392157,1,1;0.247058823529412,1,1;0.266666666666667,1,1;0.282352941176471,1,1;0.301960784313725,1,1;0.321568627450980,1,1;0.341176470588235,1,1;0.360784313725490,1,1;0.380392156862745,1,1;0.400000000000000,1,1;0.415686274509804,1,1;0.435294117647059,1,1;0.454901960784314,1,1;0.474509803921569,1,1;0.494117647058824,1,1;0.513725490196078,1,1;0.529411764705882,1,1;0.549019607843137,1,1;0.568627450980392,1,1;0.588235294117647,1,1;0.603921568627451,1,1;0.619607843137255,1,1;0.631372549019608,1,1;0.647058823529412,1,1;0.658823529411765,1,1;0.674509803921569,1,1;0.686274509803922,1,1;0.701960784313725,1,1;0.713725490196078,1,1;0.729411764705882,1,1;0.741176470588235,1,1;0.756862745098039,1,1;0.768627450980392,1,1;0.780392156862745,1,1;0.796078431372549,1,1;0.807843137254902,1,1;0.823529411764706,1,1;0.835294117647059,1,1;0.850980392156863,1,1;0.862745098039216,1,1;0.878431372549020,1,1;0.890196078431373,1,1;0.905882352941177,1,1;0.917647058823529,1,1;0.933333333333333,1,1;0.945098039215686,1,1;0.960784313725490,1,1;0.972549019607843,1,1;0.988235294117647,1,1;0.988235294117647,1,1]; + [0.0470588235294118,0.321568627450980,0.635294117647059;0.0588235294117647,0.337254901960784,0.643137254901961;0.0745098039215686,0.352941176470588,0.650980392156863;0.0862745098039216,0.368627450980392,0.658823529411765;0.0980392156862745,0.384313725490196,0.666666666666667;0.113725490196078,0.400000000000000,0.674509803921569;0.125490196078431,0.415686274509804,0.682352941176471;0.141176470588235,0.431372549019608,0.690196078431373;0.152941176470588,0.447058823529412,0.698039215686275;0.168627450980392,0.462745098039216,0.705882352941177;0.180392156862745,0.478431372549020,0.713725490196078;0.192156862745098,0.494117647058824,0.725490196078431;0.207843137254902,0.509803921568627,0.733333333333333;0.219607843137255,0.525490196078431,0.741176470588235;0.235294117647059,0.541176470588235,0.749019607843137;0.247058823529412,0.556862745098039,0.756862745098039;0.262745098039216,0.572549019607843,0.764705882352941;0.278431372549020,0.584313725490196,0.768627450980392;0.294117647058824,0.596078431372549,0.776470588235294;0.309803921568627,0.607843137254902,0.780392156862745;0.325490196078431,0.615686274509804,0.788235294117647;0.345098039215686,0.627450980392157,0.792156862745098;0.360784313725490,0.639215686274510,0.796078431372549;0.376470588235294,0.647058823529412,0.803921568627451;0.392156862745098,0.658823529411765,0.807843137254902;0.407843137254902,0.670588235294118,0.815686274509804;0.427450980392157,0.678431372549020,0.819607843137255;0.443137254901961,0.690196078431373,0.827450980392157;0.458823529411765,0.701960784313725,0.831372549019608;0.474509803921569,0.709803921568628,0.839215686274510;0.494117647058824,0.721568627450980,0.843137254901961;0.509803921568627,0.733333333333333,0.847058823529412;0.525490196078431,0.741176470588235,0.854901960784314;0.541176470588235,0.752941176470588,0.858823529411765;0.556862745098039,0.764705882352941,0.866666666666667;0.576470588235294,0.772549019607843,0.870588235294118;0.588235294117647,0.780392156862745,0.874509803921569;0.600000000000000,0.788235294117647,0.878431372549020;0.615686274509804,0.792156862745098,0.882352941176471;0.627450980392157,0.800000000000000,0.886274509803922;0.639215686274510,0.807843137254902,0.890196078431373;0.654901960784314,0.815686274509804,0.894117647058824;0.666666666666667,0.819607843137255,0.898039215686275;0.678431372549020,0.827450980392157,0.901960784313726;0.694117647058824,0.835294117647059,0.905882352941177;0.705882352941177,0.839215686274510,0.909803921568627;0.721568627450980,0.847058823529412,0.913725490196078;0.733333333333333,0.854901960784314,0.917647058823529;0.745098039215686,0.862745098039216,0.921568627450980;0.760784313725490,0.866666666666667,0.925490196078431;0.772549019607843,0.874509803921569,0.929411764705882;0.784313725490196,0.882352941176471,0.933333333333333;0.800000000000000,0.886274509803922,0.937254901960784;0.811764705882353,0.894117647058824,0.937254901960784;0.823529411764706,0.898039215686275,0.941176470588235;0.831372549019608,0.901960784313726,0.945098039215686;0.839215686274510,0.905882352941177,0.945098039215686;0.847058823529412,0.909803921568627,0.945098039215686;0.854901960784314,0.913725490196078,0.949019607843137;0.862745098039216,0.917647058823529,0.949019607843137;0.870588235294118,0.921568627450980,0.949019607843137;0.878431372549020,0.925490196078431,0.952941176470588;0.886274509803922,0.929411764705882,0.952941176470588;0.894117647058824,0.933333333333333,0.956862745098039;0.901960784313726,0.937254901960784,0.956862745098039;0.909803921568627,0.941176470588235,0.956862745098039;0.917647058823529,0.945098039215686,0.960784313725490;0.925490196078431,0.949019607843137,0.960784313725490;0.933333333333333,0.952941176470588,0.960784313725490;0.941176470588235,0.956862745098039,0.964705882352941;0.949019607843137,0.960784313725490,0.964705882352941;0.956862745098039,0.964705882352941,0.968627450980392;0.964705882352941,0.968627450980392,0.968627450980392;0.968627450980392,0.964705882352941,0.960784313725490;0.972549019607843,0.956862745098039,0.949019607843137;0.972549019607843,0.952941176470588,0.941176470588235;0.972549019607843,0.945098039215686,0.929411764705882;0.976470588235294,0.941176470588235,0.917647058823529;0.976470588235294,0.933333333333333,0.909803921568627;0.976470588235294,0.929411764705882,0.898039215686275;0.980392156862745,0.921568627450980,0.886274509803922;0.980392156862745,0.913725490196078,0.878431372549020;0.980392156862745,0.909803921568627,0.866666666666667;0.984313725490196,0.901960784313726,0.854901960784314;0.984313725490196,0.898039215686275,0.847058823529412;0.984313725490196,0.890196078431373,0.835294117647059;0.988235294117647,0.886274509803922,0.823529411764706;0.988235294117647,0.878431372549020,0.815686274509804;0.988235294117647,0.874509803921569,0.803921568627451;0.992156862745098,0.866666666666667,0.792156862745098;0.992156862745098,0.858823529411765,0.784313725490196;0.992156862745098,0.850980392156863,0.768627450980392;0.988235294117647,0.839215686274510,0.752941176470588;0.988235294117647,0.823529411764706,0.737254901960784;0.984313725490196,0.811764705882353,0.721568627450980;0.984313725490196,0.800000000000000,0.705882352941177;0.980392156862745,0.788235294117647,0.690196078431373;0.980392156862745,0.776470588235294,0.674509803921569;0.976470588235294,0.764705882352941,0.658823529411765;0.972549019607843,0.752941176470588,0.643137254901961;0.972549019607843,0.741176470588235,0.627450980392157;0.968627450980392,0.729411764705882,0.611764705882353;0.968627450980392,0.713725490196078,0.596078431372549;0.964705882352941,0.701960784313725,0.580392156862745;0.964705882352941,0.690196078431373,0.564705882352941;0.960784313725490,0.678431372549020,0.549019607843137;0.960784313725490,0.666666666666667,0.533333333333333;0.956862745098039,0.654901960784314,0.517647058823530;0.952941176470588,0.643137254901961,0.505882352941176;0.949019607843137,0.631372549019608,0.494117647058824;0.941176470588235,0.619607843137255,0.486274509803922;0.937254901960784,0.607843137254902,0.474509803921569;0.929411764705882,0.596078431372549,0.466666666666667;0.925490196078431,0.584313725490196,0.454901960784314;0.917647058823529,0.572549019607843,0.443137254901961;0.913725490196078,0.564705882352941,0.435294117647059;0.905882352941177,0.552941176470588,0.423529411764706;0.901960784313726,0.541176470588235,0.415686274509804;0.894117647058824,0.529411764705882,0.403921568627451;0.890196078431373,0.517647058823530,0.396078431372549;0.882352941176471,0.505882352941176,0.384313725490196;0.878431372549020,0.494117647058824,0.372549019607843;0.870588235294118,0.482352941176471,0.364705882352941;0.866666666666667,0.474509803921569,0.352941176470588;0.858823529411765,0.462745098039216,0.345098039215686;0.854901960784314,0.450980392156863,0.333333333333333;0.847058823529412,0.439215686274510,0.325490196078431;0.843137254901961,0.427450980392157,0.313725490196078;0.835294117647059,0.403921568627451,0.301960784313725;0.827450980392157,0.380392156862745,0.294117647058824;0.819607843137255,0.356862745098039,0.282352941176471;0.811764705882353,0.333333333333333,0.270588235294118;0.803921568627451,0.309803921568627,0.262745098039216;0.796078431372549,0.286274509803922,0.250980392156863;0.788235294117647,0.262745098039216,0.239215686274510;0.780392156862745,0.239215686274510,0.231372549019608;0.768627450980392,0.211764705882353,0.219607843137255;0.760784313725490,0.188235294117647,0.207843137254902;0.752941176470588,0.164705882352941,0.200000000000000;0.745098039215686,0.141176470588235,0.188235294117647;0.737254901960784,0.117647058823529,0.176470588235294;0.729411764705882,0.0941176470588235,0.168627450980392;0.721568627450980,0.0705882352941177,0.156862745098039;0.713725490196078,0.0470588235294118,0.145098039215686;0.705882352941177,0.0235294117647059,0.137254901960784;0.701960784313725,0.0117647058823529,0.129411764705882]; + [0.572549019607843,0.313725490196078,0.200000000000000;0.580392156862745,0.325490196078431,0.207843137254902;0.588235294117647,0.337254901960784,0.219607843137255;0.596078431372549,0.349019607843137,0.227450980392157;0.603921568627451,0.360784313725490,0.235294117647059;0.611764705882353,0.372549019607843,0.243137254901961;0.619607843137255,0.384313725490196,0.250980392156863;0.627450980392157,0.396078431372549,0.262745098039216;0.635294117647059,0.407843137254902,0.270588235294118;0.647058823529412,0.419607843137255,0.278431372549020;0.654901960784314,0.431372549019608,0.286274509803922;0.662745098039216,0.439215686274510,0.294117647058824;0.670588235294118,0.450980392156863,0.305882352941177;0.678431372549020,0.462745098039216,0.313725490196078;0.686274509803922,0.474509803921569,0.321568627450980;0.694117647058824,0.486274509803922,0.329411764705882;0.701960784313725,0.498039215686275,0.341176470588235;0.709803921568628,0.509803921568627,0.349019607843137;0.717647058823529,0.521568627450980,0.356862745098039;0.725490196078431,0.533333333333333,0.364705882352941;0.733333333333333,0.545098039215686,0.372549019607843;0.741176470588235,0.556862745098039,0.384313725490196;0.749019607843137,0.568627450980392,0.392156862745098;0.756862745098039,0.576470588235294,0.400000000000000;0.764705882352941,0.588235294117647,0.407843137254902;0.772549019607843,0.600000000000000,0.415686274509804;0.784313725490196,0.611764705882353,0.431372549019608;0.792156862745098,0.623529411764706,0.447058823529412;0.800000000000000,0.635294117647059,0.462745098039216;0.807843137254902,0.647058823529412,0.474509803921569;0.819607843137255,0.658823529411765,0.490196078431373;0.827450980392157,0.666666666666667,0.505882352941176;0.835294117647059,0.678431372549020,0.521568627450980;0.843137254901961,0.690196078431373,0.537254901960784;0.850980392156863,0.701960784313725,0.549019607843137;0.862745098039216,0.713725490196078,0.564705882352941;0.870588235294118,0.725490196078431,0.580392156862745;0.878431372549020,0.737254901960784,0.596078431372549;0.886274509803922,0.749019607843137,0.611764705882353;0.894117647058824,0.756862745098039,0.627450980392157;0.905882352941177,0.768627450980392,0.639215686274510;0.913725490196078,0.780392156862745,0.654901960784314;0.921568627450980,0.792156862745098,0.670588235294118;0.929411764705882,0.803921568627451,0.686274509803922;0.941176470588235,0.815686274509804,0.701960784313725;0.949019607843137,0.827450980392157,0.717647058823529;0.956862745098039,0.839215686274510,0.729411764705882;0.964705882352941,0.847058823529412,0.745098039215686;0.972549019607843,0.858823529411765,0.760784313725490;0.976470588235294,0.866666666666667,0.772549019607843;0.972549019607843,0.870588235294118,0.780392156862745;0.972549019607843,0.874509803921569,0.788235294117647;0.968627450980392,0.878431372549020,0.800000000000000;0.964705882352941,0.886274509803922,0.807843137254902;0.964705882352941,0.890196078431373,0.819607843137255;0.960784313725490,0.894117647058824,0.827450980392157;0.960784313725490,0.898039215686275,0.835294117647059;0.956862745098039,0.901960784313726,0.847058823529412;0.956862745098039,0.909803921568627,0.854901960784314;0.952941176470588,0.913725490196078,0.862745098039216;0.952941176470588,0.917647058823529,0.874509803921569;0.949019607843137,0.921568627450980,0.882352941176471;0.949019607843137,0.925490196078431,0.890196078431373;0.945098039215686,0.933333333333333,0.901960784313726;0.945098039215686,0.937254901960784,0.909803921568627;0.941176470588235,0.941176470588235,0.917647058823529;0.937254901960784,0.945098039215686,0.929411764705882;0.937254901960784,0.949019607843137,0.937254901960784;0.933333333333333,0.956862745098039,0.945098039215686;0.933333333333333,0.960784313725490,0.956862745098039;0.929411764705882,0.964705882352941,0.964705882352941;0.929411764705882,0.968627450980392,0.972549019607843;0.925490196078431,0.972549019607843,0.984313725490196;0.917647058823529,0.972549019607843,0.988235294117647;0.901960784313726,0.968627450980392,0.984313725490196;0.890196078431373,0.960784313725490,0.984313725490196;0.874509803921569,0.956862745098039,0.980392156862745;0.858823529411765,0.952941176470588,0.980392156862745;0.843137254901961,0.945098039215686,0.976470588235294;0.827450980392157,0.941176470588235,0.976470588235294;0.811764705882353,0.933333333333333,0.972549019607843;0.796078431372549,0.929411764705882,0.972549019607843;0.784313725490196,0.921568627450980,0.968627450980392;0.768627450980392,0.917647058823529,0.964705882352941;0.752941176470588,0.913725490196078,0.964705882352941;0.737254901960784,0.905882352941177,0.960784313725490;0.721568627450980,0.901960784313726,0.960784313725490;0.705882352941177,0.894117647058824,0.956862745098039;0.694117647058824,0.890196078431373,0.956862745098039;0.678431372549020,0.882352941176471,0.952941176470588;0.662745098039216,0.878431372549020,0.952941176470588;0.647058823529412,0.874509803921569,0.949019607843137;0.631372549019608,0.866666666666667,0.949019607843137;0.615686274509804,0.862745098039216,0.945098039215686;0.600000000000000,0.854901960784314,0.945098039215686;0.588235294117647,0.850980392156863,0.941176470588235;0.572549019607843,0.843137254901961,0.941176470588235;0.556862745098039,0.839215686274510,0.937254901960784;0.549019607843137,0.835294117647059,0.933333333333333;0.541176470588235,0.827450980392157,0.933333333333333;0.533333333333333,0.823529411764706,0.929411764705882;0.525490196078431,0.815686274509804,0.929411764705882;0.517647058823530,0.811764705882353,0.925490196078431;0.509803921568627,0.803921568627451,0.925490196078431;0.501960784313726,0.800000000000000,0.921568627450980;0.494117647058824,0.792156862745098,0.921568627450980;0.486274509803922,0.788235294117647,0.917647058823529;0.478431372549020,0.780392156862745,0.917647058823529;0.470588235294118,0.776470588235294,0.913725490196078;0.462745098039216,0.768627450980392,0.913725490196078;0.454901960784314,0.764705882352941,0.909803921568627;0.447058823529412,0.756862745098039,0.909803921568627;0.439215686274510,0.752941176470588,0.905882352941177;0.431372549019608,0.745098039215686,0.905882352941177;0.423529411764706,0.741176470588235,0.901960784313726;0.415686274509804,0.733333333333333,0.901960784313726;0.407843137254902,0.729411764705882,0.898039215686275;0.396078431372549,0.721568627450980,0.898039215686275;0.388235294117647,0.717647058823529,0.894117647058824;0.380392156862745,0.713725490196078,0.894117647058824;0.372549019607843,0.705882352941177,0.890196078431373;0.364705882352941,0.698039215686275,0.886274509803922;0.356862745098039,0.686274509803922,0.878431372549020;0.352941176470588,0.674509803921569,0.870588235294118;0.345098039215686,0.662745098039216,0.862745098039216;0.337254901960784,0.650980392156863,0.858823529411765;0.329411764705882,0.639215686274510,0.850980392156863;0.321568627450980,0.627450980392157,0.843137254901961;0.313725490196078,0.611764705882353,0.835294117647059;0.305882352941177,0.600000000000000,0.827450980392157;0.298039215686275,0.588235294117647,0.819607843137255;0.290196078431373,0.576470588235294,0.811764705882353;0.282352941176471,0.564705882352941,0.803921568627451;0.274509803921569,0.552941176470588,0.796078431372549;0.266666666666667,0.541176470588235,0.788235294117647;0.258823529411765,0.529411764705882,0.780392156862745;0.250980392156863,0.517647058823530,0.772549019607843;0.243137254901961,0.505882352941176,0.764705882352941;0.239215686274510,0.494117647058824,0.756862745098039;0.231372549019608,0.482352941176471,0.749019607843137;0.223529411764706,0.466666666666667,0.741176470588235;0.215686274509804,0.454901960784314,0.733333333333333;0.207843137254902,0.443137254901961,0.725490196078431;0.200000000000000,0.431372549019608,0.717647058823529;0.192156862745098,0.419607843137255,0.709803921568628;0.188235294117647,0.415686274509804,0.705882352941177]; + [0.552941176470588,0.321568627450980,0.0431372549019608;0.564705882352941,0.333333333333333,0.0509803921568627;0.576470588235294,0.345098039215686,0.0588235294117647;0.588235294117647,0.356862745098039,0.0666666666666667;0.600000000000000,0.364705882352941,0.0745098039215686;0.611764705882353,0.376470588235294,0.0823529411764706;0.623529411764706,0.388235294117647,0.0901960784313726;0.635294117647059,0.400000000000000,0.0980392156862745;0.647058823529412,0.411764705882353,0.105882352941176;0.658823529411765,0.419607843137255,0.113725490196078;0.670588235294118,0.431372549019608,0.121568627450980;0.682352941176471,0.443137254901961,0.129411764705882;0.694117647058824,0.454901960784314,0.137254901960784;0.705882352941177,0.462745098039216,0.145098039215686;0.717647058823529,0.474509803921569,0.152941176470588;0.729411764705882,0.486274509803922,0.160784313725490;0.741176470588235,0.498039215686275,0.168627450980392;0.749019607843137,0.509803921568627,0.180392156862745;0.756862745098039,0.521568627450980,0.196078431372549;0.764705882352941,0.537254901960784,0.215686274509804;0.772549019607843,0.552941176470588,0.235294117647059;0.780392156862745,0.568627450980392,0.250980392156863;0.788235294117647,0.580392156862745,0.270588235294118;0.792156862745098,0.596078431372549,0.290196078431373;0.800000000000000,0.611764705882353,0.305882352941177;0.807843137254902,0.627450980392157,0.325490196078431;0.815686274509804,0.639215686274510,0.341176470588235;0.823529411764706,0.654901960784314,0.360784313725490;0.831372549019608,0.670588235294118,0.380392156862745;0.835294117647059,0.686274509803922,0.396078431372549;0.843137254901961,0.698039215686275,0.415686274509804;0.850980392156863,0.713725490196078,0.431372549019608;0.858823529411765,0.729411764705882,0.450980392156863;0.866666666666667,0.745098039215686,0.470588235294118;0.874509803921569,0.756862745098039,0.486274509803922;0.878431372549020,0.768627450980392,0.501960784313726;0.882352941176471,0.776470588235294,0.521568627450980;0.890196078431373,0.784313725490196,0.537254901960784;0.894117647058824,0.792156862745098,0.552941176470588;0.898039215686275,0.803921568627451,0.568627450980392;0.905882352941177,0.811764705882353,0.584313725490196;0.909803921568627,0.819607843137255,0.600000000000000;0.913725490196078,0.827450980392157,0.615686274509804;0.921568627450980,0.835294117647059,0.631372549019608;0.925490196078431,0.847058823529412,0.647058823529412;0.929411764705882,0.854901960784314,0.662745098039216;0.937254901960784,0.862745098039216,0.678431372549020;0.941176470588235,0.870588235294118,0.694117647058824;0.945098039215686,0.878431372549020,0.709803921568628;0.952941176470588,0.890196078431373,0.725490196078431;0.956862745098039,0.898039215686275,0.741176470588235;0.960784313725490,0.905882352941177,0.756862745098039;0.964705882352941,0.909803921568627,0.772549019607843;0.964705882352941,0.913725490196078,0.784313725490196;0.964705882352941,0.917647058823529,0.796078431372549;0.964705882352941,0.921568627450980,0.807843137254902;0.964705882352941,0.925490196078431,0.819607843137255;0.964705882352941,0.925490196078431,0.831372549019608;0.964705882352941,0.929411764705882,0.843137254901961;0.964705882352941,0.933333333333333,0.854901960784314;0.960784313725490,0.937254901960784,0.866666666666667;0.960784313725490,0.937254901960784,0.878431372549020;0.960784313725490,0.941176470588235,0.890196078431373;0.960784313725490,0.945098039215686,0.901960784313726;0.960784313725490,0.949019607843137,0.913725490196078;0.960784313725490,0.952941176470588,0.925490196078431;0.960784313725490,0.952941176470588,0.937254901960784;0.960784313725490,0.956862745098039,0.949019607843137;0.960784313725490,0.960784313725490,0.960784313725490;0.952941176470588,0.956862745098039,0.956862745098039;0.941176470588235,0.956862745098039,0.952941176470588;0.933333333333333,0.952941176470588,0.952941176470588;0.925490196078431,0.952941176470588,0.949019607843137;0.913725490196078,0.949019607843137,0.945098039215686;0.905882352941177,0.949019607843137,0.941176470588235;0.898039215686275,0.945098039215686,0.937254901960784;0.886274509803922,0.945098039215686,0.933333333333333;0.878431372549020,0.941176470588235,0.933333333333333;0.870588235294118,0.937254901960784,0.929411764705882;0.858823529411765,0.937254901960784,0.925490196078431;0.850980392156863,0.933333333333333,0.921568627450980;0.839215686274510,0.933333333333333,0.917647058823529;0.831372549019608,0.929411764705882,0.917647058823529;0.823529411764706,0.929411764705882,0.913725490196078;0.811764705882353,0.925490196078431,0.909803921568627;0.803921568627451,0.921568627450980,0.905882352941177;0.796078431372549,0.921568627450980,0.901960784313726;0.784313725490196,0.917647058823529,0.898039215686275;0.772549019607843,0.913725490196078,0.894117647058824;0.756862745098039,0.909803921568627,0.886274509803922;0.741176470588235,0.901960784313726,0.878431372549020;0.725490196078431,0.894117647058824,0.870588235294118;0.709803921568628,0.890196078431373,0.862745098039216;0.694117647058824,0.882352941176471,0.854901960784314;0.678431372549020,0.878431372549020,0.847058823529412;0.662745098039216,0.870588235294118,0.839215686274510;0.647058823529412,0.862745098039216,0.831372549019608;0.635294117647059,0.858823529411765,0.823529411764706;0.619607843137255,0.850980392156863,0.815686274509804;0.603921568627451,0.843137254901961,0.807843137254902;0.588235294117647,0.839215686274510,0.800000000000000;0.572549019607843,0.831372549019608,0.792156862745098;0.556862745098039,0.827450980392157,0.784313725490196;0.541176470588235,0.819607843137255,0.776470588235294;0.525490196078431,0.811764705882353,0.768627450980392;0.509803921568627,0.807843137254902,0.760784313725490;0.494117647058824,0.800000000000000,0.752941176470588;0.482352941176471,0.788235294117647,0.741176470588235;0.466666666666667,0.780392156862745,0.733333333333333;0.450980392156863,0.768627450980392,0.725490196078431;0.439215686274510,0.756862745098039,0.713725490196078;0.423529411764706,0.749019607843137,0.705882352941177;0.411764705882353,0.737254901960784,0.694117647058824;0.396078431372549,0.729411764705882,0.686274509803922;0.380392156862745,0.717647058823529,0.678431372549020;0.368627450980392,0.705882352941177,0.666666666666667;0.352941176470588,0.698039215686275,0.658823529411765;0.341176470588235,0.686274509803922,0.647058823529412;0.325490196078431,0.678431372549020,0.639215686274510;0.309803921568627,0.666666666666667,0.631372549019608;0.298039215686275,0.654901960784314,0.619607843137255;0.282352941176471,0.647058823529412,0.611764705882353;0.266666666666667,0.635294117647059,0.600000000000000;0.254901960784314,0.627450980392157,0.592156862745098;0.239215686274510,0.615686274509804,0.584313725490196;0.227450980392157,0.603921568627451,0.572549019607843;0.211764705882353,0.596078431372549,0.564705882352941;0.200000000000000,0.584313725490196,0.552941176470588;0.188235294117647,0.576470588235294,0.545098039215686;0.176470588235294,0.564705882352941,0.533333333333333;0.168627450980392,0.552941176470588,0.521568627450980;0.156862745098039,0.545098039215686,0.513725490196078;0.145098039215686,0.533333333333333,0.501960784313726;0.133333333333333,0.521568627450980,0.490196078431373;0.125490196078431,0.513725490196078,0.482352941176471;0.113725490196078,0.501960784313726,0.470588235294118;0.101960784313725,0.494117647058824,0.462745098039216;0.0901960784313726,0.482352941176471,0.450980392156863;0.0784313725490196,0.470588235294118,0.439215686274510;0.0705882352941177,0.462745098039216,0.431372549019608;0.0588235294117647,0.450980392156863,0.419607843137255;0.0470588235294118,0.439215686274510,0.407843137254902;0.0352941176470588,0.431372549019608,0.400000000000000;0.0274509803921569,0.419607843137255,0.388235294117647;0.0156862745098039,0.411764705882353,0.380392156862745;0.00784313725490196,0.403921568627451,0.372549019607843]; + [1,1,0.894117647058824;1,0.996078431372549,0.882352941176471;1,0.996078431372549,0.874509803921569;1,0.992156862745098,0.866666666666667;1,0.992156862745098,0.854901960784314;1,0.988235294117647,0.847058823529412;1,0.988235294117647,0.839215686274510;1,0.988235294117647,0.827450980392157;1,0.984313725490196,0.819607843137255;1,0.984313725490196,0.811764705882353;1,0.980392156862745,0.800000000000000;1,0.980392156862745,0.792156862745098;1,0.976470588235294,0.780392156862745;1,0.976470588235294,0.772549019607843;1,0.972549019607843,0.764705882352941;1,0.972549019607843,0.752941176470588;1,0.968627450980392,0.745098039215686;1,0.968627450980392,0.737254901960784;1,0.964705882352941,0.725490196078431;1,0.956862745098039,0.717647058823529;1,0.952941176470588,0.705882352941177;1,0.949019607843137,0.698039215686275;1,0.945098039215686,0.686274509803922;1,0.941176470588235,0.678431372549020;1,0.937254901960784,0.666666666666667;1,0.933333333333333,0.658823529411765;0.996078431372549,0.925490196078431,0.647058823529412;0.996078431372549,0.921568627450980,0.639215686274510;0.996078431372549,0.917647058823529,0.627450980392157;0.996078431372549,0.913725490196078,0.619607843137255;0.996078431372549,0.909803921568627,0.607843137254902;0.996078431372549,0.905882352941177,0.600000000000000;0.996078431372549,0.898039215686275,0.588235294117647;0.996078431372549,0.894117647058824,0.580392156862745;0.996078431372549,0.890196078431373,0.568627450980392;0.996078431372549,0.882352941176471,0.556862745098039;0.996078431372549,0.878431372549020,0.541176470588235;0.996078431372549,0.870588235294118,0.525490196078431;0.996078431372549,0.862745098039216,0.509803921568627;0.996078431372549,0.854901960784314,0.494117647058824;0.996078431372549,0.850980392156863,0.482352941176471;0.996078431372549,0.843137254901961,0.466666666666667;0.996078431372549,0.835294117647059,0.450980392156863;0.996078431372549,0.827450980392157,0.435294117647059;0.996078431372549,0.819607843137255,0.419607843137255;0.996078431372549,0.815686274509804,0.407843137254902;0.996078431372549,0.807843137254902,0.392156862745098;0.996078431372549,0.800000000000000,0.376470588235294;0.996078431372549,0.792156862745098,0.360784313725490;0.996078431372549,0.784313725490196,0.345098039215686;0.996078431372549,0.780392156862745,0.333333333333333;0.996078431372549,0.772549019607843,0.317647058823529;0.996078431372549,0.764705882352941,0.305882352941177;0.996078431372549,0.752941176470588,0.294117647058824;0.996078431372549,0.741176470588235,0.286274509803922;0.996078431372549,0.733333333333333,0.278431372549020;0.996078431372549,0.721568627450980,0.270588235294118;0.996078431372549,0.713725490196078,0.258823529411765;0.996078431372549,0.701960784313725,0.250980392156863;0.996078431372549,0.694117647058824,0.243137254901961;0.996078431372549,0.682352941176471,0.231372549019608;0.996078431372549,0.670588235294118,0.223529411764706;0.996078431372549,0.662745098039216,0.215686274509804;0.996078431372549,0.650980392156863,0.207843137254902;0.996078431372549,0.643137254901961,0.196078431372549;0.996078431372549,0.631372549019608,0.188235294117647;0.996078431372549,0.619607843137255,0.180392156862745;0.996078431372549,0.611764705882353,0.168627450980392;0.996078431372549,0.600000000000000,0.160784313725490;0.992156862745098,0.592156862745098,0.156862745098039;0.988235294117647,0.584313725490196,0.152941176470588;0.984313725490196,0.576470588235294,0.149019607843137;0.980392156862745,0.568627450980392,0.145098039215686;0.976470588235294,0.560784313725490,0.141176470588235;0.976470588235294,0.552941176470588,0.137254901960784;0.972549019607843,0.541176470588235,0.133333333333333;0.968627450980392,0.533333333333333,0.125490196078431;0.964705882352941,0.525490196078431,0.121568627450980;0.960784313725490,0.517647058823530,0.117647058823529;0.956862745098039,0.509803921568627,0.113725490196078;0.952941176470588,0.501960784313726,0.109803921568627;0.949019607843137,0.494117647058824,0.105882352941176;0.945098039215686,0.486274509803922,0.101960784313725;0.941176470588235,0.474509803921569,0.0980392156862745;0.937254901960784,0.466666666666667,0.0941176470588235;0.933333333333333,0.458823529411765,0.0901960784313726;0.929411764705882,0.450980392156863,0.0862745098039216;0.925490196078431,0.443137254901961,0.0823529411764706;0.921568627450980,0.435294117647059,0.0745098039215686;0.913725490196078,0.427450980392157,0.0705882352941177;0.909803921568627,0.423529411764706,0.0666666666666667;0.901960784313726,0.415686274509804,0.0627450980392157;0.894117647058824,0.407843137254902,0.0588235294117647;0.886274509803922,0.403921568627451,0.0549019607843137;0.878431372549020,0.396078431372549,0.0509803921568627;0.874509803921569,0.388235294117647,0.0470588235294118;0.866666666666667,0.380392156862745,0.0431372549019608;0.858823529411765,0.376470588235294,0.0431372549019608;0.850980392156863,0.368627450980392,0.0392156862745098;0.847058823529412,0.360784313725490,0.0352941176470588;0.839215686274510,0.352941176470588,0.0313725490196078;0.831372549019608,0.349019607843137,0.0274509803921569;0.823529411764706,0.341176470588235,0.0235294117647059;0.815686274509804,0.333333333333333,0.0196078431372549;0.811764705882353,0.329411764705882,0.0156862745098039;0.803921568627451,0.321568627450980,0.0117647058823529;0.796078431372549,0.313725490196078,0.00784313725490196;0.784313725490196,0.309803921568627,0.00784313725490196;0.776470588235294,0.301960784313725,0.00784313725490196;0.764705882352941,0.298039215686275,0.00784313725490196;0.756862745098039,0.294117647058824,0.00784313725490196;0.745098039215686,0.286274509803922,0.0117647058823529;0.737254901960784,0.282352941176471,0.0117647058823529;0.725490196078431,0.274509803921569,0.0117647058823529;0.713725490196078,0.270588235294118,0.0117647058823529;0.705882352941177,0.262745098039216,0.0117647058823529;0.694117647058824,0.258823529411765,0.0117647058823529;0.686274509803922,0.250980392156863,0.0117647058823529;0.674509803921569,0.247058823529412,0.0117647058823529;0.666666666666667,0.243137254901961,0.0117647058823529;0.654901960784314,0.235294117647059,0.0117647058823529;0.647058823529412,0.231372549019608,0.0156862745098039;0.635294117647059,0.223529411764706,0.0156862745098039;0.627450980392157,0.219607843137255,0.0156862745098039;0.615686274509804,0.211764705882353,0.0156862745098039;0.607843137254902,0.207843137254902,0.0156862745098039;0.596078431372549,0.203921568627451,0.0156862745098039;0.584313725490196,0.203921568627451,0.0156862745098039;0.576470588235294,0.200000000000000,0.0156862745098039;0.564705882352941,0.200000000000000,0.0196078431372549;0.552941176470588,0.200000000000000,0.0196078431372549;0.545098039215686,0.196078431372549,0.0196078431372549;0.533333333333333,0.196078431372549,0.0196078431372549;0.525490196078431,0.196078431372549,0.0235294117647059;0.513725490196078,0.192156862745098,0.0235294117647059;0.501960784313726,0.192156862745098,0.0235294117647059;0.494117647058824,0.192156862745098,0.0235294117647059;0.482352941176471,0.188235294117647,0.0235294117647059;0.470588235294118,0.188235294117647,0.0274509803921569;0.462745098039216,0.188235294117647,0.0274509803921569;0.450980392156863,0.188235294117647,0.0274509803921569;0.443137254901961,0.184313725490196,0.0274509803921569;0.431372549019608,0.184313725490196,0.0274509803921569;0.419607843137255,0.184313725490196,0.0313725490196078;0.411764705882353,0.180392156862745,0.0313725490196078;0.411764705882353,0.180392156862745,0.0313725490196078]; + [0,0,0.400000000000000;0,0,0.400000000000000;0,0,0.400000000000000;0,0,0.400000000000000;0,0,0.400000000000000;0,0,0.400000000000000;0,0,0.400000000000000;0.00784313725490196,0,0.411764705882353;0.0352941176470588,0,0.466666666666667;0.0627450980392157,0,0.521568627450980;0.0901960784313726,0,0.576470588235294;0.117647058823529,0,0.631372549019608;0.145098039215686,0,0.686274509803922;0.172549019607843,0,0.741176470588235;0.200000000000000,0,0.796078431372549;0.172549019607843,0.0392156862745098,0.823529411764706;0.145098039215686,0.0823529411764706,0.847058823529412;0.117647058823529,0.125490196078431,0.874509803921569;0.0901960784313726,0.168627450980392,0.898039215686275;0.0627450980392157,0.211764705882353,0.921568627450980;0.0352941176470588,0.254901960784314,0.949019607843137;0.00784313725490196,0.298039215686275,0.972549019607843;0,0.333333333333333,0.980392156862745;0,0.364705882352941,0.976470588235294;0,0.396078431372549,0.972549019607843;0,0.427450980392157,0.968627450980392;0,0.458823529411765,0.968627450980392;0,0.486274509803922,0.964705882352941;0,0.517647058823530,0.960784313725490;0.00784313725490196,0.549019607843137,0.960784313725490;0.0235294117647059,0.576470588235294,0.956862745098039;0.0392156862745098,0.603921568627451,0.952941176470588;0.0549019607843137,0.631372549019608,0.949019607843137;0.0705882352941177,0.658823529411765,0.945098039215686;0.0862745098039216,0.686274509803922,0.945098039215686;0.101960784313725,0.713725490196078,0.941176470588235;0.117647058823529,0.741176470588235,0.937254901960784;0.164705882352941,0.760784313725490,0.937254901960784;0.211764705882353,0.780392156862745,0.941176470588235;0.258823529411765,0.796078431372549,0.941176470588235;0.305882352941177,0.815686274509804,0.941176470588235;0.352941176470588,0.835294117647059,0.941176470588235;0.396078431372549,0.854901960784314,0.945098039215686;0.443137254901961,0.874509803921569,0.945098039215686;0.482352941176471,0.886274509803922,0.949019607843137;0.517647058823530,0.898039215686275,0.952941176470588;0.556862745098039,0.909803921568627,0.952941176470588;0.592156862745098,0.921568627450980,0.956862745098039;0.627450980392157,0.929411764705882,0.960784313725490;0.666666666666667,0.941176470588235,0.964705882352941;0.701960784313725,0.952941176470588,0.968627450980392;0.733333333333333,0.960784313725490,0.968627450980392;0.756862745098039,0.964705882352941,0.972549019607843;0.780392156862745,0.972549019607843,0.972549019607843;0.807843137254902,0.976470588235294,0.972549019607843;0.831372549019608,0.980392156862745,0.976470588235294;0.854901960784314,0.988235294117647,0.976470588235294;0.882352941176471,0.992156862745098,0.980392156862745;0.886274509803922,0.988235294117647,0.952941176470588;0.839215686274510,0.956862745098039,0.866666666666667;0.792156862745098,0.925490196078431,0.776470588235294;0.749019607843137,0.898039215686275,0.690196078431373;0.701960784313725,0.866666666666667,0.600000000000000;0.658823529411765,0.839215686274510,0.509803921568627;0.611764705882353,0.807843137254902,0.423529411764706;0.600000000000000,0.800000000000000,0.400000000000000;0.600000000000000,0.800000000000000,0.400000000000000;0.600000000000000,0.800000000000000,0.400000000000000;0.600000000000000,0.800000000000000,0.400000000000000;0.600000000000000,0.800000000000000,0.400000000000000;0.600000000000000,0.800000000000000,0.400000000000000;0.600000000000000,0.800000000000000,0.400000000000000;0.600000000000000,0.800000000000000,0.400000000000000;0.600000000000000,0.800000000000000,0.380392156862745;0.600000000000000,0.800000000000000,0.352941176470588;0.600000000000000,0.800000000000000,0.325490196078431;0.600000000000000,0.800000000000000,0.298039215686275;0.600000000000000,0.800000000000000,0.270588235294118;0.600000000000000,0.800000000000000,0.243137254901961;0.600000000000000,0.800000000000000,0.215686274509804;0.627450980392157,0.811764705882353,0.227450980392157;0.682352941176471,0.839215686274510,0.282352941176471;0.737254901960784,0.866666666666667,0.337254901960784;0.792156862745098,0.894117647058824,0.392156862745098;0.847058823529412,0.921568627450980,0.447058823529412;0.901960784313726,0.949019607843137,0.501960784313726;0.956862745098039,0.976470588235294,0.556862745098039;1,1,0.596078431372549;1,1,0.568627450980392;1,1,0.541176470588235;1,1,0.513725490196078;1,1,0.486274509803922;1,1,0.458823529411765;1,1,0.431372549019608;1,1,0.403921568627451;1,1,0.352941176470588;1,1,0.301960784313725;1,1,0.254901960784314;1,1,0.203921568627451;1,1,0.152941176470588;1,1,0.101960784313725;1,1,0.0549019607843137;1,1,0.00392156862745098;1,0.913725490196078,0.0862745098039216;1,0.823529411764706,0.176470588235294;1,0.733333333333333,0.266666666666667;1,0.639215686274510,0.360784313725490;1,0.549019607843137,0.450980392156863;1,0.458823529411765,0.541176470588235;1,0.380392156862745,0.588235294117647;1,0.325490196078431,0.560784313725490;1,0.270588235294118,0.533333333333333;1,0.215686274509804,0.505882352941176;1,0.160784313725490,0.478431372549020;1,0.105882352941176,0.450980392156863;1,0.0509803921568627,0.423529411764706;1,0,0.396078431372549;1,0,0.341176470588235;1,0,0.286274509803922;1,0,0.231372549019608;1,0,0.176470588235294;1,0,0.117647058823529;1,0,0.0627450980392157;1,0,0.00784313725490196;0.952941176470588,0.0235294117647059,0.0470588235294118;0.898039215686275,0.0509803921568627,0.101960784313725;0.843137254901961,0.0784313725490196,0.156862745098039;0.788235294117647,0.105882352941176,0.211764705882353;0.733333333333333,0.133333333333333,0.266666666666667;0.678431372549020,0.160784313725490,0.321568627450980;0.623529411764706,0.188235294117647,0.376470588235294;0.584313725490196,0.184313725490196,0.400000000000000;0.556862745098039,0.156862745098039,0.400000000000000;0.529411764705882,0.129411764705882,0.400000000000000;0.501960784313726,0.101960784313725,0.400000000000000;0.474509803921569,0.0745098039215686,0.400000000000000;0.447058823529412,0.0470588235294118,0.400000000000000;0.419607843137255,0.0196078431372549,0.400000000000000;0.392156862745098,0,0.400000000000000;0.364705882352941,0,0.400000000000000;0.337254901960784,0,0.400000000000000;0.309803921568627,0,0.400000000000000;0.282352941176471,0,0.400000000000000;0.254901960784314,0,0.400000000000000;0.227450980392157,0,0.400000000000000;0.227450980392157,0,0.400000000000000]; + [0.592156862745098,0.603921568627451,1;0.572549019607843,0.607843137254902,1;0.556862745098039,0.615686274509804,1;0.537254901960784,0.619607843137255,1;0.521568627450980,0.627450980392157,1;0.505882352941176,0.631372549019608,1;0.486274509803922,0.639215686274510,1;0.470588235294118,0.643137254901961,1;0.450980392156863,0.650980392156863,1;0.435294117647059,0.654901960784314,1;0.415686274509804,0.662745098039216,1;0.400000000000000,0.666666666666667,1;0.380392156862745,0.674509803921569,1;0.364705882352941,0.678431372549020,1;0.349019607843137,0.682352941176471,1;0.329411764705882,0.690196078431373,1;0.313725490196078,0.694117647058824,1;0.294117647058824,0.701960784313725,1;0.278431372549020,0.705882352941177,1;0.258823529411765,0.713725490196078,1;0.243137254901961,0.717647058823529,1;0.223529411764706,0.725490196078431,1;0.207843137254902,0.729411764705882,1;0.188235294117647,0.737254901960784,1;0.172549019607843,0.741176470588235,1;0.156862745098039,0.749019607843137,1;0.137254901960784,0.752941176470588,1;0.121568627450980,0.760784313725490,1;0.101960784313725,0.764705882352941,1;0.0862745098039216,0.772549019607843,1;0.0666666666666667,0.776470588235294,1;0.0509803921568627,0.784313725490196,1;0.0313725490196078,0.788235294117647,1;0.0156862745098039,0.796078431372549,1;0.00392156862745098,0.800000000000000,1;0.0235294117647059,0.803921568627451,0.996078431372549;0.0431372549019608,0.811764705882353,0.988235294117647;0.0627450980392157,0.815686274509804,0.984313725490196;0.0862745098039216,0.819607843137255,0.980392156862745;0.105882352941176,0.827450980392157,0.972549019607843;0.125490196078431,0.831372549019608,0.968627450980392;0.145098039215686,0.835294117647059,0.964705882352941;0.168627450980392,0.843137254901961,0.956862745098039;0.188235294117647,0.847058823529412,0.952941176470588;0.207843137254902,0.850980392156863,0.949019607843137;0.227450980392157,0.858823529411765,0.941176470588235;0.250980392156863,0.862745098039216,0.937254901960784;0.270588235294118,0.866666666666667,0.933333333333333;0.290196078431373,0.874509803921569,0.925490196078431;0.313725490196078,0.878431372549020,0.921568627450980;0.333333333333333,0.882352941176471,0.917647058823529;0.352941176470588,0.890196078431373,0.909803921568627;0.372549019607843,0.894117647058824,0.905882352941177;0.396078431372549,0.898039215686275,0.901960784313726;0.415686274509804,0.901960784313726,0.898039215686275;0.435294117647059,0.909803921568627,0.890196078431373;0.454901960784314,0.913725490196078,0.886274509803922;0.478431372549020,0.917647058823529,0.882352941176471;0.498039215686275,0.925490196078431,0.874509803921569;0.517647058823530,0.929411764705882,0.870588235294118;0.541176470588235,0.933333333333333,0.866666666666667;0.560784313725490,0.941176470588235,0.858823529411765;0.580392156862745,0.945098039215686,0.854901960784314;0.600000000000000,0.949019607843137,0.850980392156863;0.623529411764706,0.956862745098039,0.843137254901961;0.643137254901961,0.960784313725490,0.839215686274510;0.662745098039216,0.964705882352941,0.835294117647059;0.682352941176471,0.972549019607843,0.827450980392157;0.705882352941177,0.976470588235294,0.823529411764706;0.725490196078431,0.980392156862745,0.819607843137255;0.745098039215686,0.988235294117647,0.811764705882353;0.768627450980392,0.992156862745098,0.807843137254902;0.788235294117647,0.996078431372549,0.803921568627451;0.803921568627451,0.996078431372549,0.792156862745098;0.807843137254902,0.992156862745098,0.768627450980392;0.811764705882353,0.988235294117647,0.749019607843137;0.819607843137255,0.980392156862745,0.725490196078431;0.823529411764706,0.976470588235294,0.701960784313725;0.831372549019608,0.968627450980392,0.682352941176471;0.835294117647059,0.964705882352941,0.658823529411765;0.839215686274510,0.960784313725490,0.639215686274510;0.847058823529412,0.952941176470588,0.615686274509804;0.850980392156863,0.949019607843137,0.596078431372549;0.854901960784314,0.945098039215686,0.572549019607843;0.862745098039216,0.937254901960784,0.549019607843137;0.866666666666667,0.933333333333333,0.529411764705882;0.874509803921569,0.925490196078431,0.505882352941176;0.878431372549020,0.921568627450980,0.486274509803922;0.882352941176471,0.917647058823529,0.462745098039216;0.890196078431373,0.909803921568627,0.443137254901961;0.894117647058824,0.905882352941177,0.419607843137255;0.901960784313726,0.898039215686275,0.396078431372549;0.905882352941177,0.894117647058824,0.376470588235294;0.909803921568627,0.890196078431373,0.352941176470588;0.917647058823529,0.882352941176471,0.333333333333333;0.921568627450980,0.878431372549020,0.309803921568627;0.929411764705882,0.870588235294118,0.286274509803922;0.933333333333333,0.866666666666667,0.266666666666667;0.937254901960784,0.862745098039216,0.243137254901961;0.945098039215686,0.854901960784314,0.223529411764706;0.949019607843137,0.850980392156863,0.200000000000000;0.956862745098039,0.843137254901961,0.180392156862745;0.960784313725490,0.839215686274510,0.156862745098039;0.964705882352941,0.835294117647059,0.133333333333333;0.972549019607843,0.827450980392157,0.113725490196078;0.976470588235294,0.823529411764706,0.0901960784313726;0.984313725490196,0.815686274509804,0.0705882352941177;0.988235294117647,0.811764705882353,0.0470588235294118;0.992156862745098,0.807843137254902,0.0235294117647059;1,0.800000000000000,0.00392156862745098;1,0.803921568627451,0.0156862745098039;1,0.811764705882353,0.0313725490196078;1,0.815686274509804,0.0470588235294118;1,0.819607843137255,0.0627450980392157;1,0.827450980392157,0.0823529411764706;1,0.831372549019608,0.0980392156862745;1,0.839215686274510,0.113725490196078;1,0.843137254901961,0.129411764705882;1,0.850980392156863,0.149019607843137;1,0.854901960784314,0.164705882352941;1,0.858823529411765,0.180392156862745;1,0.866666666666667,0.200000000000000;1,0.870588235294118,0.215686274509804;1,0.878431372549020,0.231372549019608;1,0.882352941176471,0.247058823529412;1,0.890196078431373,0.266666666666667;1,0.894117647058824,0.282352941176471;1,0.898039215686275,0.298039215686275;1,0.905882352941177,0.313725490196078;1,0.909803921568627,0.333333333333333;1,0.917647058823529,0.349019607843137;1,0.921568627450980,0.364705882352941;1,0.925490196078431,0.380392156862745;1,0.933333333333333,0.400000000000000;1,0.937254901960784,0.415686274509804;1,0.945098039215686,0.431372549019608;1,0.949019607843137,0.450980392156863;1,0.956862745098039,0.466666666666667;1,0.960784313725490,0.482352941176471;1,0.964705882352941,0.498039215686275;1,0.972549019607843,0.517647058823530;1,0.976470588235294,0.533333333333333;1,0.984313725490196,0.549019607843137;1,0.988235294117647,0.564705882352941;1,0.996078431372549,0.584313725490196;1,0.996078431372549,0.584313725490196]; + [0.176470588235294,0.521568627450980,0.725490196078431;0.188235294117647,0.537254901960784,0.721568627450980;0.203921568627451,0.549019607843137,0.717647058823529;0.215686274509804,0.564705882352941,0.713725490196078;0.231372549019608,0.580392156862745,0.705882352941177;0.247058823529412,0.596078431372549,0.701960784313725;0.258823529411765,0.611764705882353,0.698039215686275;0.274509803921569,0.623529411764706,0.694117647058824;0.286274509803922,0.639215686274510,0.686274509803922;0.301960784313725,0.654901960784314,0.682352941176471;0.313725490196078,0.670588235294118,0.678431372549020;0.329411764705882,0.686274509803922,0.670588235294118;0.341176470588235,0.698039215686275,0.666666666666667;0.356862745098039,0.713725490196078,0.662745098039216;0.368627450980392,0.729411764705882,0.658823529411765;0.384313725490196,0.745098039215686,0.650980392156863;0.400000000000000,0.760784313725490,0.647058823529412;0.411764705882353,0.764705882352941,0.647058823529412;0.427450980392157,0.772549019607843,0.647058823529412;0.443137254901961,0.776470588235294,0.647058823529412;0.454901960784314,0.784313725490196,0.647058823529412;0.470588235294118,0.788235294117647,0.647058823529412;0.486274509803922,0.792156862745098,0.647058823529412;0.498039215686275,0.800000000000000,0.647058823529412;0.513725490196078,0.803921568627451,0.647058823529412;0.529411764705882,0.811764705882353,0.647058823529412;0.541176470588235,0.815686274509804,0.643137254901961;0.556862745098039,0.823529411764706,0.643137254901961;0.572549019607843,0.827450980392157,0.643137254901961;0.584313725490196,0.835294117647059,0.643137254901961;0.600000000000000,0.839215686274510,0.643137254901961;0.615686274509804,0.843137254901961,0.643137254901961;0.631372549019608,0.850980392156863,0.643137254901961;0.643137254901961,0.854901960784314,0.643137254901961;0.658823529411765,0.862745098039216,0.643137254901961;0.674509803921569,0.866666666666667,0.643137254901961;0.686274509803922,0.870588235294118,0.639215686274510;0.698039215686275,0.878431372549020,0.639215686274510;0.709803921568628,0.882352941176471,0.635294117647059;0.721568627450980,0.886274509803922,0.631372549019608;0.733333333333333,0.894117647058824,0.631372549019608;0.745098039215686,0.898039215686275,0.627450980392157;0.760784313725490,0.901960784313726,0.623529411764706;0.772549019607843,0.905882352941177,0.623529411764706;0.784313725490196,0.913725490196078,0.619607843137255;0.796078431372549,0.917647058823529,0.615686274509804;0.807843137254902,0.921568627450980,0.615686274509804;0.819607843137255,0.929411764705882,0.611764705882353;0.835294117647059,0.933333333333333,0.611764705882353;0.847058823529412,0.937254901960784,0.607843137254902;0.858823529411765,0.941176470588235,0.603921568627451;0.870588235294118,0.949019607843137,0.603921568627451;0.882352941176471,0.952941176470588,0.600000000000000;0.894117647058824,0.956862745098039,0.596078431372549;0.905882352941177,0.960784313725490,0.600000000000000;0.909803921568627,0.964705882352941,0.607843137254902;0.913725490196078,0.964705882352941,0.615686274509804;0.921568627450980,0.968627450980392,0.623529411764706;0.925490196078431,0.968627450980392,0.631372549019608;0.929411764705882,0.972549019607843,0.639215686274510;0.937254901960784,0.972549019607843,0.647058823529412;0.941176470588235,0.976470588235294,0.658823529411765;0.945098039215686,0.980392156862745,0.666666666666667;0.952941176470588,0.980392156862745,0.674509803921569;0.956862745098039,0.984313725490196,0.682352941176471;0.960784313725490,0.984313725490196,0.690196078431373;0.968627450980392,0.988235294117647,0.698039215686275;0.972549019607843,0.988235294117647,0.705882352941177;0.976470588235294,0.992156862745098,0.713725490196078;0.984313725490196,0.992156862745098,0.721568627450980;0.988235294117647,0.996078431372549,0.729411764705882;0.992156862745098,0.996078431372549,0.737254901960784;1,1,0.745098039215686;1,0.996078431372549,0.741176470588235;1,0.988235294117647,0.729411764705882;1,0.980392156862745,0.717647058823529;1,0.976470588235294,0.705882352941177;1,0.968627450980392,0.694117647058824;1,0.960784313725490,0.682352941176471;1,0.952941176470588,0.674509803921569;1,0.949019607843137,0.662745098039216;1,0.941176470588235,0.650980392156863;0.996078431372549,0.933333333333333,0.639215686274510;0.996078431372549,0.929411764705882,0.627450980392157;0.996078431372549,0.921568627450980,0.615686274509804;0.996078431372549,0.913725490196078,0.603921568627451;0.996078431372549,0.905882352941177,0.592156862745098;0.996078431372549,0.901960784313726,0.580392156862745;0.996078431372549,0.894117647058824,0.572549019607843;0.996078431372549,0.886274509803922,0.560784313725490;0.996078431372549,0.878431372549020,0.549019607843137;0.996078431372549,0.870588235294118,0.537254901960784;0.996078431372549,0.858823529411765,0.529411764705882;0.996078431372549,0.850980392156863,0.521568627450980;0.996078431372549,0.839215686274510,0.513725490196078;0.996078431372549,0.827450980392157,0.501960784313726;0.996078431372549,0.819607843137255,0.494117647058824;0.996078431372549,0.807843137254902,0.486274509803922;0.996078431372549,0.796078431372549,0.478431372549020;0.996078431372549,0.788235294117647,0.466666666666667;0.992156862745098,0.776470588235294,0.458823529411765;0.992156862745098,0.764705882352941,0.450980392156863;0.992156862745098,0.756862745098039,0.443137254901961;0.992156862745098,0.745098039215686,0.431372549019608;0.992156862745098,0.733333333333333,0.423529411764706;0.992156862745098,0.725490196078431,0.415686274509804;0.992156862745098,0.713725490196078,0.407843137254902;0.992156862745098,0.701960784313725,0.396078431372549;0.992156862745098,0.694117647058824,0.388235294117647;0.992156862745098,0.682352941176471,0.380392156862745;0.988235294117647,0.666666666666667,0.372549019607843;0.988235294117647,0.654901960784314,0.368627450980392;0.984313725490196,0.639215686274510,0.360784313725490;0.984313725490196,0.623529411764706,0.352941176470588;0.980392156862745,0.611764705882353,0.349019607843137;0.980392156862745,0.596078431372549,0.341176470588235;0.976470588235294,0.584313725490196,0.333333333333333;0.976470588235294,0.568627450980392,0.329411764705882;0.972549019607843,0.552941176470588,0.321568627450980;0.972549019607843,0.541176470588235,0.313725490196078;0.968627450980392,0.525490196078431,0.309803921568627;0.968627450980392,0.513725490196078,0.301960784313725;0.964705882352941,0.498039215686275,0.294117647058824;0.964705882352941,0.482352941176471,0.290196078431373;0.960784313725490,0.470588235294118,0.282352941176471;0.960784313725490,0.454901960784314,0.274509803921569;0.956862745098039,0.443137254901961,0.270588235294118;0.956862745098039,0.427450980392157,0.262745098039216;0.949019607843137,0.415686274509804,0.258823529411765;0.945098039215686,0.407843137254902,0.250980392156863;0.937254901960784,0.396078431372549,0.247058823529412;0.933333333333333,0.384313725490196,0.239215686274510;0.925490196078431,0.376470588235294,0.235294117647059;0.917647058823529,0.364705882352941,0.227450980392157;0.913725490196078,0.352941176470588,0.223529411764706;0.905882352941177,0.345098039215686,0.215686274509804;0.898039215686275,0.333333333333333,0.211764705882353;0.894117647058824,0.321568627450980,0.207843137254902;0.886274509803922,0.313725490196078,0.200000000000000;0.882352941176471,0.301960784313725,0.196078431372549;0.874509803921569,0.290196078431373,0.188235294117647;0.866666666666667,0.282352941176471,0.184313725490196;0.862745098039216,0.270588235294118,0.176470588235294;0.854901960784314,0.258823529411765,0.172549019607843;0.850980392156863,0.250980392156863,0.164705882352941;0.850980392156863,0.250980392156863,0.164705882352941]; + [0.274509803921569,0.466666666666667,0.709803921568628;0.286274509803922,0.478431372549020,0.717647058823529;0.298039215686275,0.490196078431373,0.721568627450980;0.309803921568627,0.505882352941176,0.729411764705882;0.321568627450980,0.517647058823530,0.737254901960784;0.333333333333333,0.533333333333333,0.745098039215686;0.341176470588235,0.545098039215686,0.749019607843137;0.352941176470588,0.556862745098039,0.756862745098039;0.364705882352941,0.572549019607843,0.764705882352941;0.376470588235294,0.584313725490196,0.772549019607843;0.388235294117647,0.596078431372549,0.776470588235294;0.400000000000000,0.611764705882353,0.784313725490196;0.407843137254902,0.623529411764706,0.792156862745098;0.419607843137255,0.635294117647059,0.800000000000000;0.431372549019608,0.650980392156863,0.803921568627451;0.443137254901961,0.662745098039216,0.811764705882353;0.454901960784314,0.678431372549020,0.819607843137255;0.466666666666667,0.686274509803922,0.823529411764706;0.478431372549020,0.694117647058824,0.827450980392157;0.486274509803922,0.705882352941177,0.835294117647059;0.498039215686275,0.713725490196078,0.839215686274510;0.509803921568627,0.721568627450980,0.843137254901961;0.521568627450980,0.733333333333333,0.850980392156863;0.533333333333333,0.741176470588235,0.854901960784314;0.545098039215686,0.752941176470588,0.858823529411765;0.556862745098039,0.760784313725490,0.862745098039216;0.568627450980392,0.768627450980392,0.870588235294118;0.580392156862745,0.780392156862745,0.874509803921569;0.592156862745098,0.788235294117647,0.878431372549020;0.603921568627451,0.796078431372549,0.886274509803922;0.615686274509804,0.807843137254902,0.890196078431373;0.627450980392157,0.815686274509804,0.894117647058824;0.639215686274510,0.823529411764706,0.898039215686275;0.650980392156863,0.835294117647059,0.905882352941177;0.662745098039216,0.843137254901961,0.909803921568627;0.670588235294118,0.850980392156863,0.913725490196078;0.682352941176471,0.858823529411765,0.917647058823529;0.694117647058824,0.862745098039216,0.921568627450980;0.705882352941177,0.866666666666667,0.925490196078431;0.717647058823529,0.874509803921569,0.925490196078431;0.729411764705882,0.878431372549020,0.929411764705882;0.737254901960784,0.886274509803922,0.933333333333333;0.749019607843137,0.890196078431373,0.937254901960784;0.760784313725490,0.894117647058824,0.941176470588235;0.772549019607843,0.901960784313726,0.941176470588235;0.784313725490196,0.905882352941177,0.945098039215686;0.796078431372549,0.913725490196078,0.949019607843137;0.803921568627451,0.917647058823529,0.952941176470588;0.815686274509804,0.921568627450980,0.956862745098039;0.827450980392157,0.929411764705882,0.956862745098039;0.839215686274510,0.933333333333333,0.960784313725490;0.850980392156863,0.937254901960784,0.964705882352941;0.862745098039216,0.945098039215686,0.968627450980392;0.870588235294118,0.949019607843137,0.972549019607843;0.882352941176471,0.952941176470588,0.968627450980392;0.886274509803922,0.956862745098039,0.956862745098039;0.894117647058824,0.960784313725490,0.945098039215686;0.901960784313726,0.960784313725490,0.929411764705882;0.905882352941177,0.964705882352941,0.917647058823529;0.913725490196078,0.968627450980392,0.905882352941177;0.921568627450980,0.968627450980392,0.894117647058824;0.925490196078431,0.972549019607843,0.882352941176471;0.933333333333333,0.972549019607843,0.870588235294118;0.941176470588235,0.976470588235294,0.858823529411765;0.945098039215686,0.980392156862745,0.847058823529412;0.952941176470588,0.980392156862745,0.835294117647059;0.960784313725490,0.984313725490196,0.823529411764706;0.964705882352941,0.988235294117647,0.811764705882353;0.972549019607843,0.988235294117647,0.800000000000000;0.980392156862745,0.992156862745098,0.788235294117647;0.984313725490196,0.996078431372549,0.776470588235294;0.992156862745098,0.996078431372549,0.764705882352941;1,1,0.752941176470588;1,0.996078431372549,0.741176470588235;1,0.988235294117647,0.729411764705882;1,0.980392156862745,0.721568627450980;1,0.976470588235294,0.709803921568628;1,0.968627450980392,0.701960784313725;1,0.960784313725490,0.690196078431373;1,0.952941176470588,0.678431372549020;1,0.949019607843137,0.670588235294118;1,0.941176470588235,0.658823529411765;0.996078431372549,0.933333333333333,0.650980392156863;0.996078431372549,0.929411764705882,0.639215686274510;0.996078431372549,0.921568627450980,0.627450980392157;0.996078431372549,0.913725490196078,0.619607843137255;0.996078431372549,0.905882352941177,0.607843137254902;0.996078431372549,0.901960784313726,0.600000000000000;0.996078431372549,0.894117647058824,0.588235294117647;0.996078431372549,0.886274509803922,0.576470588235294;0.996078431372549,0.878431372549020,0.568627450980392;0.996078431372549,0.870588235294118,0.556862745098039;0.996078431372549,0.858823529411765,0.549019607843137;0.996078431372549,0.850980392156863,0.537254901960784;0.996078431372549,0.839215686274510,0.529411764705882;0.996078431372549,0.827450980392157,0.517647058823530;0.996078431372549,0.819607843137255,0.509803921568627;0.996078431372549,0.807843137254902,0.498039215686275;0.996078431372549,0.796078431372549,0.490196078431373;0.996078431372549,0.788235294117647,0.478431372549020;0.992156862745098,0.776470588235294,0.470588235294118;0.992156862745098,0.764705882352941,0.458823529411765;0.992156862745098,0.756862745098039,0.450980392156863;0.992156862745098,0.745098039215686,0.439215686274510;0.992156862745098,0.733333333333333,0.427450980392157;0.992156862745098,0.725490196078431,0.419607843137255;0.992156862745098,0.713725490196078,0.407843137254902;0.992156862745098,0.701960784313725,0.400000000000000;0.992156862745098,0.694117647058824,0.388235294117647;0.992156862745098,0.682352941176471,0.380392156862745;0.988235294117647,0.666666666666667,0.372549019607843;0.988235294117647,0.654901960784314,0.368627450980392;0.984313725490196,0.639215686274510,0.360784313725490;0.984313725490196,0.623529411764706,0.352941176470588;0.980392156862745,0.611764705882353,0.349019607843137;0.980392156862745,0.596078431372549,0.341176470588235;0.976470588235294,0.584313725490196,0.333333333333333;0.976470588235294,0.568627450980392,0.329411764705882;0.972549019607843,0.552941176470588,0.321568627450980;0.972549019607843,0.541176470588235,0.313725490196078;0.968627450980392,0.525490196078431,0.309803921568627;0.968627450980392,0.513725490196078,0.301960784313725;0.964705882352941,0.498039215686275,0.294117647058824;0.964705882352941,0.482352941176471,0.290196078431373;0.960784313725490,0.470588235294118,0.282352941176471;0.960784313725490,0.454901960784314,0.274509803921569;0.956862745098039,0.443137254901961,0.270588235294118;0.956862745098039,0.427450980392157,0.262745098039216;0.949019607843137,0.415686274509804,0.258823529411765;0.945098039215686,0.407843137254902,0.250980392156863;0.937254901960784,0.396078431372549,0.247058823529412;0.933333333333333,0.384313725490196,0.239215686274510;0.925490196078431,0.376470588235294,0.235294117647059;0.917647058823529,0.364705882352941,0.227450980392157;0.913725490196078,0.352941176470588,0.223529411764706;0.905882352941177,0.345098039215686,0.215686274509804;0.898039215686275,0.333333333333333,0.211764705882353;0.894117647058824,0.321568627450980,0.207843137254902;0.886274509803922,0.313725490196078,0.200000000000000;0.882352941176471,0.301960784313725,0.196078431372549;0.874509803921569,0.290196078431373,0.188235294117647;0.866666666666667,0.282352941176471,0.184313725490196;0.862745098039216,0.270588235294118,0.176470588235294;0.854901960784314,0.258823529411765,0.172549019607843;0.850980392156863,0.250980392156863,0.164705882352941;0.850980392156863,0.250980392156863,0.164705882352941]; + [0.992156862745098,0,0.996078431372549;0.972549019607843,0,0.988235294117647;0.956862745098039,0,0.976470588235294;0.937254901960784,0,0.968627450980392;0.917647058823529,0,0.960784313725490;0.901960784313726,0,0.949019607843137;0.882352941176471,0,0.941176470588235;0.866666666666667,0,0.933333333333333;0.847058823529412,0,0.921568627450980;0.827450980392157,0,0.913725490196078;0.811764705882353,0,0.905882352941177;0.792156862745098,0,0.898039215686275;0.776470588235294,0,0.886274509803922;0.756862745098039,0,0.878431372549020;0.737254901960784,0,0.870588235294118;0.721568627450980,0,0.858823529411765;0.701960784313725,0,0.850980392156863;0.686274509803922,0,0.843137254901961;0.666666666666667,0,0.835294117647059;0.647058823529412,0,0.823529411764706;0.631372549019608,0,0.815686274509804;0.611764705882353,0,0.807843137254902;0.596078431372549,0.00784313725490196,0.800000000000000;0.572549019607843,0.0431372549019608,0.807843137254902;0.552941176470588,0.0745098039215686,0.815686274509804;0.533333333333333,0.109803921568627,0.823529411764706;0.513725490196078,0.141176470588235,0.827450980392157;0.494117647058824,0.176470588235294,0.835294117647059;0.474509803921569,0.207843137254902,0.843137254901961;0.454901960784314,0.243137254901961,0.847058823529412;0.435294117647059,0.274509803921569,0.854901960784314;0.415686274509804,0.309803921568627,0.862745098039216;0.396078431372549,0.341176470588235,0.866666666666667;0.376470588235294,0.376470588235294,0.874509803921569;0.356862745098039,0.407843137254902,0.882352941176471;0.337254901960784,0.439215686274510,0.886274509803922;0.313725490196078,0.474509803921569,0.894117647058824;0.294117647058824,0.505882352941176,0.901960784313726;0.274509803921569,0.541176470588235,0.909803921568627;0.254901960784314,0.572549019607843,0.913725490196078;0.235294117647059,0.607843137254902,0.921568627450980;0.215686274509804,0.639215686274510,0.929411764705882;0.196078431372549,0.674509803921569,0.933333333333333;0.176470588235294,0.705882352941177,0.941176470588235;0.156862745098039,0.741176470588235,0.949019607843137;0.137254901960784,0.772549019607843,0.952941176470588;0.117647058823529,0.807843137254902,0.960784313725490;0.0980392156862745,0.839215686274510,0.968627450980392;0.0745098039215686,0.874509803921569,0.976470588235294;0.0549019607843137,0.905882352941177,0.980392156862745;0.0352941176470588,0.941176470588235,0.988235294117647;0.0156862745098039,0.972549019607843,0.996078431372549;0,1,0.992156862745098;0,1,0.956862745098039;0,1,0.921568627450980;0,1,0.886274509803922;0,1,0.850980392156863;0,1,0.815686274509804;0,1,0.780392156862745;0,1,0.745098039215686;0,1,0.705882352941177;0,1,0.670588235294118;0,1,0.635294117647059;0,1,0.600000000000000;0,1,0.564705882352941;0,1,0.529411764705882;0,1,0.494117647058824;0,1,0.458823529411765;0,1,0.419607843137255;0,1,0.384313725490196;0,1,0.349019607843137;0,1,0.313725490196078;0,1,0.278431372549020;0,1,0.243137254901961;0,1,0.207843137254902;0,1,0.172549019607843;0,1,0.133333333333333;0,1,0.0980392156862745;0,1,0.0627450980392157;0,1,0.0274509803921569;0.0156862745098039,1,0;0.0941176470588235,1,0;0.172549019607843,1,0;0.250980392156863,1,0;0.325490196078431,1,0;0.403921568627451,1,0;0.482352941176471,1,0;0.560784313725490,1,0;0.639215686274510,1,0;0.713725490196078,1,0;0.792156862745098,1,0;0.870588235294118,1,0;0.949019607843137,1,0;1,0.984313725490196,0;1,0.933333333333333,0;1,0.882352941176471,0;1,0.835294117647059,0;1,0.784313725490196,0;1,0.733333333333333,0;1,0.686274509803922,0;1,0.635294117647059,0;1,0.584313725490196,0;1,0.537254901960784,0;1,0.486274509803922,0;1,0.435294117647059,0;1,0.384313725490196,0;1,0.337254901960784,0;1,0.286274509803922,0;1,0.235294117647059,0;1,0.188235294117647,0;1,0.137254901960784,0;1,0.0862745098039216,0;1,0.0352941176470588,0;1,0.00784313725490196,0.00784313725490196;1,0.0392156862745098,0.0392156862745098;1,0.0705882352941177,0.0705882352941177;1,0.101960784313725,0.101960784313725;1,0.133333333333333,0.133333333333333;1,0.164705882352941,0.164705882352941;1,0.192156862745098,0.192156862745098;1,0.223529411764706,0.223529411764706;1,0.254901960784314,0.254901960784314;1,0.286274509803922,0.286274509803922;1,0.317647058823529,0.317647058823529;1,0.349019607843137,0.349019607843137;1,0.380392156862745,0.380392156862745;1,0.411764705882353,0.411764705882353;1,0.443137254901961,0.443137254901961;1,0.474509803921569,0.474509803921569;1,0.505882352941176,0.505882352941176;1,0.533333333333333,0.533333333333333;1,0.564705882352941,0.564705882352941;1,0.596078431372549,0.596078431372549;1,0.627450980392157,0.627450980392157;1,0.658823529411765,0.658823529411765;1,0.690196078431373,0.690196078431373;1,0.721568627450980,0.721568627450980;1,0.752941176470588,0.752941176470588;1,0.784313725490196,0.784313725490196;1,0.815686274509804,0.815686274509804;1,0.843137254901961,0.843137254901961;1,0.874509803921569,0.874509803921569;1,0.905882352941177,0.905882352941177;1,0.937254901960784,0.937254901960784;1,0.968627450980392,0.968627450980392;1,0.968627450980392,0.968627450980392]; + [0.0156862745098039,0.0156862745098039,0.0156862745098039;0.0431372549019608,0.0431372549019608,0.0431372549019608;0.0705882352941177,0.0705882352941177,0.0705882352941177;0.0980392156862745,0.0980392156862745,0.0980392156862745;0.125490196078431,0.125490196078431,0.125490196078431;0.152941176470588,0.152941176470588,0.152941176470588;0.180392156862745,0.180392156862745,0.180392156862745;0.207843137254902,0.192156862745098,0.207843137254902;0.239215686274510,0.160784313725490,0.239215686274510;0.266666666666667,0.133333333333333,0.266666666666667;0.298039215686275,0.101960784313725,0.298039215686275;0.329411764705882,0.0705882352941177,0.329411764705882;0.360784313725490,0.0392156862745098,0.360784313725490;0.388235294117647,0.0117647058823529,0.388235294117647;0.419607843137255,0,0.419607843137255;0.450980392156863,0,0.450980392156863;0.482352941176471,0,0.482352941176471;0.513725490196078,0,0.513725490196078;0.541176470588235,0,0.541176470588235;0.572549019607843,0,0.572549019607843;0.600000000000000,0,0.603921568627451;0.600000000000000,0,0.631372549019608;0.600000000000000,0,0.658823529411765;0.600000000000000,0,0.686274509803922;0.600000000000000,0,0.713725490196078;0.600000000000000,0,0.741176470588235;0.600000000000000,0,0.768627450980392;0.600000000000000,0,0.796078431372549;0.537254901960784,0.0196078431372549,0.780392156862745;0.462745098039216,0.0470588235294118,0.752941176470588;0.388235294117647,0.0705882352941177,0.729411764705882;0.313725490196078,0.0941176470588235,0.705882352941177;0.235294117647059,0.121568627450980,0.678431372549020;0.160784313725490,0.145098039215686,0.654901960784314;0.0862745098039216,0.172549019607843,0.627450980392157;0.0117647058823529,0.196078431372549,0.603921568627451;0,0.172549019607843,0.650980392156863;0,0.145098039215686,0.713725490196078;0,0.113725490196078,0.772549019607843;0,0.0823529411764706,0.835294117647059;0,0.0509803921568627,0.894117647058824;0,0.0235294117647059,0.956862745098039;0.00784313725490196,0.0274509803921569,0.972549019607843;0.0392156862745098,0.117647058823529,0.882352941176471;0.0705882352941177,0.207843137254902,0.792156862745098;0.101960784313725,0.301960784313725,0.698039215686275;0.129411764705882,0.392156862745098,0.607843137254902;0.160784313725490,0.482352941176471,0.517647058823530;0.192156862745098,0.576470588235294,0.423529411764706;0.180392156862745,0.639215686274510,0.360784313725490;0.152941176470588,0.694117647058824,0.305882352941177;0.125490196078431,0.749019607843137,0.250980392156863;0.0980392156862745,0.800000000000000,0.200000000000000;0.0705882352941177,0.854901960784314,0.145098039215686;0.0431372549019608,0.909803921568627,0.0901960784313726;0.0196078431372549,0.964705882352941,0.0352941176470588;0.0352941176470588,1,0;0.137254901960784,1,0;0.239215686274510,1,0;0.341176470588235,1,0;0.443137254901961,1,0;0.545098039215686,1,0;0.647058823529412,1,0;0.749019607843137,1,0;0.850980392156863,1,0;0.956862745098039,1,0;1,0.964705882352941,0;1,0.905882352941177,0;1,0.847058823529412,0;1,0.788235294117647,0;1,0.725490196078431,0;1,0.666666666666667,0;1,0.607843137254902,0;1,0.545098039215686,0;1,0.486274509803922,0;1,0.427450980392157,0;1,0.376470588235294,0;1,0.333333333333333,0;1,0.290196078431373,0;1,0.247058823529412,0;1,0.203921568627451,0;1,0.160784313725490,0;1,0.117647058823529,0;1,0.0784313725490196,0;1,0.0352941176470588,0;1,0.00784313725490196,0.00784313725490196;1,0.0392156862745098,0.0509803921568627;1,0.0666666666666667,0.0901960784313726;1,0.0980392156862745,0.133333333333333;1,0.129411764705882,0.172549019607843;1,0.160784313725490,0.215686274509804;1,0.192156862745098,0.254901960784314;1,0.223529411764706,0.298039215686275;1,0.254901960784314,0.341176470588235;1,0.286274509803922,0.380392156862745;1,0.317647058823529,0.423529411764706;1,0.349019607843137,0.462745098039216;1,0.380392156862745,0.505882352941176;1,0.407843137254902,0.545098039215686;1,0.439215686274510,0.588235294117647;1,0.470588235294118,0.627450980392157;1,0.501960784313726,0.670588235294118;1,0.533333333333333,0.709803921568628;1,0.564705882352941,0.752941176470588;1,0.596078431372549,0.792156862745098;1,0.588235294117647,0.803921568627451;1,0.572549019607843,0.807843137254902;1,0.556862745098039,0.815686274509804;1,0.545098039215686,0.819607843137255;1,0.529411764705882,0.823529411764706;1,0.513725490196078,0.827450980392157;1,0.498039215686275,0.835294117647059;1,0.486274509803922,0.839215686274510;1,0.470588235294118,0.843137254901961;1,0.454901960784314,0.847058823529412;1,0.439215686274510,0.854901960784314;1,0.427450980392157,0.858823529411765;1,0.411764705882353,0.862745098039216;1,0.396078431372549,0.866666666666667;1,0.380392156862745,0.874509803921569;1,0.368627450980392,0.878431372549020;1,0.352941176470588,0.882352941176471;1,0.337254901960784,0.886274509803922;1,0.321568627450980,0.894117647058824;1,0.309803921568627,0.898039215686275;1,0.294117647058824,0.901960784313726;1,0.278431372549020,0.905882352941177;1,0.262745098039216,0.913725490196078;1,0.250980392156863,0.917647058823529;1,0.235294117647059,0.921568627450980;1,0.219607843137255,0.925490196078431;1,0.203921568627451,0.933333333333333;1,0.192156862745098,0.937254901960784;1,0.176470588235294,0.941176470588235;1,0.160784313725490,0.945098039215686;1,0.145098039215686,0.952941176470588;1,0.133333333333333,0.956862745098039;1,0.117647058823529,0.960784313725490;1,0.101960784313725,0.964705882352941;1,0.0862745098039216,0.972549019607843;1,0.0745098039215686,0.976470588235294;1,0.0588235294117647,0.980392156862745;1,0.0431372549019608,0.984313725490196;1,0.0274509803921569,0.992156862745098;1,0.0156862745098039,0.996078431372549;1,0.0156862745098039,0.996078431372549]; + [0.407843137254902,0.0196078431372549,0.407843137254902;0.427450980392157,0.0549019607843137,0.427450980392157;0.447058823529412,0.0941176470588235,0.447058823529412;0.466666666666667,0.129411764705882,0.466666666666667;0.482352941176471,0.168627450980392,0.482352941176471;0.501960784313726,0.203921568627451,0.501960784313726;0.521568627450980,0.243137254901961,0.521568627450980;0.541176470588235,0.278431372549020,0.541176470588235;0.556862745098039,0.317647058823529,0.556862745098039;0.576470588235294,0.352941176470588,0.576470588235294;0.596078431372549,0.392156862745098,0.596078431372549;0.600000000000000,0.400000000000000,0.600000000000000;0.600000000000000,0.400000000000000,0.600000000000000;0.600000000000000,0.400000000000000,0.600000000000000;0.600000000000000,0.400000000000000,0.600000000000000;0.600000000000000,0.400000000000000,0.600000000000000;0.600000000000000,0.400000000000000,0.600000000000000;0.600000000000000,0.400000000000000,0.600000000000000;0.600000000000000,0.400000000000000,0.600000000000000;0.600000000000000,0.400000000000000,0.600000000000000;0.615686274509804,0.407843137254902,0.615686274509804;0.654901960784314,0.427450980392157,0.654901960784314;0.690196078431373,0.447058823529412,0.690196078431373;0.729411764705882,0.462745098039216,0.729411764705882;0.764705882352941,0.482352941176471,0.764705882352941;0.803921568627451,0.501960784313726,0.803921568627451;0.839215686274510,0.521568627450980,0.839215686274510;0.878431372549020,0.537254901960784,0.878431372549020;0.913725490196078,0.556862745098039,0.913725490196078;0.949019607843137,0.576470588235294,0.949019607843137;0.988235294117647,0.592156862745098,0.988235294117647;0.980392156862745,0.592156862745098,0.992156862745098;0.952941176470588,0.576470588235294,0.976470588235294;0.925490196078431,0.560784313725490,0.960784313725490;0.898039215686275,0.549019607843137,0.949019607843137;0.870588235294118,0.533333333333333,0.933333333333333;0.843137254901961,0.521568627450980,0.921568627450980;0.811764705882353,0.505882352941176,0.905882352941177;0.784313725490196,0.494117647058824,0.894117647058824;0.756862745098039,0.478431372549020,0.878431372549020;0.729411764705882,0.466666666666667,0.866666666666667;0.701960784313725,0.450980392156863,0.850980392156863;0.674509803921569,0.435294117647059,0.835294117647059;0.647058823529412,0.423529411764706,0.823529411764706;0.619607843137255,0.407843137254902,0.807843137254902;0.576470588235294,0.392156862745098,0.792156862745098;0.513725490196078,0.372549019607843,0.772549019607843;0.447058823529412,0.349019607843137,0.749019607843137;0.384313725490196,0.329411764705882,0.729411764705882;0.321568627450980,0.305882352941177,0.705882352941177;0.254901960784314,0.286274509803922,0.686274509803922;0.192156862745098,0.262745098039216,0.662745098039216;0.125490196078431,0.243137254901961,0.643137254901961;0.0627450980392157,0.219607843137255,0.619607843137255;0,0.200000000000000,0.600000000000000;0.0588235294117647,0.227450980392157,0.627450980392157;0.113725490196078,0.254901960784314,0.654901960784314;0.168627450980392,0.286274509803922,0.686274509803922;0.223529411764706,0.313725490196078,0.713725490196078;0.282352941176471,0.341176470588235,0.741176470588235;0.337254901960784,0.368627450980392,0.768627450980392;0.392156862745098,0.396078431372549,0.796078431372549;0.400000000000000,0.400000000000000,0.827450980392157;0.400000000000000,0.400000000000000,0.858823529411765;0.400000000000000,0.400000000000000,0.890196078431373;0.400000000000000,0.400000000000000,0.921568627450980;0.400000000000000,0.400000000000000,0.949019607843137;0.400000000000000,0.400000000000000,0.980392156862745;0.372549019607843,0.427450980392157,1;0.301960784313725,0.498039215686275,1;0.231372549019608,0.568627450980392,1;0.160784313725490,0.639215686274510,1;0.0941176470588235,0.705882352941177,1;0.0235294117647059,0.776470588235294,1;0.113725490196078,0.839215686274510,1;0.282352941176471,0.894117647058824,1;0.447058823529412,0.949019607843137,1;0.600000000000000,0.996078431372549,0.996078431372549;0.600000000000000,0.941176470588235,0.941176470588235;0.600000000000000,0.886274509803922,0.886274509803922;0.600000000000000,0.831372549019608,0.831372549019608;0.600000000000000,0.800000000000000,0.431372549019608;0.600000000000000,0.705882352941177,0.200000000000000;0.619607843137255,0.607843137254902,0.219607843137255;0.713725490196078,0.658823529411765,0.313725490196078;0.811764705882353,0.705882352941177,0.411764705882353;0.905882352941177,0.752941176470588,0.505882352941176;1,0.800000000000000,0.600000000000000;0.968627450980392,0.752941176470588,0.584313725490196;0.937254901960784,0.705882352941177,0.568627450980392;0.905882352941177,0.658823529411765,0.552941176470588;0.874509803921569,0.611764705882353,0.537254901960784;0.843137254901961,0.564705882352941,0.521568627450980;0.811764705882353,0.517647058823530,0.505882352941176;0.780392156862745,0.474509803921569,0.490196078431373;0.749019607843137,0.427450980392157,0.474509803921569;0.717647058823529,0.380392156862745,0.458823529411765;0.690196078431373,0.333333333333333,0.443137254901961;0.658823529411765,0.286274509803922,0.427450980392157;0.627450980392157,0.239215686274510,0.411764705882353;0.600000000000000,0.200000000000000,0.396078431372549;0.600000000000000,0.188235294117647,0.376470588235294;0.600000000000000,0.180392156862745,0.356862745098039;0.600000000000000,0.168627450980392,0.337254901960784;0.600000000000000,0.156862745098039,0.317647058823529;0.600000000000000,0.149019607843137,0.298039215686275;0.600000000000000,0.137254901960784,0.278431372549020;0.600000000000000,0.129411764705882,0.258823529411765;0.600000000000000,0.117647058823529,0.239215686274510;0.600000000000000,0.109803921568627,0.215686274509804;0.600000000000000,0.0980392156862745,0.196078431372549;0.600000000000000,0.0901960784313726,0.176470588235294;0.600000000000000,0.0784313725490196,0.156862745098039;0.600000000000000,0.0705882352941177,0.137254901960784;0.600000000000000,0.0588235294117647,0.117647058823529;0.600000000000000,0.0470588235294118,0.0980392156862745;0.600000000000000,0.0392156862745098,0.0784313725490196;0.600000000000000,0.0274509803921569,0.0588235294117647;0.600000000000000,0.0196078431372549,0.0392156862745098;0.600000000000000,0.00784313725490196,0.0196078431372549;0.600000000000000,0,0;0.584313725490196,0.0156862745098039,0;0.572549019607843,0.0274509803921569,0;0.556862745098039,0.0431372549019608,0;0.541176470588235,0.0588235294117647,0;0.529411764705882,0.0705882352941177,0;0.513725490196078,0.0862745098039216,0;0.501960784313726,0.0980392156862745,0;0.486274509803922,0.113725490196078,0;0.474509803921569,0.125490196078431,0;0.458823529411765,0.141176470588235,0;0.447058823529412,0.152941176470588,0;0.431372549019608,0.168627450980392,0;0.415686274509804,0.184313725490196,0;0.403921568627451,0.196078431372549,0;0.380392156862745,0.192156862745098,0.00784313725490196;0.349019607843137,0.184313725490196,0.0156862745098039;0.321568627450980,0.172549019607843,0.0235294117647059;0.294117647058824,0.164705882352941,0.0352941176470588;0.266666666666667,0.156862745098039,0.0431372549019608;0.239215686274510,0.145098039215686,0.0509803921568627;0.211764705882353,0.137254901960784,0.0627450980392157;0.180392156862745,0.125490196078431,0.0705882352941177;0.152941176470588,0.117647058823529,0.0784313725490196;0.125490196078431,0.105882352941176,0.0901960784313726;0.113725490196078,0.101960784313725,0.0941176470588235]; + [0.400000000000000,0.00784313725490196,0.403921568627451;0.403921568627451,0.0196078431372549,0.411764705882353;0.407843137254902,0.0313725490196078,0.423529411764706;0.411764705882353,0.0431372549019608,0.431372549019608;0.415686274509804,0.0549019607843137,0.439215686274510;0.419607843137255,0.0666666666666667,0.450980392156863;0.423529411764706,0.0784313725490196,0.458823529411765;0.427450980392157,0.0901960784313726,0.466666666666667;0.431372549019608,0.101960784313725,0.478431372549020;0.435294117647059,0.113725490196078,0.486274509803922;0.439215686274510,0.125490196078431,0.494117647058824;0.443137254901961,0.137254901960784,0.505882352941176;0.447058823529412,0.152941176470588,0.513725490196078;0.450980392156863,0.164705882352941,0.521568627450980;0.454901960784314,0.176470588235294,0.533333333333333;0.458823529411765,0.188235294117647,0.541176470588235;0.462745098039216,0.200000000000000,0.549019607843137;0.466666666666667,0.211764705882353,0.560784313725490;0.470588235294118,0.223529411764706,0.568627450980392;0.474509803921569,0.235294117647059,0.576470588235294;0.478431372549020,0.247058823529412,0.588235294117647;0.482352941176471,0.258823529411765,0.596078431372549;0.486274509803922,0.270588235294118,0.603921568627451;0.490196078431373,0.286274509803922,0.615686274509804;0.494117647058824,0.298039215686275,0.623529411764706;0.498039215686275,0.309803921568627,0.631372549019608;0.501960784313726,0.321568627450980,0.643137254901961;0.505882352941176,0.333333333333333,0.650980392156863;0.509803921568627,0.345098039215686,0.658823529411765;0.513725490196078,0.356862745098039,0.670588235294118;0.517647058823530,0.368627450980392,0.678431372549020;0.521568627450980,0.380392156862745,0.686274509803922;0.525490196078431,0.392156862745098,0.698039215686275;0.529411764705882,0.403921568627451,0.705882352941177;0.533333333333333,0.415686274509804,0.713725490196078;0.533333333333333,0.431372549019608,0.725490196078431;0.537254901960784,0.443137254901961,0.733333333333333;0.541176470588235,0.454901960784314,0.741176470588235;0.545098039215686,0.466666666666667,0.749019607843137;0.549019607843137,0.478431372549020,0.760784313725490;0.552941176470588,0.490196078431373,0.768627450980392;0.556862745098039,0.501960784313726,0.776470588235294;0.560784313725490,0.513725490196078,0.788235294117647;0.564705882352941,0.525490196078431,0.796078431372549;0.568627450980392,0.537254901960784,0.803921568627451;0.572549019607843,0.549019607843137,0.815686274509804;0.576470588235294,0.564705882352941,0.823529411764706;0.580392156862745,0.576470588235294,0.831372549019608;0.584313725490196,0.588235294117647,0.843137254901961;0.588235294117647,0.600000000000000,0.850980392156863;0.592156862745098,0.611764705882353,0.858823529411765;0.596078431372549,0.623529411764706,0.870588235294118;0.600000000000000,0.635294117647059,0.878431372549020;0.607843137254902,0.643137254901961,0.882352941176471;0.615686274509804,0.650980392156863,0.882352941176471;0.619607843137255,0.658823529411765,0.886274509803922;0.627450980392157,0.666666666666667,0.890196078431373;0.635294117647059,0.674509803921569,0.890196078431373;0.643137254901961,0.686274509803922,0.894117647058824;0.647058823529412,0.694117647058824,0.898039215686275;0.654901960784314,0.701960784313725,0.898039215686275;0.662745098039216,0.709803921568628,0.901960784313726;0.670588235294118,0.717647058823529,0.905882352941177;0.674509803921569,0.725490196078431,0.905882352941177;0.682352941176471,0.733333333333333,0.909803921568627;0.690196078431373,0.741176470588235,0.913725490196078;0.698039215686275,0.749019607843137,0.917647058823529;0.705882352941177,0.760784313725490,0.917647058823529;0.713725490196078,0.768627450980392,0.921568627450980;0.721568627450980,0.776470588235294,0.925490196078431;0.729411764705882,0.784313725490196,0.929411764705882;0.733333333333333,0.792156862745098,0.933333333333333;0.741176470588235,0.800000000000000,0.933333333333333;0.749019607843137,0.807843137254902,0.937254901960784;0.756862745098039,0.815686274509804,0.941176470588235;0.760784313725490,0.823529411764706,0.945098039215686;0.768627450980392,0.831372549019608,0.945098039215686;0.776470588235294,0.839215686274510,0.949019607843137;0.780392156862745,0.847058823529412,0.952941176470588;0.784313725490196,0.850980392156863,0.949019607843137;0.788235294117647,0.847058823529412,0.941176470588235;0.788235294117647,0.847058823529412,0.933333333333333;0.788235294117647,0.847058823529412,0.929411764705882;0.792156862745098,0.843137254901961,0.921568627450980;0.792156862745098,0.843137254901961,0.913725490196078;0.835294117647059,0.874509803921569,0.890196078431373;0.874509803921569,0.905882352941177,0.870588235294118;0.913725490196078,0.937254901960784,0.847058823529412;0.956862745098039,0.964705882352941,0.823529411764706;0.996078431372549,0.996078431372549,0.803921568627451;0.960784313725490,1,0.800000000000000;0.917647058823529,1,0.800000000000000;0.874509803921569,1,0.800000000000000;0.831372549019608,1,0.800000000000000;0.792156862745098,0.992156862745098,0.788235294117647;0.764705882352941,0.964705882352941,0.733333333333333;0.737254901960784,0.937254901960784,0.674509803921569;0.709803921568628,0.909803921568627,0.619607843137255;0.682352941176471,0.882352941176471,0.564705882352941;0.654901960784314,0.854901960784314,0.509803921568627;0.627450980392157,0.827450980392157,0.450980392156863;0.603921568627451,0.800000000000000,0.400000000000000;0.643137254901961,0.800000000000000,0.423529411764706;0.686274509803922,0.800000000000000,0.443137254901961;0.729411764705882,0.800000000000000,0.462745098039216;0.772549019607843,0.800000000000000,0.486274509803922;0.815686274509804,0.800000000000000,0.505882352941176;0.854901960784314,0.800000000000000,0.529411764705882;0.898039215686275,0.800000000000000,0.549019607843137;0.941176470588235,0.800000000000000,0.568627450980392;0.984313725490196,0.800000000000000,0.592156862745098;1,0.784313725490196,0.584313725490196;1,0.756862745098039,0.556862745098039;1,0.729411764705882,0.529411764705882;1,0.698039215686275,0.498039215686275;1,0.670588235294118,0.470588235294118;1,0.643137254901961,0.443137254901961;1,0.615686274509804,0.415686274509804;0.984313725490196,0.592156862745098,0.396078431372549;0.952941176470588,0.568627450980392,0.384313725490196;0.917647058823529,0.545098039215686,0.372549019607843;0.882352941176471,0.521568627450980,0.360784313725490;0.847058823529412,0.498039215686275,0.349019607843137;0.815686274509804,0.474509803921569,0.337254901960784;0.780392156862745,0.454901960784314,0.325490196078431;0.745098039215686,0.431372549019608,0.313725490196078;0.709803921568628,0.407843137254902,0.301960784313725;0.674509803921569,0.384313725490196,0.290196078431373;0.643137254901961,0.360784313725490,0.282352941176471;0.607843137254902,0.337254901960784,0.270588235294118;0.572549019607843,0.313725490196078,0.258823529411765;0.541176470588235,0.294117647058824,0.247058823529412;0.545098039215686,0.270588235294118,0.227450980392157;0.549019607843137,0.250980392156863,0.211764705882353;0.552941176470588,0.231372549019608,0.192156862745098;0.556862745098039,0.207843137254902,0.176470588235294;0.560784313725490,0.188235294117647,0.156862745098039;0.564705882352941,0.168627450980392,0.141176470588235;0.572549019607843,0.145098039215686,0.121568627450980;0.576470588235294,0.125490196078431,0.105882352941176;0.580392156862745,0.105882352941176,0.0862745098039216;0.584313725490196,0.0823529411764706,0.0705882352941177;0.588235294117647,0.0627450980392157,0.0509803921568627;0.592156862745098,0.0431372549019608,0.0352941176470588;0.596078431372549,0.0196078431372549,0.0156862745098039;0.596078431372549,0.0196078431372549,0.0156862745098039]; + [0.00784313725490196,0.992156862745098,0.00784313725490196;0.0117647058823529,0.988235294117647,0.0117647058823529;0.0196078431372549,0.980392156862745,0.0196078431372549;0.0274509803921569,0.972549019607843,0.0274509803921569;0.0313725490196078,0.968627450980392,0.0313725490196078;0.0392156862745098,0.960784313725490,0.0392156862745098;0.0470588235294118,0.952941176470588,0.0470588235294118;0.0509803921568627,0.949019607843137,0.0509803921568627;0.0588235294117647,0.941176470588235,0.0588235294117647;0.0666666666666667,0.933333333333333,0.0666666666666667;0.0705882352941177,0.929411764705882,0.0705882352941177;0.0784313725490196,0.921568627450980,0.0784313725490196;0.0823529411764706,0.917647058823529,0.0823529411764706;0.0901960784313726,0.909803921568627,0.0901960784313726;0.0980392156862745,0.901960784313726,0.0980392156862745;0.101960784313725,0.898039215686275,0.101960784313725;0.109803921568627,0.890196078431373,0.109803921568627;0.117647058823529,0.882352941176471,0.117647058823529;0.121568627450980,0.878431372549020,0.121568627450980;0.129411764705882,0.870588235294118,0.129411764705882;0.137254901960784,0.862745098039216,0.137254901960784;0.141176470588235,0.858823529411765,0.141176470588235;0.149019607843137,0.850980392156863,0.149019607843137;0.156862745098039,0.843137254901961,0.156862745098039;0.160784313725490,0.839215686274510,0.160784313725490;0.168627450980392,0.831372549019608,0.168627450980392;0.176470588235294,0.823529411764706,0.176470588235294;0.180392156862745,0.819607843137255,0.180392156862745;0.188235294117647,0.811764705882353,0.188235294117647;0.196078431372549,0.803921568627451,0.196078431372549;0.200000000000000,0.800000000000000,0.200000000000000;0.211764705882353,0.788235294117647,0.200000000000000;0.223529411764706,0.776470588235294,0.200000000000000;0.235294117647059,0.764705882352941,0.200000000000000;0.247058823529412,0.752941176470588,0.200000000000000;0.258823529411765,0.741176470588235,0.200000000000000;0.270588235294118,0.729411764705882,0.200000000000000;0.278431372549020,0.721568627450980,0.200000000000000;0.290196078431373,0.709803921568628,0.200000000000000;0.301960784313725,0.698039215686275,0.200000000000000;0.313725490196078,0.686274509803922,0.200000000000000;0.325490196078431,0.674509803921569,0.200000000000000;0.337254901960784,0.662745098039216,0.200000000000000;0.345098039215686,0.654901960784314,0.200000000000000;0.356862745098039,0.643137254901961,0.200000000000000;0.368627450980392,0.631372549019608,0.200000000000000;0.380392156862745,0.619607843137255,0.200000000000000;0.392156862745098,0.607843137254902,0.200000000000000;0.403921568627451,0.596078431372549,0.200000000000000;0.415686274509804,0.584313725490196,0.200000000000000;0.423529411764706,0.576470588235294,0.200000000000000;0.435294117647059,0.564705882352941,0.200000000000000;0.447058823529412,0.552941176470588,0.200000000000000;0.458823529411765,0.541176470588235,0.200000000000000;0.470588235294118,0.529411764705882,0.200000000000000;0.482352941176471,0.517647058823530,0.200000000000000;0.494117647058824,0.505882352941176,0.200000000000000;0.501960784313726,0.498039215686275,0.200000000000000;0.513725490196078,0.486274509803922,0.200000000000000;0.525490196078431,0.474509803921569,0.200000000000000;0.537254901960784,0.462745098039216,0.200000000000000;0.549019607843137,0.450980392156863,0.200000000000000;0.560784313725490,0.439215686274510,0.200000000000000;0.568627450980392,0.431372549019608,0.200000000000000;0.580392156862745,0.419607843137255,0.200000000000000;0.592156862745098,0.407843137254902,0.200000000000000;0.603921568627451,0.403921568627451,0.203921568627451;0.611764705882353,0.419607843137255,0.219607843137255;0.623529411764706,0.431372549019608,0.231372549019608;0.631372549019608,0.447058823529412,0.247058823529412;0.639215686274510,0.458823529411765,0.258823529411765;0.650980392156863,0.474509803921569,0.274509803921569;0.658823529411765,0.490196078431373,0.290196078431373;0.666666666666667,0.501960784313726,0.301960784313725;0.678431372549020,0.517647058823530,0.317647058823529;0.686274509803922,0.529411764705882,0.329411764705882;0.698039215686275,0.545098039215686,0.345098039215686;0.705882352941177,0.556862745098039,0.356862745098039;0.713725490196078,0.572549019607843,0.372549019607843;0.725490196078431,0.584313725490196,0.384313725490196;0.733333333333333,0.600000000000000,0.400000000000000;0.741176470588235,0.615686274509804,0.415686274509804;0.752941176470588,0.627450980392157,0.427450980392157;0.760784313725490,0.643137254901961,0.443137254901961;0.768627450980392,0.654901960784314,0.454901960784314;0.780392156862745,0.670588235294118,0.470588235294118;0.788235294117647,0.682352941176471,0.482352941176471;0.800000000000000,0.698039215686275,0.498039215686275;0.807843137254902,0.709803921568628,0.509803921568627;0.815686274509804,0.725490196078431,0.525490196078431;0.827450980392157,0.741176470588235,0.541176470588235;0.835294117647059,0.752941176470588,0.552941176470588;0.843137254901961,0.768627450980392,0.568627450980392;0.854901960784314,0.780392156862745,0.580392156862745;0.862745098039216,0.796078431372549,0.596078431372549;0.874509803921569,0.807843137254902,0.607843137254902;0.882352941176471,0.823529411764706,0.623529411764706;0.890196078431373,0.835294117647059,0.635294117647059;0.901960784313726,0.850980392156863,0.650980392156863;0.909803921568627,0.866666666666667,0.666666666666667;0.917647058823529,0.878431372549020,0.678431372549020;0.929411764705882,0.894117647058824,0.694117647058824;0.937254901960784,0.905882352941177,0.705882352941177;0.945098039215686,0.921568627450980,0.721568627450980;0.956862745098039,0.933333333333333,0.733333333333333;0.964705882352941,0.949019607843137,0.749019607843137;0.976470588235294,0.960784313725490,0.760784313725490;0.984313725490196,0.976470588235294,0.776470588235294;0.992156862745098,0.988235294117647,0.788235294117647;1,1,0.803921568627451;1,1,0.811764705882353;1,1,0.819607843137255;1,1,0.831372549019608;1,1,0.839215686274510;1,1,0.850980392156863;1,1,0.858823529411765;1,1,0.866666666666667;1,1,0.878431372549020;1,1,0.886274509803922;1,1,0.898039215686275;1,1,0.905882352941177;1,1,0.913725490196078;1,1,0.925490196078431;1,1,0.933333333333333;1,1,0.941176470588235;1,1,0.952941176470588;1,1,0.960784313725490;1,1,0.972549019607843;1,1,0.980392156862745;1,1,0.988235294117647;1,1,1;0.988235294117647,0.988235294117647,1;0.972549019607843,0.972549019607843,1;0.960784313725490,0.960784313725490,1;0.945098039215686,0.945098039215686,1;0.933333333333333,0.933333333333333,1;0.917647058823529,0.917647058823529,1;0.905882352941177,0.905882352941177,1;0.890196078431373,0.890196078431373,1;0.874509803921569,0.874509803921569,1;0.862745098039216,0.862745098039216,1;0.847058823529412,0.847058823529412,1;0.835294117647059,0.835294117647059,1;0.819607843137255,0.819607843137255,1;0.815686274509804,0.815686274509804,1]; + [0.611764705882353,0.807843137254902,0.407843137254902;0.627450980392157,0.811764705882353,0.411764705882353;0.639215686274510,0.819607843137255,0.419607843137255;0.650980392156863,0.827450980392157,0.427450980392157;0.666666666666667,0.831372549019608,0.431372549019608;0.678431372549020,0.839215686274510,0.439215686274510;0.690196078431373,0.847058823529412,0.447058823529412;0.701960784313725,0.850980392156863,0.450980392156863;0.717647058823529,0.858823529411765,0.458823529411765;0.729411764705882,0.866666666666667,0.466666666666667;0.741176470588235,0.870588235294118,0.470588235294118;0.756862745098039,0.878431372549020,0.478431372549020;0.768627450980392,0.882352941176471,0.482352941176471;0.780392156862745,0.890196078431373,0.490196078431373;0.796078431372549,0.898039215686275,0.498039215686275;0.807843137254902,0.901960784313726,0.501960784313726;0.819607843137255,0.909803921568627,0.509803921568627;0.835294117647059,0.917647058823529,0.517647058823530;0.847058823529412,0.921568627450980,0.521568627450980;0.858823529411765,0.929411764705882,0.529411764705882;0.870588235294118,0.937254901960784,0.537254901960784;0.886274509803922,0.941176470588235,0.541176470588235;0.898039215686275,0.949019607843137,0.549019607843137;0.909803921568627,0.956862745098039,0.556862745098039;0.925490196078431,0.960784313725490,0.560784313725490;0.937254901960784,0.968627450980392,0.568627450980392;0.949019607843137,0.976470588235294,0.576470588235294;0.964705882352941,0.980392156862745,0.580392156862745;0.976470588235294,0.988235294117647,0.588235294117647;0.988235294117647,0.996078431372549,0.596078431372549;1,0.996078431372549,0.600000000000000;0.988235294117647,0.980392156862745,0.588235294117647;0.976470588235294,0.964705882352941,0.576470588235294;0.964705882352941,0.949019607843137,0.564705882352941;0.952941176470588,0.929411764705882,0.552941176470588;0.941176470588235,0.913725490196078,0.541176470588235;0.929411764705882,0.898039215686275,0.529411764705882;0.921568627450980,0.878431372549020,0.521568627450980;0.909803921568627,0.862745098039216,0.509803921568627;0.898039215686275,0.847058823529412,0.498039215686275;0.886274509803922,0.831372549019608,0.486274509803922;0.874509803921569,0.811764705882353,0.474509803921569;0.862745098039216,0.796078431372549,0.462745098039216;0.854901960784314,0.780392156862745,0.454901960784314;0.843137254901961,0.760784313725490,0.443137254901961;0.831372549019608,0.745098039215686,0.431372549019608;0.819607843137255,0.729411764705882,0.419607843137255;0.807843137254902,0.713725490196078,0.407843137254902;0.796078431372549,0.694117647058824,0.396078431372549;0.784313725490196,0.678431372549020,0.384313725490196;0.776470588235294,0.662745098039216,0.376470588235294;0.764705882352941,0.647058823529412,0.364705882352941;0.752941176470588,0.627450980392157,0.352941176470588;0.741176470588235,0.611764705882353,0.341176470588235;0.729411764705882,0.596078431372549,0.329411764705882;0.717647058823529,0.576470588235294,0.317647058823529;0.705882352941177,0.560784313725490,0.305882352941177;0.698039215686275,0.545098039215686,0.298039215686275;0.686274509803922,0.529411764705882,0.286274509803922;0.674509803921569,0.509803921568627,0.274509803921569;0.662745098039216,0.494117647058824,0.262745098039216;0.650980392156863,0.478431372549020,0.250980392156863;0.639215686274510,0.462745098039216,0.239215686274510;0.631372549019608,0.443137254901961,0.231372549019608;0.619607843137255,0.427450980392157,0.219607843137255;0.607843137254902,0.411764705882353,0.207843137254902;0.603921568627451,0.403921568627451,0.203921568627451;0.611764705882353,0.419607843137255,0.219607843137255;0.623529411764706,0.431372549019608,0.231372549019608;0.631372549019608,0.447058823529412,0.247058823529412;0.639215686274510,0.458823529411765,0.258823529411765;0.650980392156863,0.474509803921569,0.274509803921569;0.658823529411765,0.490196078431373,0.290196078431373;0.666666666666667,0.501960784313726,0.301960784313725;0.678431372549020,0.517647058823530,0.317647058823529;0.686274509803922,0.529411764705882,0.329411764705882;0.698039215686275,0.545098039215686,0.345098039215686;0.705882352941177,0.556862745098039,0.356862745098039;0.713725490196078,0.572549019607843,0.372549019607843;0.725490196078431,0.584313725490196,0.384313725490196;0.733333333333333,0.600000000000000,0.400000000000000;0.741176470588235,0.615686274509804,0.415686274509804;0.752941176470588,0.627450980392157,0.427450980392157;0.760784313725490,0.643137254901961,0.443137254901961;0.768627450980392,0.654901960784314,0.454901960784314;0.780392156862745,0.670588235294118,0.470588235294118;0.788235294117647,0.682352941176471,0.482352941176471;0.800000000000000,0.698039215686275,0.498039215686275;0.807843137254902,0.709803921568628,0.509803921568627;0.815686274509804,0.725490196078431,0.525490196078431;0.827450980392157,0.741176470588235,0.541176470588235;0.835294117647059,0.752941176470588,0.552941176470588;0.843137254901961,0.768627450980392,0.568627450980392;0.854901960784314,0.780392156862745,0.580392156862745;0.862745098039216,0.796078431372549,0.596078431372549;0.874509803921569,0.807843137254902,0.607843137254902;0.882352941176471,0.823529411764706,0.623529411764706;0.890196078431373,0.835294117647059,0.635294117647059;0.901960784313726,0.850980392156863,0.650980392156863;0.909803921568627,0.866666666666667,0.666666666666667;0.917647058823529,0.878431372549020,0.678431372549020;0.929411764705882,0.894117647058824,0.694117647058824;0.937254901960784,0.905882352941177,0.705882352941177;0.945098039215686,0.921568627450980,0.721568627450980;0.956862745098039,0.933333333333333,0.733333333333333;0.964705882352941,0.949019607843137,0.749019607843137;0.976470588235294,0.960784313725490,0.760784313725490;0.984313725490196,0.976470588235294,0.776470588235294;0.992156862745098,0.988235294117647,0.788235294117647;1,1,0.803921568627451;1,1,0.811764705882353;1,1,0.819607843137255;1,1,0.831372549019608;1,1,0.839215686274510;1,1,0.850980392156863;1,1,0.858823529411765;1,1,0.866666666666667;1,1,0.878431372549020;1,1,0.886274509803922;1,1,0.898039215686275;1,1,0.905882352941177;1,1,0.913725490196078;1,1,0.925490196078431;1,1,0.933333333333333;1,1,0.941176470588235;1,1,0.952941176470588;1,1,0.960784313725490;1,1,0.972549019607843;1,1,0.980392156862745;1,1,0.988235294117647;1,1,1;0.988235294117647,0.988235294117647,1;0.972549019607843,0.972549019607843,1;0.960784313725490,0.960784313725490,1;0.945098039215686,0.945098039215686,1;0.933333333333333,0.933333333333333,1;0.917647058823529,0.917647058823529,1;0.905882352941177,0.905882352941177,1;0.890196078431373,0.890196078431373,1;0.874509803921569,0.874509803921569,1;0.862745098039216,0.862745098039216,1;0.847058823529412,0.847058823529412,1;0.835294117647059,0.835294117647059,1;0.819607843137255,0.819607843137255,1;0.815686274509804,0.815686274509804,1]; + [0,0.0235294117647059,0.0705882352941177;0,0.0705882352941177,0.207843137254902;0,0.113725490196078,0.345098039215686;0,0.160784313725490,0.482352941176471;0,0.203921568627451,0.600000000000000;0,0.219607843137255,0.611764705882353;0,0.239215686274510,0.619607843137255;0,0.258823529411765,0.631372549019608;0,0.278431372549020,0.639215686274510;0,0.298039215686275,0.647058823529412;0,0.317647058823529,0.658823529411765;0,0.333333333333333,0.666666666666667;0,0.352941176470588,0.678431372549020;0,0.372549019607843,0.686274509803922;0,0.392156862745098,0.694117647058824;0,0.411764705882353,0.705882352941177;0,0.431372549019608,0.713725490196078;0,0.450980392156863,0.725490196078431;0,0.466666666666667,0.733333333333333;0,0.486274509803922,0.745098039215686;0,0.505882352941176,0.752941176470588;0,0.525490196078431,0.760784313725490;0,0.545098039215686,0.772549019607843;0,0.564705882352941,0.780392156862745;0,0.580392156862745,0.792156862745098;0,0.600000000000000,0.800000000000000;0,0.619607843137255,0.811764705882353;0,0.639215686274510,0.819607843137255;0,0.658823529411765,0.827450980392157;0,0.678431372549020,0.839215686274510;0,0.694117647058824,0.847058823529412;0,0.713725490196078,0.858823529411765;0,0.733333333333333,0.866666666666667;0,0.752941176470588,0.874509803921569;0,0.772549019607843,0.886274509803922;0,0.792156862745098,0.894117647058824;0,0.807843137254902,0.905882352941177;0,0.827450980392157,0.913725490196078;0,0.847058823529412,0.925490196078431;0,0.866666666666667,0.933333333333333;0,0.886274509803922,0.941176470588235;0,0.905882352941177,0.952941176470588;0,0.921568627450980,0.960784313725490;0,0.941176470588235,0.972549019607843;0,0.960784313725490,0.980392156862745;0,0.980392156862745,0.988235294117647;0,1,1;0.0196078431372549,0.956862745098039,0.945098039215686;0.0431372549019608,0.909803921568627,0.890196078431373;0.0666666666666667,0.866666666666667,0.831372549019608;0.0901960784313726,0.819607843137255,0.772549019607843;0.113725490196078,0.772549019607843,0.717647058823529;0.137254901960784,0.729411764705882,0.658823529411765;0.160784313725490,0.682352941176471,0.603921568627451;0.180392156862745,0.635294117647059,0.545098039215686;0.203921568627451,0.592156862745098,0.486274509803922;0.227450980392157,0.545098039215686,0.431372549019608;0.250980392156863,0.498039215686275,0.372549019607843;0.274509803921569,0.450980392156863,0.317647058823529;0.298039215686275,0.407843137254902,0.258823529411765;0.317647058823529,0.360784313725490,0.200000000000000;0.341176470588235,0.313725490196078,0.145098039215686;0.364705882352941,0.270588235294118,0.0862745098039216;0.388235294117647,0.223529411764706,0.0313725490196078;0.403921568627451,0.203921568627451,0.00392156862745098;0.411764705882353,0.215686274509804,0.00784313725490196;0.419607843137255,0.223529411764706,0.0117647058823529;0.427450980392157,0.235294117647059,0.0156862745098039;0.431372549019608,0.243137254901961,0.0235294117647059;0.439215686274510,0.254901960784314,0.0274509803921569;0.447058823529412,0.262745098039216,0.0313725490196078;0.454901960784314,0.274509803921569,0.0352941176470588;0.462745098039216,0.282352941176471,0.0431372549019608;0.470588235294118,0.294117647058824,0.0470588235294118;0.478431372549020,0.301960784313725,0.0509803921568627;0.486274509803922,0.313725490196078,0.0549019607843137;0.490196078431373,0.321568627450980,0.0627450980392157;0.498039215686275,0.333333333333333,0.0666666666666667;0.505882352941176,0.341176470588235,0.0705882352941177;0.513725490196078,0.352941176470588,0.0745098039215686;0.521568627450980,0.360784313725490,0.0823529411764706;0.529411764705882,0.372549019607843,0.0862745098039216;0.537254901960784,0.380392156862745,0.0901960784313726;0.545098039215686,0.392156862745098,0.0941176470588235;0.549019607843137,0.400000000000000,0.101960784313725;0.556862745098039,0.411764705882353,0.105882352941176;0.564705882352941,0.419607843137255,0.109803921568627;0.572549019607843,0.431372549019608,0.113725490196078;0.580392156862745,0.439215686274510,0.121568627450980;0.588235294117647,0.450980392156863,0.125490196078431;0.596078431372549,0.458823529411765,0.129411764705882;0.603921568627451,0.470588235294118,0.133333333333333;0.607843137254902,0.478431372549020,0.141176470588235;0.615686274509804,0.490196078431373,0.145098039215686;0.623529411764706,0.498039215686275,0.149019607843137;0.631372549019608,0.509803921568627,0.152941176470588;0.639215686274510,0.517647058823530,0.160784313725490;0.647058823529412,0.529411764705882,0.164705882352941;0.654901960784314,0.537254901960784,0.168627450980392;0.662745098039216,0.549019607843137,0.172549019607843;0.670588235294118,0.556862745098039,0.180392156862745;0.674509803921569,0.568627450980392,0.184313725490196;0.682352941176471,0.576470588235294,0.188235294117647;0.690196078431373,0.588235294117647,0.192156862745098;0.698039215686275,0.596078431372549,0.200000000000000;0.705882352941177,0.607843137254902,0.203921568627451;0.713725490196078,0.615686274509804,0.207843137254902;0.721568627450980,0.627450980392157,0.211764705882353;0.729411764705882,0.635294117647059,0.219607843137255;0.733333333333333,0.647058823529412,0.223529411764706;0.741176470588235,0.654901960784314,0.227450980392157;0.749019607843137,0.666666666666667,0.231372549019608;0.756862745098039,0.674509803921569,0.239215686274510;0.764705882352941,0.686274509803922,0.243137254901961;0.772549019607843,0.694117647058824,0.247058823529412;0.780392156862745,0.705882352941177,0.250980392156863;0.788235294117647,0.713725490196078,0.258823529411765;0.792156862745098,0.725490196078431,0.262745098039216;0.800000000000000,0.733333333333333,0.266666666666667;0.807843137254902,0.745098039215686,0.270588235294118;0.815686274509804,0.752941176470588,0.278431372549020;0.823529411764706,0.764705882352941,0.282352941176471;0.831372549019608,0.772549019607843,0.286274509803922;0.839215686274510,0.784313725490196,0.290196078431373;0.847058823529412,0.792156862745098,0.298039215686275;0.850980392156863,0.803921568627451,0.301960784313725;0.858823529411765,0.811764705882353,0.305882352941177;0.866666666666667,0.823529411764706,0.309803921568627;0.874509803921569,0.831372549019608,0.317647058823529;0.882352941176471,0.843137254901961,0.321568627450980;0.890196078431373,0.850980392156863,0.325490196078431;0.898039215686275,0.862745098039216,0.329411764705882;0.905882352941177,0.870588235294118,0.337254901960784;0.909803921568627,0.882352941176471,0.341176470588235;0.917647058823529,0.890196078431373,0.345098039215686;0.925490196078431,0.901960784313726,0.349019607843137;0.933333333333333,0.909803921568627,0.356862745098039;0.941176470588235,0.921568627450980,0.360784313725490;0.949019607843137,0.929411764705882,0.364705882352941;0.956862745098039,0.941176470588235,0.368627450980392;0.964705882352941,0.949019607843137,0.376470588235294;0.968627450980392,0.960784313725490,0.380392156862745;0.976470588235294,0.968627450980392,0.384313725490196;0.984313725490196,0.980392156862745,0.388235294117647;0.992156862745098,0.988235294117647,0.396078431372549;0.992156862745098,0.988235294117647,0.396078431372549]; + [0.290196078431373,0.121568627450980,0.513725490196078;0.301960784313725,0.141176470588235,0.521568627450980;0.313725490196078,0.156862745098039,0.533333333333333;0.325490196078431,0.176470588235294,0.541176470588235;0.337254901960784,0.196078431372549,0.549019607843137;0.349019607843137,0.211764705882353,0.556862745098039;0.360784313725490,0.231372549019608,0.568627450980392;0.372549019607843,0.247058823529412,0.576470588235294;0.384313725490196,0.266666666666667,0.584313725490196;0.396078431372549,0.286274509803922,0.592156862745098;0.407843137254902,0.301960784313725,0.603921568627451;0.419607843137255,0.321568627450980,0.611764705882353;0.431372549019608,0.337254901960784,0.619607843137255;0.443137254901961,0.356862745098039,0.627450980392157;0.454901960784314,0.376470588235294,0.639215686274510;0.466666666666667,0.392156862745098,0.647058823529412;0.478431372549020,0.411764705882353,0.654901960784314;0.486274509803922,0.427450980392157,0.662745098039216;0.498039215686275,0.447058823529412,0.674509803921569;0.509803921568627,0.458823529411765,0.678431372549020;0.517647058823530,0.470588235294118,0.686274509803922;0.529411764705882,0.482352941176471,0.694117647058824;0.537254901960784,0.490196078431373,0.701960784313725;0.549019607843137,0.501960784313726,0.709803921568628;0.556862745098039,0.513725490196078,0.717647058823529;0.564705882352941,0.521568627450980,0.721568627450980;0.576470588235294,0.533333333333333,0.729411764705882;0.584313725490196,0.545098039215686,0.737254901960784;0.596078431372549,0.552941176470588,0.745098039215686;0.603921568627451,0.564705882352941,0.752941176470588;0.611764705882353,0.576470588235294,0.760784313725490;0.623529411764706,0.584313725490196,0.764705882352941;0.631372549019608,0.596078431372549,0.772549019607843;0.643137254901961,0.607843137254902,0.780392156862745;0.650980392156863,0.619607843137255,0.788235294117647;0.658823529411765,0.627450980392157,0.796078431372549;0.670588235294118,0.639215686274510,0.803921568627451;0.678431372549020,0.650980392156863,0.807843137254902;0.690196078431373,0.658823529411765,0.815686274509804;0.698039215686275,0.670588235294118,0.823529411764706;0.705882352941177,0.682352941176471,0.827450980392157;0.713725490196078,0.690196078431373,0.835294117647059;0.721568627450980,0.701960784313725,0.839215686274510;0.729411764705882,0.709803921568628,0.847058823529412;0.741176470588235,0.721568627450980,0.850980392156863;0.749019607843137,0.733333333333333,0.854901960784314;0.756862745098039,0.741176470588235,0.862745098039216;0.764705882352941,0.752941176470588,0.866666666666667;0.772549019607843,0.760784313725490,0.870588235294118;0.780392156862745,0.772549019607843,0.878431372549020;0.788235294117647,0.784313725490196,0.882352941176471;0.796078431372549,0.792156862745098,0.890196078431373;0.803921568627451,0.803921568627451,0.894117647058824;0.815686274509804,0.815686274509804,0.898039215686275;0.823529411764706,0.823529411764706,0.905882352941177;0.831372549019608,0.835294117647059,0.909803921568627;0.839215686274510,0.843137254901961,0.917647058823529;0.847058823529412,0.854901960784314,0.921568627450980;0.854901960784314,0.858823529411765,0.925490196078431;0.858823529411765,0.866666666666667,0.925490196078431;0.866666666666667,0.870588235294118,0.929411764705882;0.870588235294118,0.878431372549020,0.929411764705882;0.878431372549020,0.882352941176471,0.933333333333333;0.886274509803922,0.890196078431373,0.937254901960784;0.890196078431373,0.894117647058824,0.937254901960784;0.898039215686275,0.901960784313726,0.941176470588235;0.901960784313726,0.905882352941177,0.945098039215686;0.909803921568627,0.913725490196078,0.945098039215686;0.917647058823529,0.917647058823529,0.949019607843137;0.921568627450980,0.925490196078431,0.949019607843137;0.929411764705882,0.929411764705882,0.952941176470588;0.933333333333333,0.937254901960784,0.956862745098039;0.941176470588235,0.941176470588235,0.956862745098039;0.949019607843137,0.949019607843137,0.960784313725490;0.952941176470588,0.952941176470588,0.964705882352941;0.960784313725490,0.960784313725490,0.964705882352941;0.964705882352941,0.964705882352941,0.968627450980392;0.968627450980392,0.964705882352941,0.960784313725490;0.972549019607843,0.960784313725490,0.945098039215686;0.972549019607843,0.952941176470588,0.929411764705882;0.976470588235294,0.949019607843137,0.913725490196078;0.976470588235294,0.945098039215686,0.898039215686275;0.976470588235294,0.937254901960784,0.882352941176471;0.980392156862745,0.933333333333333,0.866666666666667;0.980392156862745,0.925490196078431,0.850980392156863;0.984313725490196,0.921568627450980,0.835294117647059;0.984313725490196,0.917647058823529,0.823529411764706;0.984313725490196,0.909803921568627,0.807843137254902;0.988235294117647,0.905882352941177,0.792156862745098;0.988235294117647,0.901960784313726,0.776470588235294;0.992156862745098,0.894117647058824,0.760784313725490;0.992156862745098,0.890196078431373,0.745098039215686;0.996078431372549,0.882352941176471,0.729411764705882;0.996078431372549,0.878431372549020,0.713725490196078;0.996078431372549,0.870588235294118,0.694117647058824;0.996078431372549,0.858823529411765,0.678431372549020;0.996078431372549,0.850980392156863,0.658823529411765;0.996078431372549,0.843137254901961,0.639215686274510;0.996078431372549,0.835294117647059,0.619607843137255;0.996078431372549,0.823529411764706,0.600000000000000;0.996078431372549,0.815686274509804,0.584313725490196;0.996078431372549,0.807843137254902,0.564705882352941;0.992156862745098,0.796078431372549,0.545098039215686;0.992156862745098,0.788235294117647,0.525490196078431;0.992156862745098,0.780392156862745,0.505882352941176;0.992156862745098,0.768627450980392,0.490196078431373;0.992156862745098,0.760784313725490,0.470588235294118;0.992156862745098,0.752941176470588,0.450980392156863;0.992156862745098,0.741176470588235,0.431372549019608;0.992156862745098,0.733333333333333,0.415686274509804;0.992156862745098,0.725490196078431,0.396078431372549;0.988235294117647,0.713725490196078,0.376470588235294;0.980392156862745,0.701960784313725,0.360784313725490;0.976470588235294,0.690196078431373,0.341176470588235;0.968627450980392,0.678431372549020,0.321568627450980;0.960784313725490,0.666666666666667,0.305882352941177;0.956862745098039,0.650980392156863,0.286274509803922;0.949019607843137,0.639215686274510,0.270588235294118;0.941176470588235,0.627450980392157,0.250980392156863;0.937254901960784,0.615686274509804,0.235294117647059;0.929411764705882,0.603921568627451,0.215686274509804;0.921568627450980,0.592156862745098,0.196078431372549;0.917647058823529,0.580392156862745,0.180392156862745;0.909803921568627,0.568627450980392,0.160784313725490;0.901960784313726,0.552941176470588,0.145098039215686;0.894117647058824,0.541176470588235,0.125490196078431;0.890196078431373,0.529411764705882,0.109803921568627;0.882352941176471,0.517647058823530,0.0901960784313726;0.874509803921569,0.505882352941176,0.0784313725490196;0.866666666666667,0.490196078431373,0.0745098039215686;0.854901960784314,0.474509803921569,0.0705882352941177;0.843137254901961,0.462745098039216,0.0666666666666667;0.835294117647059,0.447058823529412,0.0627450980392157;0.823529411764706,0.431372549019608,0.0588235294117647;0.815686274509804,0.419607843137255,0.0549019607843137;0.803921568627451,0.403921568627451,0.0509803921568627;0.792156862745098,0.388235294117647,0.0470588235294118;0.784313725490196,0.376470588235294,0.0431372549019608;0.772549019607843,0.360784313725490,0.0392156862745098;0.764705882352941,0.345098039215686,0.0352941176470588;0.752941176470588,0.329411764705882,0.0313725490196078;0.741176470588235,0.317647058823529,0.0274509803921569;0.733333333333333,0.301960784313725,0.0235294117647059;0.721568627450980,0.286274509803922,0.0196078431372549;0.713725490196078,0.274509803921569,0.0156862745098039;0.713725490196078,0.274509803921569,0.0156862745098039]; + [0.580392156862745,0.384313725490196,1;0.556862745098039,0.372549019607843,1;0.537254901960784,0.356862745098039,1;0.517647058823530,0.345098039215686,1;0.498039215686275,0.329411764705882,1;0.474509803921569,0.317647058823529,1;0.454901960784314,0.301960784313725,1;0.435294117647059,0.290196078431373,1;0.415686274509804,0.274509803921569,1;0.392156862745098,0.262745098039216,1;0.372549019607843,0.247058823529412,1;0.352941176470588,0.235294117647059,1;0.333333333333333,0.219607843137255,1;0.309803921568627,0.207843137254902,1;0.290196078431373,0.192156862745098,1;0.270588235294118,0.180392156862745,1;0.250980392156863,0.164705882352941,1;0.227450980392157,0.152941176470588,1;0.207843137254902,0.137254901960784,1;0.188235294117647,0.125490196078431,1;0.168627450980392,0.109803921568627,1;0.145098039215686,0.0980392156862745,1;0.125490196078431,0.0823529411764706,1;0.105882352941176,0.0705882352941177,1;0.0862745098039216,0.0549019607843137,1;0.0627450980392157,0.0431372549019608,1;0.0431372549019608,0.0274509803921569,1;0.0235294117647059,0.0156862745098039,1;0.00392156862745098,0,1;0,0.0313725490196078,0.968627450980392;0,0.0666666666666667,0.933333333333333;0,0.0980392156862745,0.901960784313726;0,0.133333333333333,0.866666666666667;0,0.168627450980392,0.831372549019608;0,0.203921568627451,0.796078431372549;0,0.235294117647059,0.764705882352941;0,0.270588235294118,0.729411764705882;0,0.305882352941177,0.694117647058824;0,0.341176470588235,0.658823529411765;0,0.376470588235294,0.623529411764706;0,0.407843137254902,0.592156862745098;0,0.443137254901961,0.556862745098039;0,0.478431372549020,0.521568627450980;0,0.513725490196078,0.486274509803922;0,0.545098039215686,0.454901960784314;0,0.580392156862745,0.419607843137255;0,0.615686274509804,0.384313725490196;0,0.650980392156863,0.349019607843137;0,0.682352941176471,0.317647058823529;0,0.717647058823529,0.282352941176471;0,0.752941176470588,0.247058823529412;0,0.788235294117647,0.211764705882353;0,0.819607843137255,0.180392156862745;0,0.854901960784314,0.145098039215686;0,0.890196078431373,0.109803921568627;0,0.925490196078431,0.0745098039215686;0,0.956862745098039,0.0431372549019608;0,0.992156862745098,0.00784313725490196;0.0274509803921569,1,0;0.0627450980392157,1,0;0.0980392156862745,1,0;0.129411764705882,1,0;0.164705882352941,1,0;0.200000000000000,1,0;0.235294117647059,1,0;0.266666666666667,1,0;0.301960784313725,1,0;0.337254901960784,1,0;0.372549019607843,1,0;0.403921568627451,1,0;0.439215686274510,1,0;0.474509803921569,1,0;0.509803921568627,1,0;0.541176470588235,1,0;0.576470588235294,1,0;0.611764705882353,1,0;0.647058823529412,1,0;0.682352941176471,1,0;0.713725490196078,1,0;0.749019607843137,1,0;0.784313725490196,1,0;0.819607843137255,1,0;0.850980392156863,1,0;0.886274509803922,1,0;0.921568627450980,1,0;0.956862745098039,1,0;0.988235294117647,1,0;1,0.984313725490196,0;1,0.964705882352941,0;1,0.945098039215686,0;1,0.925490196078431,0;1,0.901960784313726,0;1,0.882352941176471,0;1,0.862745098039216,0;1,0.843137254901961,0;1,0.819607843137255,0;1,0.800000000000000,0;1,0.780392156862745,0;1,0.756862745098039,0;1,0.737254901960784,0;1,0.717647058823529,0;1,0.698039215686275,0;1,0.674509803921569,0;1,0.654901960784314,0;1,0.635294117647059,0;1,0.615686274509804,0;1,0.592156862745098,0;1,0.572549019607843,0;1,0.552941176470588,0;1,0.533333333333333,0;1,0.509803921568627,0;1,0.490196078431373,0;1,0.470588235294118,0;1,0.450980392156863,0;1,0.427450980392157,0;1,0.407843137254902,0;1,0.392156862745098,0;1,0.376470588235294,0;1,0.364705882352941,0;1,0.349019607843137,0;1,0.337254901960784,0;1,0.321568627450980,0;1,0.309803921568627,0;1,0.294117647058824,0;1,0.282352941176471,0;1,0.266666666666667,0;1,0.254901960784314,0;1,0.239215686274510,0;1,0.227450980392157,0;1,0.211764705882353,0;1,0.200000000000000,0;1,0.184313725490196,0;1,0.172549019607843,0;1,0.156862745098039,0;1,0.145098039215686,0;1,0.129411764705882,0;1,0.117647058823529,0;1,0.101960784313725,0;1,0.0901960784313726,0;1,0.0745098039215686,0;1,0.0627450980392157,0;1,0.0470588235294118,0;1,0.0352941176470588,0;1,0.0196078431372549,0;1,0.00784313725490196,0;1,0.00784313725490196,0]; + [0,0,0.0313725490196078;0,0,0.0941176470588235;0,0,0.156862745098039;0,0,0.219607843137255;0,0,0.282352941176471;0,0,0.345098039215686;0,0,0.407843137254902;0,0,0.466666666666667;0,0,0.529411764705882;0,0,0.592156862745098;0,0,0.654901960784314;0,0,0.717647058823529;0,0,0.780392156862745;0,0,0.843137254901961;0,0,0.905882352941177;0,0,0.968627450980392;0,0.0235294117647059,1;0,0.0666666666666667,1;0,0.113725490196078,1;0,0.160784313725490,1;0,0.207843137254902,1;0,0.250980392156863,1;0,0.298039215686275,1;0,0.345098039215686,1;0,0.388235294117647,1;0,0.435294117647059,1;0,0.482352941176471,1;0,0.525490196078431,1;0,0.572549019607843,1;0,0.619607843137255,1;0,0.662745098039216,1;0,0.709803921568628,1;0,0.756862745098039,1;0,0.800000000000000,1;0,0.847058823529412,1;0,0.894117647058824,1;0,0.937254901960784,1;0,0.984313725490196,1;0,0.992156862745098,0.980392156862745;0,0.980392156862745,0.949019607843137;0,0.968627450980392,0.921568627450980;0,0.956862745098039,0.890196078431373;0,0.945098039215686,0.858823529411765;0,0.933333333333333,0.831372549019608;0,0.921568627450980,0.800000000000000;0,0.909803921568627,0.772549019607843;0,0.898039215686275,0.741176470588235;0,0.886274509803922,0.709803921568628;0,0.870588235294118,0.682352941176471;0,0.858823529411765,0.650980392156863;0,0.847058823529412,0.619607843137255;0,0.835294117647059,0.592156862745098;0,0.823529411764706,0.560784313725490;0,0.811764705882353,0.533333333333333;0,0.800000000000000,0.501960784313726;0,0.788235294117647,0.470588235294118;0,0.776470588235294,0.443137254901961;0,0.764705882352941,0.411764705882353;0,0.752941176470588,0.380392156862745;0,0.741176470588235,0.352941176470588;0,0.729411764705882,0.321568627450980;0,0.717647058823529,0.294117647058824;0,0.705882352941177,0.262745098039216;0,0.694117647058824,0.231372549019608;0,0.682352941176471,0.203921568627451;0,0.670588235294118,0.172549019607843;0,0.658823529411765,0.145098039215686;0,0.647058823529412,0.113725490196078;0,0.635294117647059,0.0823529411764706;0,0.619607843137255,0.0549019607843137;0,0.607843137254902,0.0235294117647059;0.0156862745098039,0.603921568627451,0;0.0823529411764706,0.631372549019608,0;0.152941176470588,0.658823529411765,0;0.219607843137255,0.686274509803922,0;0.290196078431373,0.713725490196078,0;0.356862745098039,0.741176470588235,0;0.427450980392157,0.768627450980392,0;0.494117647058824,0.800000000000000,0;0.564705882352941,0.827450980392157,0;0.631372549019608,0.854901960784314,0;0.701960784313725,0.882352941176471,0;0.768627450980392,0.909803921568627,0;0.839215686274510,0.937254901960784,0;0.905882352941177,0.964705882352941,0;0.976470588235294,0.992156862745098,0;1,0.980392156862745,0;1,0.945098039215686,0;1,0.913725490196078,0;1,0.878431372549020,0;1,0.847058823529412,0;1,0.815686274509804,0;1,0.780392156862745,0;1,0.749019607843137,0;1,0.717647058823529,0;1,0.682352941176471,0;1,0.650980392156863,0;1,0.619607843137255,0;1,0.584313725490196,0;1,0.552941176470588,0;1,0.521568627450980,0;1,0.486274509803922,0;1,0.454901960784314,0;1,0.423529411764706,0;1,0.388235294117647,0;1,0.356862745098039,0;1,0.325490196078431,0;1,0.290196078431373,0;1,0.258823529411765,0;1,0.227450980392157,0;1,0.192156862745098,0;1,0.160784313725490,0;1,0.129411764705882,0;1,0.0941176470588235,0;1,0.0627450980392157,0;1,0.0313725490196078,0;1,0.00392156862745098,0.00392156862745098;1,0.0470588235294118,0.0470588235294118;1,0.0901960784313726,0.0901960784313726;1,0.133333333333333,0.133333333333333;1,0.176470588235294,0.176470588235294;1,0.219607843137255,0.219607843137255;1,0.262745098039216,0.262745098039216;1,0.305882352941177,0.305882352941177;1,0.349019607843137,0.349019607843137;1,0.392156862745098,0.392156862745098;1,0.435294117647059,0.435294117647059;1,0.478431372549020,0.478431372549020;1,0.521568627450980,0.521568627450980;1,0.560784313725490,0.560784313725490;1,0.603921568627451,0.603921568627451;1,0.647058823529412,0.647058823529412;1,0.690196078431373,0.690196078431373;1,0.733333333333333,0.733333333333333;1,0.776470588235294,0.776470588235294;1,0.819607843137255,0.819607843137255;1,0.862745098039216,0.862745098039216;1,0.905882352941177,0.905882352941177;1,0.949019607843137,0.949019607843137;1,0.992156862745098,0.992156862745098;1,1,1;1,1,1;1,1,1;1,1,1;1,1,1;1,1,1]; + [0.474509803921569,0,0.529411764705882;0.478431372549020,0.00392156862745098,0.549019607843137;0.482352941176471,0.00784313725490196,0.568627450980392;0.486274509803922,0.00784313725490196,0.588235294117647;0.490196078431373,0.0117647058823529,0.607843137254902;0.498039215686275,0.0156862745098039,0.623529411764706;0.501960784313726,0.0156862745098039,0.647058823529412;0.505882352941176,0.0235294117647059,0.670588235294118;0.513725490196078,0.0392156862745098,0.698039215686275;0.517647058823530,0.0666666666666667,0.717647058823529;0.517647058823530,0.0941176470588235,0.741176470588235;0.517647058823530,0.117647058823529,0.756862745098039;0.513725490196078,0.141176470588235,0.780392156862745;0.513725490196078,0.164705882352941,0.800000000000000;0.509803921568627,0.184313725490196,0.815686274509804;0.505882352941176,0.203921568627451,0.835294117647059;0.501960784313726,0.219607843137255,0.850980392156863;0.498039215686275,0.235294117647059,0.866666666666667;0.494117647058824,0.254901960784314,0.882352941176471;0.490196078431373,0.270588235294118,0.898039215686275;0.482352941176471,0.286274509803922,0.917647058823529;0.474509803921569,0.305882352941177,0.937254901960784;0.466666666666667,0.321568627450980,0.952941176470588;0.458823529411765,0.337254901960784,0.968627450980392;0.447058823529412,0.349019607843137,0.980392156862745;0.439215686274510,0.360784313725490,0.988235294117647;0.435294117647059,0.372549019607843,0.988235294117647;0.427450980392157,0.388235294117647,0.992156862745098;0.419607843137255,0.400000000000000,0.996078431372549;0.411764705882353,0.411764705882353,0.996078431372549;0.407843137254902,0.427450980392157,1;0.403921568627451,0.443137254901961,0.996078431372549;0.400000000000000,0.458823529411765,0.988235294117647;0.392156862745098,0.470588235294118,0.980392156862745;0.388235294117647,0.486274509803922,0.972549019607843;0.380392156862745,0.501960784313726,0.960784313725490;0.372549019607843,0.517647058823530,0.952941176470588;0.364705882352941,0.525490196078431,0.945098039215686;0.356862745098039,0.537254901960784,0.933333333333333;0.349019607843137,0.549019607843137,0.921568627450980;0.337254901960784,0.556862745098039,0.913725490196078;0.329411764705882,0.572549019607843,0.898039215686275;0.321568627450980,0.584313725490196,0.886274509803922;0.313725490196078,0.596078431372549,0.874509803921569;0.305882352941177,0.603921568627451,0.866666666666667;0.298039215686275,0.615686274509804,0.854901960784314;0.290196078431373,0.627450980392157,0.843137254901961;0.282352941176471,0.639215686274510,0.831372549019608;0.270588235294118,0.650980392156863,0.815686274509804;0.258823529411765,0.666666666666667,0.796078431372549;0.250980392156863,0.674509803921569,0.780392156862745;0.243137254901961,0.686274509803922,0.768627450980392;0.235294117647059,0.694117647058824,0.756862745098039;0.227450980392157,0.701960784313725,0.741176470588235;0.223529411764706,0.709803921568628,0.729411764705882;0.215686274509804,0.717647058823529,0.713725490196078;0.223529411764706,0.725490196078431,0.698039215686275;0.227450980392157,0.737254901960784,0.682352941176471;0.231372549019608,0.745098039215686,0.670588235294118;0.239215686274510,0.752941176470588,0.654901960784314;0.243137254901961,0.756862745098039,0.639215686274510;0.250980392156863,0.764705882352941,0.619607843137255;0.254901960784314,0.772549019607843,0.603921568627451;0.262745098039216,0.780392156862745,0.584313725490196;0.270588235294118,0.788235294117647,0.564705882352941;0.274509803921569,0.796078431372549,0.549019607843137;0.278431372549020,0.800000000000000,0.533333333333333;0.282352941176471,0.807843137254902,0.517647058823530;0.286274509803922,0.815686274509804,0.501960784313726;0.294117647058824,0.823529411764706,0.482352941176471;0.298039215686275,0.827450980392157,0.466666666666667;0.301960784313725,0.831372549019608,0.447058823529412;0.309803921568627,0.839215686274510,0.435294117647059;0.313725490196078,0.843137254901961,0.419607843137255;0.313725490196078,0.843137254901961,0.403921568627451;0.321568627450980,0.850980392156863,0.392156862745098;0.329411764705882,0.858823529411765,0.368627450980392;0.341176470588235,0.866666666666667,0.349019607843137;0.345098039215686,0.870588235294118,0.333333333333333;0.349019607843137,0.874509803921569,0.321568627450980;0.352941176470588,0.882352941176471,0.309803921568627;0.356862745098039,0.886274509803922,0.298039215686275;0.364705882352941,0.890196078431373,0.282352941176471;0.376470588235294,0.894117647058824,0.278431372549020;0.388235294117647,0.898039215686275,0.282352941176471;0.407843137254902,0.905882352941177,0.286274509803922;0.423529411764706,0.905882352941177,0.290196078431373;0.439215686274510,0.909803921568627,0.294117647058824;0.454901960784314,0.913725490196078,0.301960784313725;0.478431372549020,0.913725490196078,0.305882352941177;0.501960784313726,0.913725490196078,0.309803921568627;0.525490196078431,0.921568627450980,0.313725490196078;0.541176470588235,0.921568627450980,0.317647058823529;0.560784313725490,0.921568627450980,0.321568627450980;0.584313725490196,0.925490196078431,0.325490196078431;0.603921568627451,0.925490196078431,0.329411764705882;0.623529411764706,0.925490196078431,0.329411764705882;0.643137254901961,0.925490196078431,0.333333333333333;0.654901960784314,0.925490196078431,0.337254901960784;0.670588235294118,0.925490196078431,0.337254901960784;0.682352941176471,0.925490196078431,0.337254901960784;0.698039215686275,0.925490196078431,0.341176470588235;0.713725490196078,0.925490196078431,0.341176470588235;0.725490196078431,0.925490196078431,0.345098039215686;0.737254901960784,0.925490196078431,0.345098039215686;0.749019607843137,0.925490196078431,0.349019607843137;0.760784313725490,0.925490196078431,0.349019607843137;0.780392156862745,0.925490196078431,0.352941176470588;0.792156862745098,0.925490196078431,0.352941176470588;0.803921568627451,0.925490196078431,0.352941176470588;0.815686274509804,0.921568627450980,0.356862745098039;0.823529411764706,0.913725490196078,0.356862745098039;0.831372549019608,0.905882352941177,0.356862745098039;0.835294117647059,0.901960784313726,0.356862745098039;0.843137254901961,0.890196078431373,0.360784313725490;0.850980392156863,0.882352941176471,0.360784313725490;0.854901960784314,0.874509803921569,0.360784313725490;0.862745098039216,0.866666666666667,0.360784313725490;0.866666666666667,0.858823529411765,0.360784313725490;0.874509803921569,0.847058823529412,0.360784313725490;0.882352941176471,0.839215686274510,0.360784313725490;0.890196078431373,0.827450980392157,0.364705882352941;0.894117647058824,0.819607843137255,0.364705882352941;0.901960784313726,0.811764705882353,0.364705882352941;0.909803921568627,0.800000000000000,0.364705882352941;0.921568627450980,0.780392156862745,0.364705882352941;0.937254901960784,0.764705882352941,0.368627450980392;0.949019607843137,0.749019607843137,0.368627450980392;0.952941176470588,0.733333333333333,0.368627450980392;0.956862745098039,0.713725490196078,0.364705882352941;0.960784313725490,0.701960784313725,0.364705882352941;0.960784313725490,0.682352941176471,0.364705882352941;0.964705882352941,0.662745098039216,0.360784313725490;0.968627450980392,0.647058823529412,0.360784313725490;0.968627450980392,0.627450980392157,0.360784313725490;0.972549019607843,0.607843137254902,0.356862745098039;0.976470588235294,0.596078431372549,0.356862745098039;0.980392156862745,0.576470588235294,0.352941176470588;0.980392156862745,0.556862745098039,0.352941176470588;0.984313725490196,0.541176470588235,0.352941176470588;0.988235294117647,0.525490196078431,0.352941176470588;0.988235294117647,0.509803921568627,0.352941176470588;0.992156862745098,0.486274509803922,0.349019607843137;0.996078431372549,0.474509803921569,0.349019607843137;0.996078431372549,0.454901960784314,0.349019607843137;0.996078431372549,0.454901960784314,0.349019607843137]; + [0.486274509803922,0.0117647058823529,0.572549019607843;0.490196078431373,0.0156862745098039,0.588235294117647;0.494117647058824,0.0235294117647059,0.603921568627451;0.501960784313726,0.0313725490196078,0.619607843137255;0.505882352941176,0.0352941176470588,0.639215686274510;0.513725490196078,0.0431372549019608,0.654901960784314;0.517647058823530,0.0470588235294118,0.674509803921569;0.521568627450980,0.0549019607843137,0.694117647058824;0.525490196078431,0.0627450980392157,0.709803921568628;0.525490196078431,0.0823529411764706,0.725490196078431;0.525490196078431,0.0980392156862745,0.741176470588235;0.525490196078431,0.113725490196078,0.756862745098039;0.525490196078431,0.133333333333333,0.768627450980392;0.525490196078431,0.149019607843137,0.780392156862745;0.521568627450980,0.164705882352941,0.796078431372549;0.517647058823530,0.176470588235294,0.807843137254902;0.517647058823530,0.192156862745098,0.823529411764706;0.513725490196078,0.203921568627451,0.835294117647059;0.509803921568627,0.219607843137255,0.850980392156863;0.509803921568627,0.231372549019608,0.862745098039216;0.505882352941176,0.243137254901961,0.870588235294118;0.498039215686275,0.254901960784314,0.886274509803922;0.498039215686275,0.266666666666667,0.898039215686275;0.494117647058824,0.278431372549020,0.909803921568627;0.486274509803922,0.290196078431373,0.921568627450980;0.478431372549020,0.305882352941177,0.937254901960784;0.470588235294118,0.317647058823529,0.949019607843137;0.462745098039216,0.329411764705882,0.960784313725490;0.454901960784314,0.337254901960784,0.968627450980392;0.450980392156863,0.345098039215686,0.976470588235294;0.447058823529412,0.356862745098039,0.984313725490196;0.443137254901961,0.364705882352941,0.988235294117647;0.435294117647059,0.372549019607843,0.988235294117647;0.431372549019608,0.384313725490196,0.992156862745098;0.427450980392157,0.392156862745098,0.996078431372549;0.419607843137255,0.403921568627451,0.996078431372549;0.415686274509804,0.411764705882353,0.996078431372549;0.407843137254902,0.423529411764706,1;0.407843137254902,0.435294117647059,1;0.407843137254902,0.447058823529412,0.996078431372549;0.400000000000000,0.454901960784314,0.988235294117647;0.396078431372549,0.466666666666667,0.984313725490196;0.392156862745098,0.474509803921569,0.976470588235294;0.384313725490196,0.486274509803922,0.968627450980392;0.380392156862745,0.501960784313726,0.960784313725490;0.372549019607843,0.513725490196078,0.952941176470588;0.364705882352941,0.521568627450980,0.945098039215686;0.360784313725490,0.529411764705882,0.941176470588235;0.352941176470588,0.537254901960784,0.933333333333333;0.349019607843137,0.545098039215686,0.925490196078431;0.345098039215686,0.552941176470588,0.917647058823529;0.337254901960784,0.560784313725490,0.909803921568627;0.333333333333333,0.568627450980392,0.901960784313726;0.325490196078431,0.580392156862745,0.890196078431373;0.317647058823529,0.588235294117647,0.882352941176471;0.313725490196078,0.596078431372549,0.874509803921569;0.305882352941177,0.603921568627451,0.866666666666667;0.301960784313725,0.615686274509804,0.854901960784314;0.294117647058824,0.623529411764706,0.847058823529412;0.286274509803922,0.631372549019608,0.839215686274510;0.282352941176471,0.639215686274510,0.831372549019608;0.274509803921569,0.647058823529412,0.823529411764706;0.266666666666667,0.658823529411765,0.807843137254902;0.258823529411765,0.666666666666667,0.796078431372549;0.250980392156863,0.674509803921569,0.784313725490196;0.247058823529412,0.682352941176471,0.776470588235294;0.243137254901961,0.686274509803922,0.764705882352941;0.235294117647059,0.694117647058824,0.752941176470588;0.231372549019608,0.701960784313725,0.745098039215686;0.223529411764706,0.709803921568628,0.733333333333333;0.219607843137255,0.713725490196078,0.721568627450980;0.215686274509804,0.717647058823529,0.709803921568628;0.219607843137255,0.725490196078431,0.701960784313725;0.223529411764706,0.733333333333333,0.690196078431373;0.227450980392157,0.737254901960784,0.678431372549020;0.231372549019608,0.745098039215686,0.666666666666667;0.235294117647059,0.749019607843137,0.658823529411765;0.239215686274510,0.752941176470588,0.647058823529412;0.243137254901961,0.756862745098039,0.631372549019608;0.247058823529412,0.760784313725490,0.619607843137255;0.254901960784314,0.768627450980392,0.607843137254902;0.258823529411765,0.776470588235294,0.592156862745098;0.262745098039216,0.780392156862745,0.576470588235294;0.266666666666667,0.788235294117647,0.564705882352941;0.270588235294118,0.792156862745098,0.556862745098039;0.274509803921569,0.800000000000000,0.541176470588235;0.274509803921569,0.800000000000000,0.529411764705882;0.278431372549020,0.803921568627451,0.517647058823530;0.286274509803922,0.811764705882353,0.505882352941176;0.290196078431373,0.819607843137255,0.494117647058824;0.290196078431373,0.819607843137255,0.482352941176471;0.298039215686275,0.827450980392157,0.470588235294118;0.301960784313725,0.831372549019608,0.454901960784314;0.301960784313725,0.835294117647059,0.443137254901961;0.305882352941177,0.839215686274510,0.431372549019608;0.309803921568627,0.843137254901961,0.419607843137255;0.313725490196078,0.843137254901961,0.407843137254902;0.317647058823529,0.847058823529412,0.396078431372549;0.321568627450980,0.850980392156863,0.384313725490196;0.329411764705882,0.858823529411765,0.368627450980392;0.337254901960784,0.862745098039216,0.352941176470588;0.345098039215686,0.870588235294118,0.341176470588235;0.345098039215686,0.870588235294118,0.329411764705882;0.349019607843137,0.874509803921569,0.321568627450980;0.352941176470588,0.882352941176471,0.313725490196078;0.356862745098039,0.886274509803922,0.301960784313725;0.356862745098039,0.886274509803922,0.294117647058824;0.364705882352941,0.894117647058824,0.282352941176471;0.372549019607843,0.898039215686275,0.278431372549020;0.384313725490196,0.898039215686275,0.278431372549020;0.392156862745098,0.901960784313726,0.282352941176471;0.403921568627451,0.905882352941177,0.286274509803922;0.415686274509804,0.905882352941177,0.290196078431373;0.427450980392157,0.909803921568627,0.294117647058824;0.439215686274510,0.909803921568627,0.298039215686275;0.454901960784314,0.909803921568627,0.298039215686275;0.462745098039216,0.913725490196078,0.301960784313725;0.482352941176471,0.913725490196078,0.309803921568627;0.501960784313726,0.917647058823529,0.309803921568627;0.521568627450980,0.921568627450980,0.313725490196078;0.533333333333333,0.921568627450980,0.317647058823529;0.549019607843137,0.921568627450980,0.321568627450980;0.564705882352941,0.921568627450980,0.321568627450980;0.580392156862745,0.925490196078431,0.325490196078431;0.596078431372549,0.925490196078431,0.329411764705882;0.611764705882353,0.925490196078431,0.329411764705882;0.627450980392157,0.925490196078431,0.333333333333333;0.639215686274510,0.925490196078431,0.333333333333333;0.647058823529412,0.925490196078431,0.333333333333333;0.658823529411765,0.925490196078431,0.337254901960784;0.670588235294118,0.925490196078431,0.337254901960784;0.682352941176471,0.925490196078431,0.337254901960784;0.690196078431373,0.925490196078431,0.341176470588235;0.701960784313725,0.925490196078431,0.341176470588235;0.709803921568628,0.925490196078431,0.341176470588235;0.717647058823529,0.925490196078431,0.345098039215686;0.725490196078431,0.925490196078431,0.345098039215686;0.741176470588235,0.925490196078431,0.349019607843137;0.752941176470588,0.925490196078431,0.349019607843137;0.760784313725490,0.925490196078431,0.349019607843137;0.772549019607843,0.925490196078431,0.352941176470588;0.784313725490196,0.925490196078431,0.352941176470588;0.792156862745098,0.925490196078431,0.352941176470588;0.800000000000000,0.925490196078431,0.352941176470588;0.807843137254902,0.925490196078431,0.352941176470588;0.815686274509804,0.921568627450980,0.356862745098039]; + [0.0313725490196078,0.0156862745098039,0.0274509803921569;0.0588235294117647,0.0156862745098039,0.0509803921568627;0.0745098039215686,0.0196078431372549,0.0666666666666667;0.0901960784313726,0.0274509803921569,0.0745098039215686;0.0980392156862745,0.0313725490196078,0.0823529411764706;0.109803921568627,0.0392156862745098,0.0941176470588235;0.117647058823529,0.0431372549019608,0.101960784313725;0.125490196078431,0.0470588235294118,0.109803921568627;0.137254901960784,0.0549019607843137,0.121568627450980;0.145098039215686,0.0588235294117647,0.125490196078431;0.152941176470588,0.0588235294117647,0.133333333333333;0.160784313725490,0.0666666666666667,0.141176470588235;0.164705882352941,0.0705882352941177,0.145098039215686;0.172549019607843,0.0745098039215686,0.152941176470588;0.180392156862745,0.0784313725490196,0.168627450980392;0.176470588235294,0.0823529411764706,0.200000000000000;0.176470588235294,0.0823529411764706,0.231372549019608;0.176470588235294,0.0862745098039216,0.258823529411765;0.176470588235294,0.0901960784313726,0.282352941176471;0.176470588235294,0.0941176470588235,0.305882352941177;0.176470588235294,0.0980392156862745,0.329411764705882;0.172549019607843,0.105882352941176,0.349019607843137;0.172549019607843,0.105882352941176,0.368627450980392;0.172549019607843,0.109803921568627,0.388235294117647;0.172549019607843,0.117647058823529,0.403921568627451;0.172549019607843,0.121568627450980,0.419607843137255;0.172549019607843,0.125490196078431,0.435294117647059;0.172549019607843,0.133333333333333,0.454901960784314;0.164705882352941,0.141176470588235,0.466666666666667;0.152941176470588,0.152941176470588,0.470588235294118;0.137254901960784,0.168627450980392,0.470588235294118;0.129411764705882,0.180392156862745,0.470588235294118;0.121568627450980,0.188235294117647,0.474509803921569;0.117647058823529,0.200000000000000,0.478431372549020;0.113725490196078,0.207843137254902,0.486274509803922;0.109803921568627,0.215686274509804,0.494117647058824;0.105882352941176,0.223529411764706,0.498039215686275;0.109803921568627,0.231372549019608,0.505882352941176;0.109803921568627,0.235294117647059,0.509803921568627;0.105882352941176,0.243137254901961,0.517647058823530;0.105882352941176,0.254901960784314,0.525490196078431;0.105882352941176,0.258823529411765,0.533333333333333;0.101960784313725,0.266666666666667,0.537254901960784;0.0941176470588235,0.278431372549020,0.529411764705882;0.0862745098039216,0.290196078431373,0.521568627450980;0.0745098039215686,0.301960784313725,0.509803921568627;0.0588235294117647,0.313725490196078,0.498039215686275;0.0470588235294118,0.325490196078431,0.486274509803922;0.0352941176470588,0.333333333333333,0.478431372549020;0.0313725490196078,0.345098039215686,0.466666666666667;0.0235294117647059,0.352941176470588,0.458823529411765;0.0196078431372549,0.364705882352941,0.450980392156863;0.0156862745098039,0.372549019607843,0.447058823529412;0.00784313725490196,0.380392156862745,0.435294117647059;0.00392156862745098,0.388235294117647,0.427450980392157;0,0.400000000000000,0.423529411764706;0,0.407843137254902,0.415686274509804;0,0.419607843137255,0.403921568627451;0,0.427450980392157,0.396078431372549;0,0.439215686274510,0.388235294117647;0,0.447058823529412,0.380392156862745;0,0.454901960784314,0.368627450980392;0,0.466666666666667,0.356862745098039;0,0.474509803921569,0.349019607843137;0,0.482352941176471,0.341176470588235;0,0.490196078431373,0.329411764705882;0,0.498039215686275,0.317647058823529;0,0.509803921568627,0.305882352941177;0,0.517647058823530,0.294117647058824;0,0.525490196078431,0.282352941176471;0,0.533333333333333,0.270588235294118;0,0.541176470588235,0.258823529411765;0,0.549019607843137,0.250980392156863;0,0.560784313725490,0.239215686274510;0,0.572549019607843,0.235294117647059;0,0.580392156862745,0.227450980392157;0,0.588235294117647,0.219607843137255;0,0.596078431372549,0.211764705882353;0,0.607843137254902,0.200000000000000;0,0.615686274509804,0.192156862745098;0,0.623529411764706,0.184313725490196;0,0.635294117647059,0.172549019607843;0,0.643137254901961,0.160784313725490;0,0.650980392156863,0.149019607843137;0,0.658823529411765,0.129411764705882;0,0.666666666666667,0.0784313725490196;0.0352941176470588,0.666666666666667,0.0352941176470588;0.0862745098039216,0.670588235294118,0;0.137254901960784,0.678431372549020,0;0.172549019607843,0.686274509803922,0;0.200000000000000,0.690196078431373,0;0.219607843137255,0.698039215686275,0;0.239215686274510,0.705882352941177,0;0.258823529411765,0.713725490196078,0;0.274509803921569,0.717647058823529,0;0.290196078431373,0.725490196078431,0;0.305882352941177,0.733333333333333,0;0.317647058823529,0.741176470588235,0;0.329411764705882,0.745098039215686,0;0.356862745098039,0.752941176470588,0;0.392156862745098,0.756862745098039,0;0.443137254901961,0.756862745098039,0;0.482352941176471,0.760784313725490,0;0.517647058823530,0.764705882352941,0;0.552941176470588,0.764705882352941,0;0.584313725490196,0.768627450980392,0;0.611764705882353,0.768627450980392,0;0.639215686274510,0.772549019607843,0;0.662745098039216,0.776470588235294,0;0.690196078431373,0.780392156862745,0;0.713725490196078,0.780392156862745,0;0.737254901960784,0.784313725490196,0;0.760784313725490,0.788235294117647,0;0.780392156862745,0.792156862745098,0;0.792156862745098,0.792156862745098,0.156862745098039;0.807843137254902,0.792156862745098,0.266666666666667;0.819607843137255,0.796078431372549,0.345098039215686;0.835294117647059,0.800000000000000,0.396078431372549;0.847058823529412,0.803921568627451,0.443137254901961;0.862745098039216,0.807843137254902,0.482352941176471;0.878431372549020,0.811764705882353,0.521568627450980;0.894117647058824,0.815686274509804,0.556862745098039;0.905882352941177,0.819607843137255,0.588235294117647;0.917647058823529,0.823529411764706,0.615686274509804;0.929411764705882,0.827450980392157,0.643137254901961;0.941176470588235,0.835294117647059,0.674509803921569;0.952941176470588,0.839215686274510,0.698039215686275;0.964705882352941,0.843137254901961,0.721568627450980;0.972549019607843,0.847058823529412,0.745098039215686;0.968627450980392,0.858823529411765,0.764705882352941;0.972549019607843,0.866666666666667,0.784313725490196;0.972549019607843,0.878431372549020,0.803921568627451;0.968627450980392,0.886274509803922,0.819607843137255;0.968627450980392,0.894117647058824,0.839215686274510;0.968627450980392,0.905882352941177,0.854901960784314;0.968627450980392,0.913725490196078,0.870588235294118;0.968627450980392,0.921568627450980,0.890196078431373;0.968627450980392,0.933333333333333,0.905882352941177;0.968627450980392,0.941176470588235,0.917647058823529;0.968627450980392,0.952941176470588,0.933333333333333;0.972549019607843,0.960784313725490,0.949019607843137;0.972549019607843,0.968627450980392,0.964705882352941;0.976470588235294,0.976470588235294,0.976470588235294;0.984313725490196,0.984313725490196,0.984313725490196;0.992156862745098,0.992156862745098,0.992156862745098;0.992156862745098,0.992156862745098,0.992156862745098]; + [0,0.0352941176470588,0.419607843137255;0,0.0705882352941177,0.443137254901961;0,0.101960784313725,0.462745098039216;0,0.137254901960784,0.482352941176471;0,0.172549019607843,0.501960784313726;0,0.207843137254902,0.525490196078431;0,0.239215686274510,0.545098039215686;0,0.274509803921569,0.564705882352941;0,0.309803921568627,0.584313725490196;0,0.345098039215686,0.607843137254902;0,0.376470588235294,0.627450980392157;0,0.411764705882353,0.647058823529412;0,0.447058823529412,0.666666666666667;0,0.482352941176471,0.690196078431373;0,0.513725490196078,0.709803921568628;0,0.549019607843137,0.729411764705882;0,0.584313725490196,0.749019607843137;0,0.619607843137255,0.772549019607843;0,0.650980392156863,0.792156862745098;0,0.686274509803922,0.811764705882353;0,0.721568627450980,0.831372549019608;0,0.756862745098039,0.854901960784314;0,0.792156862745098,0.874509803921569;0,0.823529411764706,0.894117647058824;0,0.858823529411765,0.913725490196078;0,0.894117647058824,0.937254901960784;0,0.929411764705882,0.956862745098039;0,0.960784313725490,0.976470588235294;0,0.996078431372549,0.996078431372549;0.0156862745098039,0.996078431372549,0.976470588235294;0.0352941176470588,0.988235294117647,0.949019607843137;0.0549019607843137,0.980392156862745,0.925490196078431;0.0745098039215686,0.976470588235294,0.898039215686275;0.0941176470588235,0.968627450980392,0.870588235294118;0.113725490196078,0.960784313725490,0.847058823529412;0.133333333333333,0.956862745098039,0.819607843137255;0.152941176470588,0.949019607843137,0.792156862745098;0.172549019607843,0.941176470588235,0.768627450980392;0.192156862745098,0.937254901960784,0.741176470588235;0.211764705882353,0.929411764705882,0.713725490196078;0.231372549019608,0.921568627450980,0.690196078431373;0.250980392156863,0.917647058823529,0.662745098039216;0.270588235294118,0.909803921568627,0.635294117647059;0.290196078431373,0.901960784313726,0.611764705882353;0.309803921568627,0.898039215686275,0.584313725490196;0.329411764705882,0.890196078431373,0.556862745098039;0.349019607843137,0.882352941176471,0.533333333333333;0.368627450980392,0.878431372549020,0.505882352941176;0.388235294117647,0.870588235294118,0.478431372549020;0.407843137254902,0.862745098039216,0.454901960784314;0.427450980392157,0.858823529411765,0.427450980392157;0.447058823529412,0.850980392156863,0.400000000000000;0.466666666666667,0.843137254901961,0.376470588235294;0.486274509803922,0.839215686274510,0.349019607843137;0.505882352941176,0.831372549019608,0.321568627450980;0.525490196078431,0.823529411764706,0.298039215686275;0.545098039215686,0.819607843137255,0.270588235294118;0.564705882352941,0.811764705882353,0.243137254901961;0.584313725490196,0.803921568627451,0.219607843137255;0.603921568627451,0.803921568627451,0.196078431372549;0.619607843137255,0.807843137254902,0.192156862745098;0.631372549019608,0.815686274509804,0.184313725490196;0.647058823529412,0.823529411764706,0.176470588235294;0.662745098039216,0.831372549019608,0.168627450980392;0.678431372549020,0.839215686274510,0.160784313725490;0.690196078431373,0.847058823529412,0.152941176470588;0.705882352941177,0.850980392156863,0.149019607843137;0.721568627450980,0.858823529411765,0.141176470588235;0.733333333333333,0.866666666666667,0.133333333333333;0.749019607843137,0.874509803921569,0.125490196078431;0.764705882352941,0.882352941176471,0.117647058823529;0.776470588235294,0.890196078431373,0.109803921568627;0.792156862745098,0.898039215686275,0.101960784313725;0.807843137254902,0.901960784313726,0.0980392156862745;0.823529411764706,0.909803921568627,0.0901960784313726;0.835294117647059,0.917647058823529,0.0823529411764706;0.850980392156863,0.925490196078431,0.0745098039215686;0.866666666666667,0.933333333333333,0.0666666666666667;0.878431372549020,0.941176470588235,0.0588235294117647;0.894117647058824,0.949019607843137,0.0509803921568627;0.909803921568627,0.952941176470588,0.0470588235294118;0.921568627450980,0.960784313725490,0.0392156862745098;0.937254901960784,0.968627450980392,0.0313725490196078;0.952941176470588,0.976470588235294,0.0235294117647059;0.964705882352941,0.984313725490196,0.0156862745098039;0.980392156862745,0.992156862745098,0.00784313725490196;0.996078431372549,0.996078431372549,0.00392156862745098;1,0.984313725490196,0;1,0.964705882352941,0;1,0.945098039215686,0;1,0.925490196078431,0;1,0.901960784313726,0;1,0.882352941176471,0;1,0.862745098039216,0;1,0.843137254901961,0;1,0.819607843137255,0;1,0.800000000000000,0;1,0.780392156862745,0;1,0.756862745098039,0;1,0.737254901960784,0;1,0.717647058823529,0;1,0.698039215686275,0;1,0.674509803921569,0;1,0.654901960784314,0;1,0.635294117647059,0;1,0.615686274509804,0;1,0.592156862745098,0;1,0.572549019607843,0;1,0.552941176470588,0;1,0.533333333333333,0;1,0.509803921568627,0;1,0.490196078431373,0;1,0.470588235294118,0;1,0.450980392156863,0;1,0.427450980392157,0;1,0.407843137254902,0;0.992156862745098,0.392156862745098,0;0.976470588235294,0.376470588235294,0;0.964705882352941,0.364705882352941,0;0.949019607843137,0.349019607843137,0;0.937254901960784,0.337254901960784,0;0.921568627450980,0.321568627450980,0;0.909803921568627,0.309803921568627,0;0.894117647058824,0.294117647058824,0;0.882352941176471,0.282352941176471,0;0.866666666666667,0.266666666666667,0;0.854901960784314,0.254901960784314,0;0.839215686274510,0.239215686274510,0;0.827450980392157,0.227450980392157,0;0.811764705882353,0.211764705882353,0;0.800000000000000,0.200000000000000,0;0.784313725490196,0.184313725490196,0;0.772549019607843,0.172549019607843,0;0.756862745098039,0.156862745098039,0;0.745098039215686,0.145098039215686,0;0.729411764705882,0.129411764705882,0;0.717647058823529,0.117647058823529,0;0.701960784313725,0.101960784313725,0;0.690196078431373,0.0901960784313726,0;0.674509803921569,0.0745098039215686,0;0.662745098039216,0.0627450980392157,0;0.647058823529412,0.0470588235294118,0;0.635294117647059,0.0352941176470588,0;0.619607843137255,0.0196078431372549,0;0.615686274509804,0.0156862745098039,0]; + [0.984313725490196,0,0.992156862745098;0.952941176470588,0,0.972549019607843;0.917647058823529,0,0.952941176470588;0.886274509803922,0,0.933333333333333;0.854901960784314,0,0.913725490196078;0.819607843137255,0,0.894117647058824;0.788235294117647,0,0.874509803921569;0.756862745098039,0,0.854901960784314;0.721568627450980,0,0.835294117647059;0.690196078431373,0,0.815686274509804;0.658823529411765,0,0.796078431372549;0.627450980392157,0,0.776470588235294;0.592156862745098,0,0.756862745098039;0.560784313725490,0,0.737254901960784;0.529411764705882,0,0.717647058823529;0.494117647058824,0,0.698039215686275;0.462745098039216,0,0.678431372549020;0.431372549019608,0,0.658823529411765;0.396078431372549,0,0.639215686274510;0.364705882352941,0,0.619607843137255;0.333333333333333,0,0.600000000000000;0.301960784313725,0,0.580392156862745;0.266666666666667,0,0.560784313725490;0.235294117647059,0,0.541176470588235;0.203921568627451,0,0.521568627450980;0.168627450980392,0,0.501960784313726;0.137254901960784,0,0.482352941176471;0.105882352941176,0,0.462745098039216;0.0705882352941177,0,0.443137254901961;0.0392156862745098,0,0.423529411764706;0.00784313725490196,0,0.403921568627451;0.00784313725490196,0.0156862745098039,0.411764705882353;0.0196078431372549,0.0392156862745098,0.427450980392157;0.0313725490196078,0.0588235294117647,0.447058823529412;0.0431372549019608,0.0823529411764706,0.462745098039216;0.0549019607843137,0.101960784313725,0.478431372549020;0.0627450980392157,0.125490196078431,0.494117647058824;0.0745098039215686,0.145098039215686,0.509803921568627;0.0862745098039216,0.164705882352941,0.529411764705882;0.0980392156862745,0.188235294117647,0.545098039215686;0.109803921568627,0.207843137254902,0.560784313725490;0.121568627450980,0.231372549019608,0.576470588235294;0.129411764705882,0.250980392156863,0.592156862745098;0.141176470588235,0.274509803921569,0.611764705882353;0.152941176470588,0.294117647058824,0.627450980392157;0.164705882352941,0.317647058823529,0.643137254901961;0.176470588235294,0.337254901960784,0.658823529411765;0.188235294117647,0.360784313725490,0.674509803921569;0.196078431372549,0.380392156862745,0.694117647058824;0.207843137254902,0.403921568627451,0.709803921568628;0.219607843137255,0.423529411764706,0.725490196078431;0.235294117647059,0.447058823529412,0.729411764705882;0.250980392156863,0.470588235294118,0.729411764705882;0.266666666666667,0.494117647058824,0.733333333333333;0.286274509803922,0.517647058823530,0.733333333333333;0.301960784313725,0.537254901960784,0.737254901960784;0.317647058823529,0.560784313725490,0.741176470588235;0.333333333333333,0.584313725490196,0.741176470588235;0.349019607843137,0.607843137254902,0.745098039215686;0.364705882352941,0.631372549019608,0.745098039215686;0.384313725490196,0.654901960784314,0.749019607843137;0.400000000000000,0.678431372549020,0.752941176470588;0.415686274509804,0.701960784313725,0.752941176470588;0.431372549019608,0.725490196078431,0.756862745098039;0.447058823529412,0.749019607843137,0.756862745098039;0.462745098039216,0.772549019607843,0.760784313725490;0.478431372549020,0.792156862745098,0.764705882352941;0.498039215686275,0.815686274509804,0.764705882352941;0.513725490196078,0.839215686274510,0.768627450980392;0.529411764705882,0.862745098039216,0.768627450980392;0.545098039215686,0.886274509803922,0.772549019607843;0.549019607843137,0.890196078431373,0.745098039215686;0.549019607843137,0.894117647058824,0.713725490196078;0.552941176470588,0.898039215686275,0.686274509803922;0.552941176470588,0.901960784313726,0.654901960784314;0.556862745098039,0.905882352941177,0.627450980392157;0.556862745098039,0.913725490196078,0.596078431372549;0.560784313725490,0.917647058823529,0.568627450980392;0.560784313725490,0.921568627450980,0.541176470588235;0.564705882352941,0.925490196078431,0.509803921568627;0.564705882352941,0.929411764705882,0.482352941176471;0.568627450980392,0.933333333333333,0.450980392156863;0.568627450980392,0.937254901960784,0.423529411764706;0.572549019607843,0.941176470588235,0.392156862745098;0.572549019607843,0.945098039215686,0.364705882352941;0.576470588235294,0.949019607843137,0.333333333333333;0.576470588235294,0.956862745098039,0.305882352941177;0.580392156862745,0.960784313725490,0.278431372549020;0.584313725490196,0.964705882352941,0.247058823529412;0.584313725490196,0.968627450980392,0.219607843137255;0.588235294117647,0.972549019607843,0.188235294117647;0.588235294117647,0.976470588235294,0.160784313725490;0.592156862745098,0.980392156862745,0.129411764705882;0.592156862745098,0.984313725490196,0.101960784313725;0.596078431372549,0.988235294117647,0.0745098039215686;0.596078431372549,0.992156862745098,0.0431372549019608;0.600000000000000,0.996078431372549,0.0156862745098039;0.607843137254902,0.996078431372549,0;0.623529411764706,0.992156862745098,0;0.639215686274510,0.988235294117647,0;0.658823529411765,0.984313725490196,0;0.674509803921569,0.980392156862745,0;0.690196078431373,0.976470588235294,0;0.705882352941177,0.972549019607843,0;0.721568627450980,0.968627450980392,0;0.737254901960784,0.964705882352941,0;0.756862745098039,0.960784313725490,0;0.772549019607843,0.956862745098039,0;0.788235294117647,0.952941176470588,0;0.803921568627451,0.949019607843137,0;0.819607843137255,0.945098039215686,0;0.835294117647059,0.941176470588235,0;0.854901960784314,0.937254901960784,0;0.870588235294118,0.933333333333333,0;0.886274509803922,0.929411764705882,0;0.901960784313726,0.925490196078431,0;0.917647058823529,0.921568627450980,0;0.933333333333333,0.917647058823529,0;0.952941176470588,0.913725490196078,0;0.968627450980392,0.909803921568627,0;0.984313725490196,0.905882352941177,0;1,0.901960784313726,0;1,0.862745098039216,0;1,0.827450980392157,0;1,0.788235294117647,0;1,0.752941176470588,0;1,0.713725490196078,0;1,0.674509803921569,0;1,0.639215686274510,0;1,0.600000000000000,0;1,0.564705882352941,0;1,0.525490196078431,0;1,0.490196078431373,0;1,0.450980392156863,0;1,0.411764705882353,0;1,0.376470588235294,0;1,0.337254901960784,0;1,0.301960784313725,0;1,0.262745098039216,0;1,0.223529411764706,0;1,0.188235294117647,0;1,0.149019607843137,0;1,0.113725490196078,0;1,0.0745098039215686,0;1,0.0392156862745098,0;1,0.0196078431372549,0]; + [0.262745098039216,0.0901960784313726,0.533333333333333;0.243137254901961,0.0784313725490196,0.529411764705882;0.223529411764706,0.0705882352941177,0.525490196078431;0.207843137254902,0.0627450980392157,0.521568627450980;0.188235294117647,0.0509803921568627,0.517647058823530;0.168627450980392,0.0431372549019608,0.513725490196078;0.152941176470588,0.0352941176470588,0.509803921568627;0.133333333333333,0.0274509803921569,0.505882352941176;0.121568627450980,0.0313725490196078,0.513725490196078;0.109803921568627,0.0352941176470588,0.517647058823530;0.0980392156862745,0.0392156862745098,0.521568627450980;0.0862745098039216,0.0431372549019608,0.529411764705882;0.0745098039215686,0.0470588235294118,0.533333333333333;0.0627450980392157,0.0509803921568627,0.541176470588235;0.0509803921568627,0.0549019607843137,0.545098039215686;0.0509803921568627,0.0666666666666667,0.549019607843137;0.0470588235294118,0.0745098039215686,0.552941176470588;0.0470588235294118,0.0862745098039216,0.560784313725490;0.0470588235294118,0.0980392156862745,0.564705882352941;0.0470588235294118,0.109803921568627,0.568627450980392;0.0431372549019608,0.117647058823529,0.572549019607843;0.0431372549019608,0.129411764705882,0.580392156862745;0.0431372549019608,0.149019607843137,0.588235294117647;0.0470588235294118,0.176470588235294,0.603921568627451;0.0470588235294118,0.200000000000000,0.615686274509804;0.0509803921568627,0.223529411764706,0.627450980392157;0.0549019607843137,0.250980392156863,0.639215686274510;0.0549019607843137,0.274509803921569,0.654901960784314;0.0588235294117647,0.298039215686275,0.666666666666667;0.0588235294117647,0.329411764705882,0.682352941176471;0.0627450980392157,0.360784313725490,0.705882352941177;0.0666666666666667,0.396078431372549,0.725490196078431;0.0705882352941177,0.431372549019608,0.749019607843137;0.0745098039215686,0.466666666666667,0.768627450980392;0.0745098039215686,0.501960784313726,0.792156862745098;0.0784313725490196,0.533333333333333,0.811764705882353;0.0823529411764706,0.568627450980392,0.827450980392157;0.0745098039215686,0.588235294117647,0.811764705882353;0.0666666666666667,0.611764705882353,0.796078431372549;0.0627450980392157,0.635294117647059,0.780392156862745;0.0549019607843137,0.654901960784314,0.764705882352941;0.0509803921568627,0.678431372549020,0.749019607843137;0.0431372549019608,0.701960784313725,0.733333333333333;0.0352941176470588,0.721568627450980,0.717647058823529;0.0392156862745098,0.701960784313725,0.650980392156863;0.0431372549019608,0.674509803921569,0.576470588235294;0.0431372549019608,0.647058823529412,0.501960784313726;0.0470588235294118,0.619607843137255,0.427450980392157;0.0509803921568627,0.592156862745098,0.356862745098039;0.0549019607843137,0.564705882352941,0.282352941176471;0.0588235294117647,0.537254901960784,0.207843137254902;0.0627450980392157,0.529411764705882,0.172549019607843;0.0705882352941177,0.537254901960784,0.168627450980392;0.0784313725490196,0.545098039215686,0.160784313725490;0.0862745098039216,0.552941176470588,0.156862745098039;0.0941176470588235,0.560784313725490,0.149019607843137;0.101960784313725,0.568627450980392,0.145098039215686;0.109803921568627,0.576470588235294,0.137254901960784;0.117647058823529,0.580392156862745,0.133333333333333;0.137254901960784,0.584313725490196,0.125490196078431;0.152941176470588,0.592156862745098,0.121568627450980;0.172549019607843,0.596078431372549,0.113725490196078;0.192156862745098,0.600000000000000,0.109803921568627;0.207843137254902,0.603921568627451,0.105882352941176;0.227450980392157,0.607843137254902,0.0980392156862745;0.243137254901961,0.611764705882353,0.0941176470588235;0.258823529411765,0.619607843137255,0.0901960784313726;0.274509803921569,0.627450980392157,0.0862745098039216;0.290196078431373,0.635294117647059,0.0862745098039216;0.309803921568627,0.643137254901961,0.0823529411764706;0.325490196078431,0.650980392156863,0.0784313725490196;0.341176470588235,0.658823529411765,0.0745098039215686;0.356862745098039,0.666666666666667,0.0705882352941177;0.384313725490196,0.674509803921569,0.0784313725490196;0.411764705882353,0.686274509803922,0.0862745098039216;0.443137254901961,0.698039215686275,0.0941176470588235;0.474509803921569,0.709803921568628,0.101960784313725;0.505882352941176,0.721568627450980,0.109803921568627;0.533333333333333,0.733333333333333,0.117647058823529;0.564705882352941,0.741176470588235,0.125490196078431;0.588235294117647,0.749019607843137,0.129411764705882;0.603921568627451,0.749019607843137,0.125490196078431;0.619607843137255,0.745098039215686,0.121568627450980;0.631372549019608,0.745098039215686,0.121568627450980;0.647058823529412,0.745098039215686,0.117647058823529;0.662745098039216,0.741176470588235,0.113725490196078;0.678431372549020,0.741176470588235,0.113725490196078;0.694117647058824,0.741176470588235,0.109803921568627;0.717647058823529,0.741176470588235,0.121568627450980;0.737254901960784,0.745098039215686,0.129411764705882;0.760784313725490,0.745098039215686,0.137254901960784;0.780392156862745,0.749019607843137,0.145098039215686;0.803921568627451,0.749019607843137,0.152941176470588;0.823529411764706,0.752941176470588,0.164705882352941;0.847058823529412,0.752941176470588,0.172549019607843;0.854901960784314,0.745098039215686,0.184313725490196;0.858823529411765,0.737254901960784,0.200000000000000;0.866666666666667,0.729411764705882,0.211764705882353;0.874509803921569,0.721568627450980,0.223529411764706;0.882352941176471,0.713725490196078,0.239215686274510;0.890196078431373,0.705882352941177,0.250980392156863;0.894117647058824,0.698039215686275,0.266666666666667;0.898039215686275,0.682352941176471,0.278431372549020;0.898039215686275,0.666666666666667,0.290196078431373;0.901960784313726,0.647058823529412,0.305882352941177;0.901960784313726,0.627450980392157,0.317647058823529;0.901960784313726,0.611764705882353,0.329411764705882;0.905882352941177,0.592156862745098,0.345098039215686;0.905882352941177,0.576470588235294,0.356862745098039;0.905882352941177,0.560784313725490,0.368627450980392;0.901960784313726,0.549019607843137,0.380392156862745;0.898039215686275,0.533333333333333,0.392156862745098;0.898039215686275,0.521568627450980,0.403921568627451;0.894117647058824,0.509803921568627,0.415686274509804;0.890196078431373,0.498039215686275,0.427450980392157;0.890196078431373,0.486274509803922,0.439215686274510;0.886274509803922,0.474509803921569,0.450980392156863;0.890196078431373,0.482352941176471,0.458823529411765;0.898039215686275,0.490196078431373,0.462745098039216;0.901960784313726,0.498039215686275,0.470588235294118;0.905882352941177,0.501960784313726,0.478431372549020;0.909803921568627,0.509803921568627,0.482352941176471;0.917647058823529,0.517647058823530,0.490196078431373;0.921568627450980,0.525490196078431,0.498039215686275;0.905882352941177,0.525490196078431,0.498039215686275;0.886274509803922,0.521568627450980,0.494117647058824;0.866666666666667,0.517647058823530,0.494117647058824;0.850980392156863,0.517647058823530,0.494117647058824;0.831372549019608,0.513725490196078,0.494117647058824;0.811764705882353,0.513725490196078,0.490196078431373;0.792156862745098,0.509803921568627,0.490196078431373;0.780392156862745,0.521568627450980,0.498039215686275;0.776470588235294,0.537254901960784,0.517647058823530;0.768627450980392,0.556862745098039,0.537254901960784;0.764705882352941,0.576470588235294,0.552941176470588;0.756862745098039,0.592156862745098,0.572549019607843;0.752941176470588,0.611764705882353,0.588235294117647;0.745098039215686,0.631372549019608,0.607843137254902;0.741176470588235,0.647058823529412,0.623529411764706;0.749019607843137,0.654901960784314,0.631372549019608;0.752941176470588,0.662745098039216,0.643137254901961;0.760784313725490,0.670588235294118,0.654901960784314;0.764705882352941,0.678431372549020,0.662745098039216;0.772549019607843,0.686274509803922,0.674509803921569;0.776470588235294,0.694117647058824,0.682352941176471;0.776470588235294,0.694117647058824,0.682352941176471]; + [0.800000000000000,0.600000000000000,0.803921568627451;0.800000000000000,0.600000000000000,0.811764705882353;0.800000000000000,0.600000000000000,0.819607843137255;0.800000000000000,0.600000000000000,0.827450980392157;0.800000000000000,0.600000000000000,0.835294117647059;0.800000000000000,0.600000000000000,0.847058823529412;0.800000000000000,0.600000000000000,0.854901960784314;0.800000000000000,0.600000000000000,0.862745098039216;0.800000000000000,0.600000000000000,0.870588235294118;0.800000000000000,0.600000000000000,0.878431372549020;0.800000000000000,0.600000000000000,0.886274509803922;0.800000000000000,0.600000000000000,0.894117647058824;0.800000000000000,0.600000000000000,0.901960784313726;0.800000000000000,0.600000000000000,0.909803921568627;0.800000000000000,0.600000000000000,0.917647058823529;0.800000000000000,0.600000000000000,0.925490196078431;0.800000000000000,0.600000000000000,0.937254901960784;0.800000000000000,0.600000000000000,0.945098039215686;0.800000000000000,0.600000000000000,0.952941176470588;0.800000000000000,0.600000000000000,0.960784313725490;0.800000000000000,0.600000000000000,0.968627450980392;0.800000000000000,0.600000000000000,0.976470588235294;0.800000000000000,0.600000000000000,0.984313725490196;0.800000000000000,0.600000000000000,0.992156862745098;0.796078431372549,0.600000000000000,1;0.772549019607843,0.600000000000000,1;0.749019607843137,0.600000000000000,1;0.725490196078431,0.600000000000000,1;0.698039215686275,0.600000000000000,1;0.674509803921569,0.600000000000000,1;0.650980392156863,0.600000000000000,1;0.627450980392157,0.600000000000000,1;0.603921568627451,0.600000000000000,1;0.580392156862745,0.600000000000000,1;0.552941176470588,0.600000000000000,1;0.529411764705882,0.600000000000000,1;0.505882352941176,0.600000000000000,1;0.482352941176471,0.600000000000000,1;0.458823529411765,0.600000000000000,1;0.431372549019608,0.600000000000000,1;0.407843137254902,0.600000000000000,1;0.403921568627451,0.611764705882353,1;0.415686274509804,0.631372549019608,1;0.423529411764706,0.647058823529412,1;0.431372549019608,0.666666666666667,1;0.443137254901961,0.682352941176471,1;0.450980392156863,0.701960784313725,1;0.458823529411765,0.721568627450980,1;0.470588235294118,0.737254901960784,1;0.478431372549020,0.756862745098039,1;0.486274509803922,0.772549019607843,1;0.494117647058824,0.792156862745098,1;0.505882352941176,0.807843137254902,1;0.513725490196078,0.827450980392157,1;0.521568627450980,0.847058823529412,1;0.533333333333333,0.862745098039216,1;0.541176470588235,0.882352941176471,1;0.549019607843137,0.898039215686275,1;0.560784313725490,0.917647058823529,1;0.568627450980392,0.937254901960784,1;0.576470588235294,0.952941176470588,1;0.584313725490196,0.972549019607843,1;0.596078431372549,0.988235294117647,1;0.600000000000000,1,0.976470588235294;0.600000000000000,1,0.921568627450980;0.600000000000000,1,0.862745098039216;0.600000000000000,1,0.807843137254902;0.600000000000000,1,0.752941176470588;0.600000000000000,1,0.698039215686275;0.600000000000000,1,0.643137254901961;0.600000000000000,1,0.584313725490196;0.600000000000000,1,0.529411764705882;0.600000000000000,1,0.474509803921569;0.600000000000000,1,0.419607843137255;0.600000000000000,1,0.360784313725490;0.600000000000000,1,0.305882352941177;0.600000000000000,1,0.250980392156863;0.600000000000000,1,0.196078431372549;0.600000000000000,1,0.137254901960784;0.600000000000000,1,0.0823529411764706;0.600000000000000,1,0.0274509803921569;0.607843137254902,1,0.0117647058823529;0.619607843137255,1,0.0392156862745098;0.631372549019608,1,0.0627450980392157;0.643137254901961,1,0.0901960784313726;0.658823529411765,1,0.113725490196078;0.670588235294118,1,0.141176470588235;0.682352941176471,1,0.164705882352941;0.694117647058824,1,0.192156862745098;0.709803921568628,1,0.215686274509804;0.721568627450980,1,0.239215686274510;0.733333333333333,1,0.266666666666667;0.745098039215686,1,0.290196078431373;0.756862745098039,1,0.317647058823529;0.772549019607843,1,0.341176470588235;0.784313725490196,1,0.368627450980392;0.796078431372549,1,0.392156862745098;0.807843137254902,1,0.407843137254902;0.819607843137255,1,0.419607843137255;0.831372549019608,1,0.431372549019608;0.843137254901961,1,0.443137254901961;0.850980392156863,1,0.450980392156863;0.862745098039216,1,0.462745098039216;0.874509803921569,1,0.474509803921569;0.886274509803922,1,0.486274509803922;0.898039215686275,1,0.498039215686275;0.909803921568627,1,0.509803921568627;0.921568627450980,1,0.521568627450980;0.929411764705882,1,0.529411764705882;0.941176470588235,1,0.541176470588235;0.952941176470588,1,0.552941176470588;0.964705882352941,1,0.564705882352941;0.976470588235294,1,0.576470588235294;0.988235294117647,1,0.588235294117647;0.996078431372549,1,0.596078431372549;1,0.992156862745098,0.576470588235294;1,0.980392156862745,0.545098039215686;1,0.972549019607843,0.513725490196078;1,0.960784313725490,0.482352941176471;1,0.949019607843137,0.450980392156863;1,0.941176470588235,0.419607843137255;1,0.929411764705882,0.388235294117647;1,0.917647058823529,0.356862745098039;1,0.909803921568627,0.325490196078431;1,0.898039215686275,0.294117647058824;1,0.886274509803922,0.262745098039216;1,0.878431372549020,0.235294117647059;1,0.866666666666667,0.203921568627451;1,0.858823529411765,0.172549019607843;1,0.847058823529412,0.141176470588235;1,0.835294117647059,0.109803921568627;1,0.827450980392157,0.0784313725490196;1,0.815686274509804,0.0470588235294118;1,0.803921568627451,0.0156862745098039;1,0.792156862745098,0.0156862745098039;1,0.772549019607843,0.0509803921568627;1,0.756862745098039,0.0862745098039216;1,0.741176470588235,0.121568627450980;1,0.721568627450980,0.156862745098039;1,0.705882352941177,0.192156862745098;1,0.686274509803922,0.227450980392157;1,0.670588235294118,0.258823529411765;1,0.650980392156863,0.294117647058824;1,0.635294117647059,0.329411764705882;1,0.615686274509804,0.364705882352941;1,0.615686274509804,0.364705882352941]; + [0.894117647058824,0.894117647058824,0.909803921568627;0.890196078431373,0.890196078431373,0.913725490196078;0.882352941176471,0.882352941176471,0.921568627450980;0.878431372549020,0.878431372549020,0.925490196078431;0.870588235294118,0.870588235294118,0.933333333333333;0.862745098039216,0.862745098039216,0.937254901960784;0.858823529411765,0.858823529411765,0.945098039215686;0.850980392156863,0.850980392156863,0.949019607843137;0.843137254901961,0.843137254901961,0.956862745098039;0.839215686274510,0.839215686274510,0.964705882352941;0.831372549019608,0.831372549019608,0.968627450980392;0.827450980392157,0.827450980392157,0.976470588235294;0.819607843137255,0.819607843137255,0.980392156862745;0.811764705882353,0.811764705882353,0.988235294117647;0.807843137254902,0.807843137254902,0.992156862745098;0.800000000000000,0.800000000000000,1;0.792156862745098,0.800000000000000,0.992156862745098;0.780392156862745,0.800000000000000,0.980392156862745;0.772549019607843,0.800000000000000,0.972549019607843;0.764705882352941,0.800000000000000,0.964705882352941;0.752941176470588,0.800000000000000,0.952941176470588;0.745098039215686,0.800000000000000,0.945098039215686;0.737254901960784,0.800000000000000,0.937254901960784;0.725490196078431,0.800000000000000,0.925490196078431;0.717647058823529,0.800000000000000,0.917647058823529;0.709803921568628,0.800000000000000,0.909803921568627;0.698039215686275,0.800000000000000,0.898039215686275;0.690196078431373,0.800000000000000,0.890196078431373;0.682352941176471,0.800000000000000,0.882352941176471;0.670588235294118,0.800000000000000,0.870588235294118;0.662745098039216,0.800000000000000,0.862745098039216;0.654901960784314,0.800000000000000,0.854901960784314;0.643137254901961,0.800000000000000,0.843137254901961;0.635294117647059,0.800000000000000,0.835294117647059;0.627450980392157,0.800000000000000,0.827450980392157;0.615686274509804,0.800000000000000,0.815686274509804;0.607843137254902,0.800000000000000,0.807843137254902;0.600000000000000,0.800000000000000,0.800000000000000;0.607843137254902,0.807843137254902,0.800000000000000;0.619607843137255,0.819607843137255,0.800000000000000;0.627450980392157,0.827450980392157,0.800000000000000;0.635294117647059,0.835294117647059,0.800000000000000;0.643137254901961,0.843137254901961,0.800000000000000;0.650980392156863,0.850980392156863,0.800000000000000;0.658823529411765,0.858823529411765,0.800000000000000;0.666666666666667,0.866666666666667,0.800000000000000;0.674509803921569,0.874509803921569,0.800000000000000;0.682352941176471,0.882352941176471,0.800000000000000;0.690196078431373,0.890196078431373,0.800000000000000;0.698039215686275,0.898039215686275,0.800000000000000;0.705882352941177,0.905882352941177,0.800000000000000;0.713725490196078,0.913725490196078,0.800000000000000;0.721568627450980,0.921568627450980,0.800000000000000;0.733333333333333,0.933333333333333,0.800000000000000;0.741176470588235,0.941176470588235,0.800000000000000;0.749019607843137,0.949019607843137,0.800000000000000;0.756862745098039,0.956862745098039,0.800000000000000;0.764705882352941,0.964705882352941,0.800000000000000;0.772549019607843,0.972549019607843,0.800000000000000;0.780392156862745,0.980392156862745,0.800000000000000;0.788235294117647,0.988235294117647,0.800000000000000;0.796078431372549,0.996078431372549,0.800000000000000;0.803921568627451,1,0.800000000000000;0.811764705882353,1,0.800000000000000;0.823529411764706,1,0.800000000000000;0.831372549019608,1,0.800000000000000;0.839215686274510,1,0.800000000000000;0.847058823529412,1,0.800000000000000;0.854901960784314,1,0.800000000000000;0.866666666666667,1,0.800000000000000;0.874509803921569,1,0.800000000000000;0.882352941176471,1,0.800000000000000;0.890196078431373,1,0.800000000000000;0.898039215686275,1,0.800000000000000;0.905882352941177,1,0.800000000000000;0.917647058823529,1,0.800000000000000;0.925490196078431,1,0.800000000000000;0.933333333333333,1,0.800000000000000;0.941176470588235,1,0.800000000000000;0.949019607843137,1,0.800000000000000;0.956862745098039,1,0.800000000000000;0.968627450980392,1,0.800000000000000;0.976470588235294,1,0.800000000000000;0.984313725490196,1,0.800000000000000;0.992156862745098,1,0.800000000000000;1,1,0.800000000000000;1,0.992156862745098,0.800000000000000;1,0.984313725490196,0.800000000000000;1,0.980392156862745,0.800000000000000;1,0.972549019607843,0.800000000000000;1,0.964705882352941,0.800000000000000;1,0.960784313725490,0.800000000000000;1,0.952941176470588,0.800000000000000;1,0.945098039215686,0.800000000000000;1,0.941176470588235,0.800000000000000;1,0.933333333333333,0.800000000000000;1,0.925490196078431,0.800000000000000;1,0.921568627450980,0.800000000000000;1,0.913725490196078,0.800000000000000;1,0.905882352941177,0.800000000000000;1,0.901960784313726,0.800000000000000;1,0.894117647058824,0.800000000000000;1,0.886274509803922,0.800000000000000;1,0.882352941176471,0.800000000000000;1,0.874509803921569,0.800000000000000;1,0.866666666666667,0.800000000000000;1,0.862745098039216,0.800000000000000;1,0.854901960784314,0.800000000000000;1,0.847058823529412,0.800000000000000;1,0.843137254901961,0.800000000000000;1,0.835294117647059,0.800000000000000;1,0.827450980392157,0.800000000000000;1,0.823529411764706,0.800000000000000;1,0.815686274509804,0.800000000000000;1,0.807843137254902,0.800000000000000;1,0.803921568627451,0.800000000000000;1,0.803921568627451,0.803921568627451;1,0.815686274509804,0.815686274509804;1,0.823529411764706,0.823529411764706;1,0.831372549019608,0.831372549019608;1,0.839215686274510,0.839215686274510;1,0.847058823529412,0.847058823529412;1,0.854901960784314,0.854901960784314;1,0.866666666666667,0.866666666666667;1,0.874509803921569,0.874509803921569;1,0.882352941176471,0.882352941176471;1,0.890196078431373,0.890196078431373;1,0.898039215686275,0.898039215686275;1,0.909803921568627,0.909803921568627;1,0.917647058823529,0.917647058823529;1,0.925490196078431,0.925490196078431;1,0.933333333333333,0.933333333333333;1,0.941176470588235,0.941176470588235;1,0.952941176470588,0.952941176470588;1,0.960784313725490,0.960784313725490;1,0.968627450980392,0.968627450980392;1,0.976470588235294,0.976470588235294;1,0.984313725490196,0.984313725490196;1,0.996078431372549,0.996078431372549;1,1,1;1,1,1;1,1,1;1,1,1;1,1,1;1,1,1]; + [0.0313725490196078,0.258823529411765,0.513725490196078;0.0313725490196078,0.266666666666667,0.521568627450980;0.0313725490196078,0.274509803921569,0.529411764705882;0.0313725490196078,0.282352941176471,0.541176470588235;0.0313725490196078,0.290196078431373,0.549019607843137;0.0313725490196078,0.298039215686275,0.556862745098039;0.0313725490196078,0.305882352941177,0.564705882352941;0.0313725490196078,0.313725490196078,0.572549019607843;0.0313725490196078,0.321568627450980,0.580392156862745;0.0313725490196078,0.329411764705882,0.588235294117647;0.0313725490196078,0.337254901960784,0.600000000000000;0.0313725490196078,0.345098039215686,0.607843137254902;0.0313725490196078,0.352941176470588,0.615686274509804;0.0313725490196078,0.360784313725490,0.623529411764706;0.0313725490196078,0.368627450980392,0.631372549019608;0.0313725490196078,0.376470588235294,0.639215686274510;0.0313725490196078,0.384313725490196,0.647058823529412;0.0313725490196078,0.392156862745098,0.658823529411765;0.0313725490196078,0.400000000000000,0.666666666666667;0.0313725490196078,0.407843137254902,0.674509803921569;0.0392156862745098,0.415686274509804,0.678431372549020;0.0509803921568627,0.423529411764706,0.682352941176471;0.0588235294117647,0.431372549019608,0.686274509803922;0.0666666666666667,0.439215686274510,0.690196078431373;0.0784313725490196,0.447058823529412,0.694117647058824;0.0862745098039216,0.454901960784314,0.698039215686275;0.0941176470588235,0.462745098039216,0.701960784313725;0.105882352941176,0.470588235294118,0.705882352941177;0.113725490196078,0.478431372549020,0.709803921568628;0.121568627450980,0.486274509803922,0.713725490196078;0.133333333333333,0.494117647058824,0.717647058823529;0.141176470588235,0.505882352941176,0.721568627450980;0.152941176470588,0.513725490196078,0.725490196078431;0.160784313725490,0.521568627450980,0.729411764705882;0.168627450980392,0.529411764705882,0.733333333333333;0.180392156862745,0.537254901960784,0.737254901960784;0.188235294117647,0.545098039215686,0.741176470588235;0.196078431372549,0.552941176470588,0.745098039215686;0.207843137254902,0.560784313725490,0.749019607843137;0.215686274509804,0.568627450980392,0.756862745098039;0.219607843137255,0.576470588235294,0.760784313725490;0.223529411764706,0.584313725490196,0.764705882352941;0.231372549019608,0.592156862745098,0.768627450980392;0.235294117647059,0.600000000000000,0.772549019607843;0.243137254901961,0.607843137254902,0.776470588235294;0.247058823529412,0.615686274509804,0.780392156862745;0.250980392156863,0.623529411764706,0.784313725490196;0.258823529411765,0.631372549019608,0.788235294117647;0.262745098039216,0.635294117647059,0.792156862745098;0.270588235294118,0.643137254901961,0.796078431372549;0.274509803921569,0.650980392156863,0.800000000000000;0.278431372549020,0.658823529411765,0.803921568627451;0.286274509803922,0.666666666666667,0.807843137254902;0.290196078431373,0.674509803921569,0.811764705882353;0.298039215686275,0.682352941176471,0.815686274509804;0.301960784313725,0.690196078431373,0.819607843137255;0.305882352941177,0.698039215686275,0.823529411764706;0.313725490196078,0.705882352941177,0.827450980392157;0.321568627450980,0.709803921568628,0.823529411764706;0.333333333333333,0.713725490196078,0.819607843137255;0.341176470588235,0.721568627450980,0.815686274509804;0.349019607843137,0.725490196078431,0.815686274509804;0.356862745098039,0.729411764705882,0.811764705882353;0.368627450980392,0.733333333333333,0.807843137254902;0.376470588235294,0.741176470588235,0.803921568627451;0.384313725490196,0.745098039215686,0.800000000000000;0.396078431372549,0.749019607843137,0.800000000000000;0.403921568627451,0.756862745098039,0.796078431372549;0.411764705882353,0.760784313725490,0.792156862745098;0.419607843137255,0.764705882352941,0.788235294117647;0.431372549019608,0.768627450980392,0.788235294117647;0.439215686274510,0.776470588235294,0.784313725490196;0.447058823529412,0.780392156862745,0.780392156862745;0.454901960784314,0.784313725490196,0.776470588235294;0.466666666666667,0.792156862745098,0.772549019607843;0.474509803921569,0.796078431372549,0.772549019607843;0.482352941176471,0.800000000000000,0.768627450980392;0.494117647058824,0.803921568627451,0.764705882352941;0.505882352941176,0.807843137254902,0.760784313725490;0.513725490196078,0.811764705882353,0.756862745098039;0.525490196078431,0.815686274509804,0.752941176470588;0.537254901960784,0.819607843137255,0.749019607843137;0.545098039215686,0.823529411764706,0.749019607843137;0.556862745098039,0.827450980392157,0.745098039215686;0.568627450980392,0.831372549019608,0.741176470588235;0.580392156862745,0.835294117647059,0.737254901960784;0.588235294117647,0.839215686274510,0.733333333333333;0.600000000000000,0.843137254901961,0.729411764705882;0.611764705882353,0.847058823529412,0.725490196078431;0.619607843137255,0.850980392156863,0.721568627450980;0.631372549019608,0.854901960784314,0.717647058823529;0.643137254901961,0.858823529411765,0.713725490196078;0.654901960784314,0.862745098039216,0.709803921568628;0.662745098039216,0.866666666666667,0.709803921568628;0.670588235294118,0.870588235294118,0.713725490196078;0.678431372549020,0.874509803921569,0.717647058823529;0.686274509803922,0.878431372549020,0.721568627450980;0.694117647058824,0.882352941176471,0.725490196078431;0.701960784313725,0.882352941176471,0.729411764705882;0.709803921568628,0.886274509803922,0.733333333333333;0.721568627450980,0.890196078431373,0.737254901960784;0.729411764705882,0.894117647058824,0.741176470588235;0.737254901960784,0.898039215686275,0.745098039215686;0.745098039215686,0.898039215686275,0.749019607843137;0.752941176470588,0.901960784313726,0.752941176470588;0.760784313725490,0.905882352941177,0.756862745098039;0.768627450980392,0.909803921568627,0.756862745098039;0.776470588235294,0.913725490196078,0.760784313725490;0.784313725490196,0.913725490196078,0.764705882352941;0.792156862745098,0.917647058823529,0.768627450980392;0.800000000000000,0.921568627450980,0.772549019607843;0.803921568627451,0.925490196078431,0.776470588235294;0.807843137254902,0.925490196078431,0.784313725490196;0.815686274509804,0.925490196078431,0.788235294117647;0.819607843137255,0.929411764705882,0.792156862745098;0.823529411764706,0.929411764705882,0.800000000000000;0.827450980392157,0.933333333333333,0.803921568627451;0.831372549019608,0.933333333333333,0.807843137254902;0.835294117647059,0.937254901960784,0.811764705882353;0.843137254901961,0.937254901960784,0.819607843137255;0.847058823529412,0.941176470588235,0.823529411764706;0.850980392156863,0.941176470588235,0.827450980392157;0.854901960784314,0.945098039215686,0.831372549019608;0.858823529411765,0.945098039215686,0.839215686274510;0.862745098039216,0.949019607843137,0.843137254901961;0.866666666666667,0.949019607843137,0.847058823529412;0.874509803921569,0.949019607843137,0.854901960784314;0.878431372549020,0.952941176470588,0.858823529411765;0.882352941176471,0.952941176470588,0.862745098039216;0.886274509803922,0.956862745098039,0.866666666666667;0.894117647058824,0.956862745098039,0.870588235294118;0.898039215686275,0.960784313725490,0.878431372549020;0.901960784313726,0.964705882352941,0.882352941176471;0.909803921568627,0.964705882352941,0.886274509803922;0.913725490196078,0.968627450980392,0.890196078431373;0.917647058823529,0.968627450980392,0.894117647058824;0.925490196078431,0.972549019607843,0.901960784313726;0.929411764705882,0.972549019607843,0.905882352941177;0.933333333333333,0.976470588235294,0.909803921568627;0.941176470588235,0.976470588235294,0.913725490196078;0.945098039215686,0.980392156862745,0.921568627450980;0.949019607843137,0.980392156862745,0.925490196078431;0.956862745098039,0.984313725490196,0.929411764705882;0.960784313725490,0.984313725490196,0.933333333333333;0.964705882352941,0.984313725490196,0.937254901960784]; + [0,0,0.0352941176470588;0,0,0.0705882352941177;0,0,0.101960784313725;0,0,0.137254901960784;0,0,0.172549019607843;0,0,0.207843137254902;0,0,0.239215686274510;0,0,0.274509803921569;0,0,0.309803921568627;0,0,0.345098039215686;0,0,0.376470588235294;0,0,0.411764705882353;0,0,0.447058823529412;0,0,0.482352941176471;0,0,0.513725490196078;0,0,0.549019607843137;0,0,0.584313725490196;0,0,0.619607843137255;0,0,0.650980392156863;0,0,0.686274509803922;0,0,0.721568627450980;0,0,0.756862745098039;0,0,0.792156862745098;0,0,0.823529411764706;0,0,0.858823529411765;0,0,0.894117647058824;0,0,0.929411764705882;0,0,0.960784313725490;0,0,0.996078431372549;0.0313725490196078,0,0.968627450980392;0.0666666666666667,0,0.933333333333333;0.0980392156862745,0,0.901960784313726;0.133333333333333,0,0.866666666666667;0.168627450980392,0,0.831372549019608;0.203921568627451,0,0.796078431372549;0.235294117647059,0,0.764705882352941;0.270588235294118,0,0.729411764705882;0.305882352941177,0,0.694117647058824;0.341176470588235,0,0.658823529411765;0.376470588235294,0,0.623529411764706;0.407843137254902,0,0.592156862745098;0.443137254901961,0,0.556862745098039;0.478431372549020,0,0.521568627450980;0.513725490196078,0,0.486274509803922;0.545098039215686,0,0.454901960784314;0.580392156862745,0,0.419607843137255;0.615686274509804,0,0.384313725490196;0.650980392156863,0,0.349019607843137;0.682352941176471,0,0.317647058823529;0.717647058823529,0,0.282352941176471;0.752941176470588,0,0.247058823529412;0.788235294117647,0,0.211764705882353;0.819607843137255,0,0.180392156862745;0.854901960784314,0,0.145098039215686;0.890196078431373,0,0.109803921568627;0.925490196078431,0,0.0745098039215686;0.956862745098039,0,0.0431372549019608;0.992156862745098,0,0.00784313725490196;0.972549019607843,0.0274509803921569,0;0.937254901960784,0.0627450980392157,0;0.901960784313726,0.0980392156862745,0;0.870588235294118,0.129411764705882,0;0.835294117647059,0.164705882352941,0;0.800000000000000,0.200000000000000,0;0.764705882352941,0.235294117647059,0;0.733333333333333,0.266666666666667,0;0.698039215686275,0.301960784313725,0;0.662745098039216,0.337254901960784,0;0.627450980392157,0.372549019607843,0;0.596078431372549,0.403921568627451,0;0.560784313725490,0.439215686274510,0;0.525490196078431,0.474509803921569,0;0.490196078431373,0.509803921568627,0;0.458823529411765,0.541176470588235,0;0.423529411764706,0.576470588235294,0;0.388235294117647,0.611764705882353,0;0.352941176470588,0.647058823529412,0;0.317647058823529,0.682352941176471,0;0.286274509803922,0.713725490196078,0;0.250980392156863,0.749019607843137,0;0.215686274509804,0.784313725490196,0;0.180392156862745,0.819607843137255,0;0.149019607843137,0.850980392156863,0;0.113725490196078,0.886274509803922,0;0.0784313725490196,0.921568627450980,0;0.0431372549019608,0.956862745098039,0;0.0117647058823529,0.988235294117647,0;0.0235294117647059,1,0;0.0588235294117647,1,0;0.0941176470588235,1,0;0.125490196078431,1,0;0.160784313725490,1,0;0.196078431372549,1,0;0.231372549019608,1,0;0.262745098039216,1,0;0.298039215686275,1,0;0.333333333333333,1,0;0.368627450980392,1,0;0.403921568627451,1,0;0.435294117647059,1,0;0.470588235294118,1,0;0.505882352941176,1,0;0.541176470588235,1,0;0.572549019607843,1,0;0.607843137254902,1,0;0.643137254901961,1,0;0.678431372549020,1,0;0.709803921568628,1,0;0.745098039215686,1,0;0.780392156862745,1,0;0.815686274509804,1,0;0.847058823529412,1,0;0.882352941176471,1,0;0.917647058823529,1,0;0.952941176470588,1,0;0.984313725490196,1,0;1,1,0.0196078431372549;1,1,0.0549019607843137;1,1,0.0901960784313726;1,1,0.125490196078431;1,1,0.156862745098039;1,1,0.192156862745098;1,1,0.227450980392157;1,1,0.262745098039216;1,1,0.294117647058824;1,1,0.329411764705882;1,1,0.364705882352941;1,1,0.400000000000000;1,1,0.431372549019608;1,1,0.466666666666667;1,1,0.501960784313726;1,1,0.537254901960784;1,1,0.568627450980392;1,1,0.603921568627451;1,1,0.639215686274510;1,1,0.674509803921569;1,1,0.709803921568628;1,1,0.741176470588235;1,1,0.776470588235294;1,1,0.811764705882353;1,1,0.847058823529412;1,1,0.878431372549020;1,1,0.913725490196078;1,1,0.949019607843137;1,1,0.964705882352941]; + [0.776470588235294,0.843137254901961,0.533333333333333;0.760784313725490,0.843137254901961,0.556862745098039;0.745098039215686,0.847058823529412,0.580392156862745;0.729411764705882,0.847058823529412,0.603921568627451;0.713725490196078,0.847058823529412,0.627450980392157;0.698039215686275,0.850980392156863,0.650980392156863;0.682352941176471,0.850980392156863,0.674509803921569;0.666666666666667,0.847058823529412,0.686274509803922;0.639215686274510,0.835294117647059,0.654901960784314;0.615686274509804,0.827450980392157,0.627450980392157;0.588235294117647,0.815686274509804,0.596078431372549;0.564705882352941,0.803921568627451,0.564705882352941;0.537254901960784,0.792156862745098,0.533333333333333;0.513725490196078,0.780392156862745,0.501960784313726;0.486274509803922,0.768627450980392,0.470588235294118;0.482352941176471,0.768627450980392,0.470588235294118;0.478431372549020,0.764705882352941,0.470588235294118;0.474509803921569,0.764705882352941,0.470588235294118;0.470588235294118,0.760784313725490,0.470588235294118;0.466666666666667,0.760784313725490,0.470588235294118;0.462745098039216,0.760784313725490,0.470588235294118;0.458823529411765,0.756862745098039,0.470588235294118;0.478431372549020,0.760784313725490,0.486274509803922;0.509803921568627,0.768627450980392,0.513725490196078;0.541176470588235,0.772549019607843,0.537254901960784;0.572549019607843,0.780392156862745,0.560784313725490;0.603921568627451,0.784313725490196,0.588235294117647;0.635294117647059,0.792156862745098,0.611764705882353;0.666666666666667,0.796078431372549,0.635294117647059;0.694117647058824,0.800000000000000,0.631372549019608;0.717647058823529,0.803921568627451,0.584313725490196;0.745098039215686,0.803921568627451,0.537254901960784;0.768627450980392,0.807843137254902,0.490196078431373;0.792156862745098,0.807843137254902,0.443137254901961;0.815686274509804,0.811764705882353,0.396078431372549;0.839215686274510,0.815686274509804,0.349019607843137;0.858823529411765,0.815686274509804,0.301960784313725;0.870588235294118,0.815686274509804,0.266666666666667;0.882352941176471,0.815686274509804,0.231372549019608;0.894117647058824,0.815686274509804,0.200000000000000;0.905882352941177,0.811764705882353,0.164705882352941;0.917647058823529,0.811764705882353,0.129411764705882;0.933333333333333,0.811764705882353,0.0941176470588235;0.945098039215686,0.811764705882353,0.0588235294117647;0.945098039215686,0.792156862745098,0.0470588235294118;0.945098039215686,0.772549019607843,0.0392156862745098;0.945098039215686,0.749019607843137,0.0352941176470588;0.949019607843137,0.729411764705882,0.0274509803921569;0.949019607843137,0.705882352941177,0.0196078431372549;0.949019607843137,0.686274509803922,0.0117647058823529;0.949019607843137,0.662745098039216,0.00392156862745098;0.933333333333333,0.650980392156863,0.00392156862745098;0.905882352941177,0.647058823529412,0.0117647058823529;0.878431372549020,0.643137254901961,0.0196078431372549;0.850980392156863,0.639215686274510,0.0235294117647059;0.827450980392157,0.635294117647059,0.0313725490196078;0.800000000000000,0.631372549019608,0.0392156862745098;0.772549019607843,0.627450980392157,0.0470588235294118;0.756862745098039,0.627450980392157,0.0666666666666667;0.764705882352941,0.647058823529412,0.121568627450980;0.776470588235294,0.662745098039216,0.172549019607843;0.788235294117647,0.682352941176471,0.227450980392157;0.796078431372549,0.701960784313725,0.282352941176471;0.807843137254902,0.717647058823529,0.333333333333333;0.815686274509804,0.737254901960784,0.388235294117647;0.827450980392157,0.752941176470588,0.439215686274510;0.843137254901961,0.768627450980392,0.466666666666667;0.858823529411765,0.784313725490196,0.494117647058824;0.874509803921569,0.796078431372549,0.517647058823530;0.890196078431373,0.811764705882353,0.545098039215686;0.905882352941177,0.827450980392157,0.572549019607843;0.921568627450980,0.839215686274510,0.600000000000000;0.937254901960784,0.854901960784314,0.623529411764706;0.945098039215686,0.866666666666667,0.643137254901961;0.952941176470588,0.874509803921569,0.658823529411765;0.960784313725490,0.882352941176471,0.678431372549020;0.964705882352941,0.894117647058824,0.694117647058824;0.972549019607843,0.901960784313726,0.709803921568628;0.976470588235294,0.909803921568627,0.729411764705882;0.984313725490196,0.921568627450980,0.745098039215686;0.988235294117647,0.929411764705882,0.764705882352941;0.984313725490196,0.937254901960784,0.788235294117647;0.984313725490196,0.945098039215686,0.807843137254902;0.980392156862745,0.952941176470588,0.831372549019608;0.980392156862745,0.960784313725490,0.854901960784314;0.976470588235294,0.968627450980392,0.878431372549020;0.972549019607843,0.972549019607843,0.898039215686275;0.968627450980392,0.980392156862745,0.917647058823529;0.960784313725490,0.984313725490196,0.929411764705882;0.949019607843137,0.984313725490196,0.937254901960784;0.941176470588235,0.988235294117647,0.945098039215686;0.929411764705882,0.988235294117647,0.952941176470588;0.917647058823529,0.992156862745098,0.960784313725490;0.909803921568627,0.992156862745098,0.972549019607843;0.898039215686275,0.996078431372549,0.980392156862745;0.894117647058824,0.996078431372549,0.980392156862745;0.886274509803922,0.996078431372549,0.984313725490196;0.882352941176471,0.996078431372549,0.984313725490196;0.878431372549020,1,0.988235294117647;0.870588235294118,1,0.988235294117647;0.866666666666667,1,0.988235294117647;0.858823529411765,1,0.992156862745098;0.858823529411765,1,0.992156862745098;0.854901960784314,0.996078431372549,0.992156862745098;0.850980392156863,0.996078431372549,0.992156862745098;0.847058823529412,0.992156862745098,0.988235294117647;0.847058823529412,0.988235294117647,0.988235294117647;0.843137254901961,0.988235294117647,0.988235294117647;0.839215686274510,0.984313725490196,0.988235294117647;0.831372549019608,0.984313725490196,0.988235294117647;0.815686274509804,0.980392156862745,0.984313725490196;0.800000000000000,0.976470588235294,0.980392156862745;0.784313725490196,0.972549019607843,0.980392156862745;0.764705882352941,0.968627450980392,0.976470588235294;0.749019607843137,0.964705882352941,0.972549019607843;0.733333333333333,0.960784313725490,0.972549019607843;0.713725490196078,0.956862745098039,0.968627450980392;0.678431372549020,0.945098039215686,0.964705882352941;0.639215686274510,0.933333333333333,0.960784313725490;0.603921568627451,0.921568627450980,0.956862745098039;0.568627450980392,0.913725490196078,0.956862745098039;0.529411764705882,0.901960784313726,0.952941176470588;0.494117647058824,0.890196078431373,0.949019607843137;0.458823529411765,0.878431372549020,0.945098039215686;0.411764705882353,0.862745098039216,0.945098039215686;0.364705882352941,0.843137254901961,0.941176470588235;0.321568627450980,0.823529411764706,0.941176470588235;0.274509803921569,0.803921568627451,0.941176470588235;0.227450980392157,0.784313725490196,0.941176470588235;0.180392156862745,0.764705882352941,0.937254901960784;0.133333333333333,0.745098039215686,0.937254901960784;0.105882352941176,0.721568627450980,0.937254901960784;0.0901960784313726,0.694117647058824,0.941176470588235;0.0745098039215686,0.666666666666667,0.945098039215686;0.0588235294117647,0.639215686274510,0.949019607843137;0.0431372549019608,0.611764705882353,0.952941176470588;0.0274509803921569,0.584313725490196,0.956862745098039;0.0117647058823529,0.556862745098039,0.956862745098039;0,0.529411764705882,0.960784313725490;0,0.498039215686275,0.964705882352941;0,0.466666666666667,0.968627450980392;0,0.435294117647059,0.968627450980392;0,0.407843137254902,0.972549019607843;0,0.376470588235294,0.976470588235294;0,0.345098039215686,0.976470588235294;0,0.329411764705882,0.980392156862745]; + [0.505882352941176,0.662745098039216,0.827450980392157;0.494117647058824,0.643137254901961,0.815686274509804;0.478431372549020,0.623529411764706,0.803921568627451;0.462745098039216,0.603921568627451,0.788235294117647;0.447058823529412,0.588235294117647,0.776470588235294;0.435294117647059,0.568627450980392,0.764705882352941;0.419607843137255,0.549019607843137,0.752941176470588;0.403921568627451,0.529411764705882,0.741176470588235;0.388235294117647,0.509803921568627,0.729411764705882;0.376470588235294,0.490196078431373,0.717647058823529;0.360784313725490,0.470588235294118,0.701960784313725;0.345098039215686,0.450980392156863,0.690196078431373;0.329411764705882,0.431372549019608,0.678431372549020;0.317647058823529,0.415686274509804,0.666666666666667;0.301960784313725,0.396078431372549,0.654901960784314;0.286274509803922,0.376470588235294,0.643137254901961;0.270588235294118,0.356862745098039,0.627450980392157;0.258823529411765,0.337254901960784,0.615686274509804;0.243137254901961,0.317647058823529,0.603921568627451;0.227450980392157,0.298039215686275,0.592156862745098;0.211764705882353,0.278431372549020,0.580392156862745;0.200000000000000,0.258823529411765,0.568627450980392;0.184313725490196,0.243137254901961,0.556862745098039;0.168627450980392,0.223529411764706,0.541176470588235;0.152941176470588,0.203921568627451,0.529411764705882;0.141176470588235,0.184313725490196,0.517647058823530;0.125490196078431,0.164705882352941,0.505882352941176;0.117647058823529,0.156862745098039,0.501960784313726;0.113725490196078,0.149019607843137,0.494117647058824;0.105882352941176,0.141176470588235,0.490196078431373;0.101960784313725,0.129411764705882,0.486274509803922;0.0941176470588235,0.121568627450980,0.478431372549020;0.0862745098039216,0.113725490196078,0.474509803921569;0.0823529411764706,0.105882352941176,0.466666666666667;0.0745098039215686,0.0980392156862745,0.462745098039216;0.0666666666666667,0.0901960784313726,0.458823529411765;0.0627450980392157,0.0823529411764706,0.450980392156863;0.0549019607843137,0.0745098039215686,0.447058823529412;0.0509803921568627,0.0627450980392157,0.443137254901961;0.0431372549019608,0.0549019607843137,0.435294117647059;0.0352941176470588,0.0470588235294118,0.431372549019608;0.0313725490196078,0.0392156862745098,0.423529411764706;0.0235294117647059,0.0313725490196078,0.419607843137255;0.0156862745098039,0.0235294117647059,0.415686274509804;0.0117647058823529,0.0156862745098039,0.407843137254902;0.00392156862745098,0.00784313725490196,0.403921568627451;0.0156862745098039,0.0117647058823529,0.396078431372549;0.0784313725490196,0.0588235294117647,0.380392156862745;0.141176470588235,0.105882352941176,0.364705882352941;0.203921568627451,0.152941176470588,0.349019607843137;0.266666666666667,0.200000000000000,0.333333333333333;0.329411764705882,0.247058823529412,0.317647058823529;0.392156862745098,0.294117647058824,0.301960784313725;0.454901960784314,0.341176470588235,0.286274509803922;0.517647058823530,0.388235294117647,0.270588235294118;0.580392156862745,0.435294117647059,0.254901960784314;0.643137254901961,0.482352941176471,0.239215686274510;0.705882352941177,0.529411764705882,0.223529411764706;0.768627450980392,0.576470588235294,0.207843137254902;0.792156862745098,0.576470588235294,0.192156862745098;0.776470588235294,0.533333333333333,0.176470588235294;0.764705882352941,0.490196078431373,0.164705882352941;0.749019607843137,0.443137254901961,0.149019607843137;0.733333333333333,0.400000000000000,0.133333333333333;0.717647058823529,0.356862745098039,0.117647058823529;0.701960784313725,0.309803921568627,0.101960784313725;0.690196078431373,0.266666666666667,0.0901960784313726;0.674509803921569,0.223529411764706,0.0745098039215686;0.658823529411765,0.176470588235294,0.0588235294117647;0.643137254901961,0.133333333333333,0.0431372549019608;0.631372549019608,0.0901960784313726,0.0313725490196078;0.615686274509804,0.0431372549019608,0.0156862745098039;0.600000000000000,0,0;0.603921568627451,0.00392156862745098,0;0.611764705882353,0.0117647058823529,0;0.615686274509804,0.0156862745098039,0;0.619607843137255,0.0196078431372549,0;0.627450980392157,0.0274509803921569,0;0.631372549019608,0.0313725490196078,0;0.635294117647059,0.0352941176470588,0;0.643137254901961,0.0431372549019608,0;0.647058823529412,0.0470588235294118,0;0.650980392156863,0.0509803921568627,0;0.654901960784314,0.0549019607843137,0;0.662745098039216,0.0627450980392157,0;0.666666666666667,0.0666666666666667,0;0.670588235294118,0.0705882352941177,0;0.678431372549020,0.0784313725490196,0;0.682352941176471,0.0823529411764706,0;0.686274509803922,0.0862745098039216,0;0.694117647058824,0.0941176470588235,0;0.698039215686275,0.0980392156862745,0;0.701960784313725,0.101960784313725,0;0.709803921568628,0.109803921568627,0;0.713725490196078,0.113725490196078,0;0.725490196078431,0.125490196078431,0;0.737254901960784,0.137254901960784,0;0.749019607843137,0.149019607843137,0;0.760784313725490,0.160784313725490,0;0.772549019607843,0.172549019607843,0;0.784313725490196,0.184313725490196,0;0.796078431372549,0.196078431372549,0;0.807843137254902,0.207843137254902,0;0.819607843137255,0.219607843137255,0;0.831372549019608,0.231372549019608,0;0.843137254901961,0.243137254901961,0;0.854901960784314,0.254901960784314,0;0.870588235294118,0.270588235294118,0;0.882352941176471,0.282352941176471,0;0.894117647058824,0.294117647058824,0;0.905882352941177,0.305882352941177,0;0.917647058823529,0.317647058823529,0;0.929411764705882,0.329411764705882,0;0.941176470588235,0.341176470588235,0;0.952941176470588,0.352941176470588,0;0.964705882352941,0.364705882352941,0;0.976470588235294,0.376470588235294,0;0.988235294117647,0.388235294117647,0;1,0.400000000000000,0;1,0.423529411764706,0;1,0.447058823529412,0;1,0.466666666666667,0;1,0.490196078431373,0;1,0.513725490196078,0;1,0.537254901960784,0;1,0.556862745098039,0;1,0.580392156862745,0;1,0.603921568627451,0;1,0.627450980392157,0;1,0.650980392156863,0;1,0.670588235294118,0;1,0.694117647058824,0;1,0.717647058823529,0;1,0.741176470588235,0;1,0.760784313725490,0;1,0.784313725490196,0;1,0.807843137254902,0;1,0.831372549019608,0;1,0.850980392156863,0;1,0.874509803921569,0;1,0.898039215686275,0;1,0.921568627450980,0;1,0.945098039215686,0;1,0.964705882352941,0;1,0.976470588235294,0]; + [0.403921568627451,0.403921568627451,0.403921568627451;0.411764705882353,0.411764705882353,0.411764705882353;0.415686274509804,0.415686274509804,0.415686274509804;0.423529411764706,0.423529411764706,0.423529411764706;0.427450980392157,0.427450980392157,0.427450980392157;0.431372549019608,0.431372549019608,0.431372549019608;0.439215686274510,0.439215686274510,0.439215686274510;0.443137254901961,0.443137254901961,0.443137254901961;0.450980392156863,0.450980392156863,0.450980392156863;0.454901960784314,0.454901960784314,0.454901960784314;0.458823529411765,0.458823529411765,0.458823529411765;0.466666666666667,0.466666666666667,0.466666666666667;0.470588235294118,0.470588235294118,0.470588235294118;0.478431372549020,0.478431372549020,0.478431372549020;0.482352941176471,0.482352941176471,0.482352941176471;0.486274509803922,0.486274509803922,0.486274509803922;0.494117647058824,0.494117647058824,0.494117647058824;0.498039215686275,0.498039215686275,0.498039215686275;0.505882352941176,0.505882352941176,0.505882352941176;0.509803921568627,0.509803921568627,0.509803921568627;0.513725490196078,0.513725490196078,0.513725490196078;0.521568627450980,0.521568627450980,0.521568627450980;0.525490196078431,0.525490196078431,0.525490196078431;0.533333333333333,0.533333333333333,0.533333333333333;0.537254901960784,0.537254901960784,0.537254901960784;0.541176470588235,0.541176470588235,0.541176470588235;0.549019607843137,0.549019607843137,0.549019607843137;0.552941176470588,0.552941176470588,0.552941176470588;0.560784313725490,0.560784313725490,0.560784313725490;0.564705882352941,0.564705882352941,0.564705882352941;0.568627450980392,0.568627450980392,0.568627450980392;0.576470588235294,0.576470588235294,0.576470588235294;0.580392156862745,0.580392156862745,0.580392156862745;0.588235294117647,0.588235294117647,0.588235294117647;0.592156862745098,0.592156862745098,0.592156862745098;0.596078431372549,0.596078431372549,0.596078431372549;0.603921568627451,0.603921568627451,0.603921568627451;0.607843137254902,0.607843137254902,0.607843137254902;0.615686274509804,0.615686274509804,0.615686274509804;0.619607843137255,0.619607843137255,0.619607843137255;0.623529411764706,0.623529411764706,0.623529411764706;0.631372549019608,0.631372549019608,0.631372549019608;0.635294117647059,0.635294117647059,0.635294117647059;0.643137254901961,0.643137254901961,0.643137254901961;0.647058823529412,0.647058823529412,0.647058823529412;0.650980392156863,0.650980392156863,0.650980392156863;0.658823529411765,0.658823529411765,0.658823529411765;0.662745098039216,0.662745098039216,0.662745098039216;0.670588235294118,0.670588235294118,0.670588235294118;0.674509803921569,0.674509803921569,0.674509803921569;0.682352941176471,0.682352941176471,0.682352941176471;0.686274509803922,0.686274509803922,0.686274509803922;0.690196078431373,0.690196078431373,0.690196078431373;0.698039215686275,0.698039215686275,0.698039215686275;0.701960784313725,0.701960784313725,0.701960784313725;0.709803921568628,0.709803921568628,0.709803921568628;0.713725490196078,0.713725490196078,0.713725490196078;0.717647058823529,0.717647058823529,0.717647058823529;0.725490196078431,0.725490196078431,0.725490196078431;0.729411764705882,0.729411764705882,0.729411764705882;0.737254901960784,0.737254901960784,0.737254901960784;0.741176470588235,0.741176470588235,0.741176470588235;0.745098039215686,0.745098039215686,0.745098039215686;0.752941176470588,0.752941176470588,0.752941176470588;0.756862745098039,0.756862745098039,0.756862745098039;0.764705882352941,0.764705882352941,0.764705882352941;0.768627450980392,0.768627450980392,0.768627450980392;0.772549019607843,0.772549019607843,0.772549019607843;0.780392156862745,0.780392156862745,0.780392156862745;0.784313725490196,0.784313725490196,0.784313725490196;0.792156862745098,0.792156862745098,0.792156862745098;0.796078431372549,0.796078431372549,0.796078431372549;0.800000000000000,0.800000000000000,0.796078431372549;0.803921568627451,0.803921568627451,0.784313725490196;0.807843137254902,0.807843137254902,0.776470588235294;0.807843137254902,0.807843137254902,0.764705882352941;0.811764705882353,0.811764705882353,0.752941176470588;0.815686274509804,0.815686274509804,0.741176470588235;0.815686274509804,0.815686274509804,0.729411764705882;0.819607843137255,0.819607843137255,0.721568627450980;0.823529411764706,0.823529411764706,0.709803921568628;0.823529411764706,0.823529411764706,0.698039215686275;0.827450980392157,0.827450980392157,0.686274509803922;0.831372549019608,0.831372549019608,0.674509803921569;0.835294117647059,0.835294117647059,0.666666666666667;0.835294117647059,0.835294117647059,0.654901960784314;0.839215686274510,0.839215686274510,0.643137254901961;0.843137254901961,0.843137254901961,0.631372549019608;0.843137254901961,0.843137254901961,0.619607843137255;0.847058823529412,0.847058823529412,0.611764705882353;0.850980392156863,0.850980392156863,0.600000000000000;0.850980392156863,0.850980392156863,0.588235294117647;0.854901960784314,0.854901960784314,0.576470588235294;0.858823529411765,0.858823529411765,0.564705882352941;0.862745098039216,0.862745098039216,0.556862745098039;0.862745098039216,0.862745098039216,0.545098039215686;0.866666666666667,0.866666666666667,0.533333333333333;0.870588235294118,0.870588235294118,0.521568627450980;0.870588235294118,0.870588235294118,0.509803921568627;0.874509803921569,0.874509803921569,0.501960784313726;0.878431372549020,0.878431372549020,0.490196078431373;0.882352941176471,0.882352941176471,0.478431372549020;0.882352941176471,0.882352941176471,0.466666666666667;0.886274509803922,0.886274509803922,0.454901960784314;0.890196078431373,0.890196078431373,0.447058823529412;0.890196078431373,0.890196078431373,0.435294117647059;0.894117647058824,0.894117647058824,0.423529411764706;0.898039215686275,0.898039215686275,0.411764705882353;0.898039215686275,0.898039215686275,0.400000000000000;0.901960784313726,0.901960784313726,0.392156862745098;0.905882352941177,0.905882352941177,0.380392156862745;0.909803921568627,0.909803921568627,0.368627450980392;0.909803921568627,0.909803921568627,0.356862745098039;0.913725490196078,0.913725490196078,0.345098039215686;0.917647058823529,0.917647058823529,0.337254901960784;0.917647058823529,0.917647058823529,0.325490196078431;0.921568627450980,0.921568627450980,0.313725490196078;0.925490196078431,0.925490196078431,0.301960784313725;0.925490196078431,0.925490196078431,0.290196078431373;0.929411764705882,0.929411764705882,0.282352941176471;0.933333333333333,0.933333333333333,0.270588235294118;0.937254901960784,0.937254901960784,0.258823529411765;0.937254901960784,0.937254901960784,0.247058823529412;0.941176470588235,0.941176470588235,0.235294117647059;0.945098039215686,0.945098039215686,0.223529411764706;0.945098039215686,0.945098039215686,0.215686274509804;0.949019607843137,0.949019607843137,0.203921568627451;0.952941176470588,0.952941176470588,0.192156862745098;0.952941176470588,0.952941176470588,0.180392156862745;0.956862745098039,0.956862745098039,0.168627450980392;0.960784313725490,0.960784313725490,0.160784313725490;0.964705882352941,0.964705882352941,0.149019607843137;0.964705882352941,0.964705882352941,0.137254901960784;0.968627450980392,0.968627450980392,0.125490196078431;0.972549019607843,0.972549019607843,0.113725490196078;0.972549019607843,0.972549019607843,0.105882352941176;0.976470588235294,0.976470588235294,0.0941176470588235;0.980392156862745,0.980392156862745,0.0823529411764706;0.980392156862745,0.980392156862745,0.0705882352941177;0.984313725490196,0.984313725490196,0.0588235294117647;0.988235294117647,0.988235294117647,0.0509803921568627;0.992156862745098,0.992156862745098,0.0392156862745098;0.992156862745098,0.992156862745098,0.0274509803921569;0.996078431372549,0.996078431372549,0.0156862745098039;0.996078431372549,0.996078431372549,0.0117647058823529]; + }; + +if length(wxk) == 1 + if wxk > 270 +% N = size(get(gcf,'colormap'),1); + N = 64; + C0 = scheme; + wxk = wxk - 270; + C = C0{wxk,1}; + num = size(C,1); + vec = linspace(0,num+1,N+2); + map = interp1(1:num,C,vec(2:end-1),'linear','extrap'); %...²åÖµ + map = max(0,min(1,map)); + elseif wxk>=1 && wxk<=270 + C0 = morecolor; + map = C0(wxk,:); + end + +elseif length(wxk)>1 + if any(wxk>270) + assert('Each number should be <= 270.') + else + C0 = morecolor; + map = C0(wxk,:); + end +end +end + +%%%%%%%%%%%%%%%%%%%%%%%%%% +% ÖÆ×÷£º °¢À¥ %%% +% ¹«Öںţº°¢À¥µÄ¿ÆÑÐÈÕ³£ %%% +%%%%%%%%%%%%%%%%%%%%%%%%%% \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/addnoise.m b/1. Hierarchical Invariants/Functions/addnoise.m new file mode 100644 index 0000000..8df415d --- /dev/null +++ b/1. Hierarchical Invariants/Functions/addnoise.m @@ -0,0 +1,21 @@ +function I0=addnoise(I,PSNR,reference) +% I0=addnoise(I,PSNR,[reference]) +% Add Gaussian white noise with chosen PSNR to the image I +% + +if nargin<=2 + reference='image'; +end + +b=randn(size(I)); % Create unit variance white Gaussian noise + +if reference=='image' + variance=10^(-PSNR/10)*... % Definition of the PSNR with + max(abs(I(:)))^2/mean(b(:).^2); % reference to the maximum of the image +else + variance=10^(-PSNR/10)*... % Definition of the PSNR with + reference^2/mean(b(:).^2); % reference to some other value (e.g., 255) +end +sigma=sqrt(variance); + +I0=I+sigma*b; \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/bf_filter.m b/1. Hierarchical Invariants/Functions/bf_filter.m new file mode 100644 index 0000000..4567b20 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/bf_filter.m @@ -0,0 +1,17 @@ +function y = bf_filter(x,bfdata) +% filtering bank +% y = bf_filter(x,bfdata) +% +% x is a 2d matrix +% bfdata is the filter bank, it is a structure with the following elements: +% .number number of filters, +% .bf a 3d matrix with the filters, +% .factor factor of the filters. +% + + len = size(bfdata,3); + y = zeros(cat(2,size(x),len)); + for index = 1:len, + y(:,:,index) = imfilter(x, conj(bfdata(:,:,index))); + end +end diff --git a/1. Hierarchical Invariants/Functions/bf_filter_fft.m b/1. Hierarchical Invariants/Functions/bf_filter_fft.m new file mode 100644 index 0000000..67dc4a3 --- /dev/null +++ b/1. Hierarchical Invariants/Functions/bf_filter_fft.m @@ -0,0 +1,13 @@ +function y = bf_filter_fft(x,fft_x,bfdata) + + len = size(bfdata,3); + bf = flip(flip(conj(bfdata),1),2); + pbf = single(zeros([size(x),len])); + pbf(1:size(bf,1),1:size(bf,2),:) = bf; + y = ifft2(fft2(pbf).*fft_x); + y = y(size(bf,1):end,size(bf,2):end,:); + +end + + + diff --git a/1. Hierarchical Invariants/Functions/bf_filter_fft_scale.m b/1. Hierarchical Invariants/Functions/bf_filter_fft_scale.m new file mode 100644 index 0000000..c0a662b --- /dev/null +++ b/1. Hierarchical Invariants/Functions/bf_filter_fft_scale.m @@ -0,0 +1,6 @@ +function y = bf_filter_fft_scale(fft_x,fft_pbf_cell,bfdata) + + y = ifft2(single(fft_pbf_cell).*single(fft_x)); + y = y(size(bfdata,1):end,size(bfdata,2):end,:); + +end \ No newline at end of file diff --git a/1. Hierarchical Invariants/Functions/imattack.m b/1. Hierarchical Invariants/Functions/imattack.m new file mode 100644 index 0000000..68447ab --- /dev/null +++ b/1. Hierarchical Invariants/Functions/imattack.m @@ -0,0 +1,53 @@ +function I1 = imattack(I0) + +I0=uint8(I0); + +% I1=imrotate(I0,25,'bicubic'); +% I1=imresize(I1,[size(I0,1),size(I0,2)]); + +% I1=imrotate(I0,20,'bicubic','crop'); + +% I1=flip(I0,1); + +% I1=imresize(I0,0.8,'bicubic'); +% temp=zeros(size(I0)); +% if size(I1,1) <= size(I0,1) +% temp(1:size(I1,1),1:size(I1,2),:)=I1; +% else +% temp=I1(1:size(I0,1),1:size(I0,2),:); +% end +% I1=temp; + + +H=fspecial('average',[3 3]); +I1=imfilter(I0,H); + +% SZ=7; +% I1R=medfilt2(I0(:,:,1),[SZ SZ]); +% I1G=medfilt2(I0(:,:,2),[SZ SZ]); +% I1B=medfilt2(I0(:,:,3),[SZ SZ]); +% I1=I0; +% I1(:,:,1)=I1R; +% I1(:,:,2)=I1G; +% I1(:,:,3)=I1B; +% I1=medfilt2(I0,[SZ SZ]); + +% H=fspecial('gaussian',[7,7],3); +% I1=imfilter(I0,H); + +% I1 = imnoise(uint8(I0),'salt & pepper',0.2); + +% I1 = imnoise(uint8(I0),'gaussian',0,0.01); + +% imwrite(uint8(I0),'JPEG.jpg','jpg','Quality',5); +% I1 = imread('JPEG.jpg','jpg'); + +% H=[0,-1,0;-1,5,-1;0,-1,0]; +% I1= imfilter(I0,H,'replicate'); + + +% I1=I0; + + +end + diff --git a/1. Hierarchical Invariants/Functions/tight_subplot.m b/1. Hierarchical Invariants/Functions/tight_subplot.m new file mode 100644 index 0000000..55f3a8d --- /dev/null +++ b/1. Hierarchical Invariants/Functions/tight_subplot.m @@ -0,0 +1,62 @@ +function ha = tight_subplot(Nh, Nw, gap, marg_h, marg_w) + +% tight_subplot creates "subplot" axes with adjustable gaps and margins +% +% ha = tight_subplot(Nh, Nw, gap, marg_h, marg_w) +% +% in: Nh number of axes in hight (vertical direction) +% Nw number of axes in width (horizontaldirection) +% gap gaps between the axes in normalized units (0...1) +% or [gap_h gap_w] for different gaps in height and width +% marg_h margins in height in normalized units (0...1) +% or [lower upper] for different lower and upper margins +% marg_w margins in width in normalized units (0...1) +% or [left right] for different left and right margins +% +% out: ha array of handles of the axes objects +% starting from upper left corner, going row-wise as in +% going row-wise as in +% +% Example: ha = tight_subplot(3,2,[.01 .03],[.1 .01],[.01 .01]) +% for ii = 1:6; axes(ha(ii)); plot(randn(10,ii)); end +% set(ha(1:4),'XTickLabel',''); set(ha,'YTickLabel','') + +% Pekka Kumpulainen 20.6.2010 @tut.fi +% Tampere University of Technology / Automation Science and Engineering + + +if nargin<3; gap = .02; end +if nargin<4 || isempty(marg_h); marg_h = .05; end +if nargin<5; marg_w = .05; end + +if numel(gap)==1; + gap = [gap gap]; +end +if numel(marg_w)==1; + marg_w = [marg_w marg_w]; +end +if numel(marg_h)==1; + marg_h = [marg_h marg_h]; +end + +axh = (1-sum(marg_h)-(Nh-1)*gap(1))/Nh; +axw = (1-sum(marg_w)-(Nw-1)*gap(2))/Nw; + +py = 1-marg_h(2)-axh; + +ha = zeros(Nh*Nw,1); +ii = 0; +for ih = 1:Nh + px = marg_w(1); + + for ix = 1:Nw + ii = ii+1; + ha(ii) = axes('Units','normalized', ... + 'Position',[px py axw axh], ... + 'XTickLabel','', ... + 'YTickLabel',''); + px = px+axw+gap(2); + end + py = py-axh-gap(1); +end +end \ No newline at end of file diff --git a/1. Hierarchical Invariants/Image/text.jpg b/1. Hierarchical Invariants/Image/text.jpg new file mode 100644 index 0000000000000000000000000000000000000000..beeda0fb36aac23cda01604aff24d2b3eb450fa3 GIT binary patch literal 229841 zcmeFZcT|*1(=R%Jh$2Cf5(SBpb52{yS;7#-kuYRt$T_GeNX{T2AekZOD6o~B1cuBI zBukc@;Xa`I{r3LOckey>u66#pHmjemuCD5;uI?U&A5Zt?*yT6ST}4?1Sr8gJ8mI#J z0bS1Clag_>Gy{PY6j(sFKp+q{2pB7jrLzvw4d4n|;sZU6-r4-Xec#7|!p0sf6&^mBkli~K2r2KbB~`LiE~ zD}EIAwL2aFjUM%r|N2Vz7e5G~F@N!+02(Xm=a?}8d$)hlcL5svmrNoc;~#|ux&;I` z9iTxUfBDAE#fA3qr|#t?VC&=0c)bKf2M(-hKEap zS4f0g;J>EkZ@jBmT=mTYWEvnV{3?M0bmiAy^*BI?=8E|{{ft1%Z4l{I;54y7NTB!z zY}>00%nS(Q*Z#ZOzklsfLSTaa+N0zE{r5eJhW>Ls(E@z*Uo;uvRbL>GJdm%<{8e85 z^YcUgs^M}2gmb+WAyO(JjLS_B-gOOR`tnNo5(Rn#!nt+p*6mw3w{PPR+`+y>K!T5h zgHJ+AL_|VFL`r~joqiQREC2n8hI{7@E*|b(JiNQaczAfkR}VbmpDG0ZI~`p92_m=! zdI5Tgfkq2LCqTm>K)aj*R_(3J7Boq~OH8!u1UP(^fW3fz1M?=Rv`=r_J##=LwE zuLq>C7@{fqnaP!ImEJpq>NWh7V`=&Br0Vn9(e_Z&# z_kiiYT)3P7;b2_bBmhZ*mU%e$@?jj@oaNS50=I91CVD)o0&FK-Y9)} ztKh+AIP4NMqs`eELh5FJ5@ z9HOWh$4uBwU;d5rcAwR1N9(TQgJQL@ZdTrCd4e1G-boUnsa=;K#RA#LzNjn{_{unj zAjNlk6Z{((_14Lo3Mz>+s?UWzttStvZHIOYAtwSChdF0U>`nV`_3IWhZq%_G?VmWe z2lO4`wtqiq+T&2~c6R%mtdk>`zO~F^IULS3O$|8_r8-URZ6Kd1n+ZehuA@u>-C8hU zqtqGBeH7lDM}0qfE9E!=s}GiJ~2EA>`y%J%Dt zbf~zs8uB7bzS^gMRmblGrl2lJ0#MVdQ zp!!Sc8Opa;K}CnB^U&#&dHB8BZat?~mfO)`am(5lZn6sw7aRqmm{*ECJT zvk@9$f$&w_Ug~A~9FbjTcddD_EW7f`o}Ueu$aAdxh(nJzo9A>fMZS7aEx}Q1T)w7< ze{#R3GFtwAoNk145Lbd^l(RkD6ytw+GFs>Roz9eZBY}yku}|;MiA&IATB?-mPSY2g zi*!ZDybR$fkwmJPACASGo^n;zxwh8HRgzy=&9lK5geW#Kr9d$+MTUE2>j4W~H-~kJ z=c~U|ol|d!uGCT$GHFDmUiL2_YAc-YB)p&~aQCF1vHp5c+tfKxLFpE%7KG4iUyZH5 zYnwxxJ|6_>%a#aL^F=zopUJue!AFwt4$In2Ohc=<+IcTQN{1SnP7fEKjR+26c!&4% zxup<0IOxgx8Q>3CEU68sGUf1Y2u5tC!3r$jW#ybP);B3#f^II;XZwxArRzuBY)2*- zC!X~m42|OAZ=Oulj~}m=m)bO!g{7(AAGM!sBf?5u+N4fwEe!B~etu9s+_+m;H#Onj zI122Xfp^(CdsV>xSre*yw<;Q9v6b276NeJG*g8OJP{ML2JsNntJ&Gh3SYLV-Sm^b4_lfh_Bec` z*7%7IIH&k5Ty8oztgAS8Z}N$nlH;q|Dj8S!yQ!*CK~IAV+(HLMrO@G$GPLH>oSeCl z6;oJUJrx&Qr+`m#$OWWu#rN|_@l^7G#z4GoUXHI|v}QGO_PFs9)FV}%slF2Q+-E>a z;%%69e&x$c5Ua^*DVw5!p8-nk>5JS>K7*2QArqAO`OVDCOOQ>=#B-SCD{hfv&=7{~ zWF^J&<~E(kDP{NaOC&safVskaIk2$xdD75~yL`0W1;uK2 z7{GT45*tY_+LuJ^4Xt;;br3P2fnn4J;!j(FSI6~DNMNO4U4ouz=VRoe3`u20%4PkH z;`lCHmYc;zed1TBFN|@=D)&yC^;NuWzm5#nBTe>@!A|GARL7T~_fhXn{E(ZDj)}h3 ze4Z>`_l6{qqK8e0J?i72HUWmd3e)F<&Ibv3<$Eccu47w0#V37xLu=WmC@OQ3@nR$H zWP?CQO6LT#CFp|h=kkl1P{XmkPjjPu=LnzLC)jlu2X(KHS|oa+3!e6+ESTDTheI(mEfH ze!P6~110?)#Tzr8@9|RWdYe~RLSXz`rSB_o#0WMkM&^)9;a_VvM3YS}L5{nGnn?#A zJbA-3RmMn6+Ox@#OU?M-6AWGOe}o+tvU+5Jk@h=V*~?=x<33rcQ`FzK8&XrNQPr0q zS=Nwpfgl4j0hN7-B^`FLdLIrGq+*PHY72Eb^H^QL`O}A2{v5?32*%L`Zhy5S>trMN zQf8)>=^THYGp{T`;}^?jBkLB?fMc z&h~z<6ueK>m`q#$Z2VQ_!KozD7c4XUg75T1YR+6az{}T}fnkp;TNcf7!QYfWBXyxc zyXRDtm4p{_vuwtioX0d_u(gYm>b}NBYP=Sn-V3**=GS=a5FIM#@wj@PJbQ8_jKp@8 zME{CY-~5ZF-Ym&W;<27h0y5?>Wq8<>a@5JnmWMMo~7hT zIAfi9R*2HjRPBk2_n!$@`zYI|*TbhfatWeaH=bC%$RI6-yo#7)(&=YAb)hQ2;&gmf ze+=F@lr#~vy|8`8|MVNid#W*(I46IP!Y0DzP-}im_=VC6eU3n5yi~JK3-GbQ*x-$I zcN8mp4}PfIE_lo`D3Wpz!cqIUv8o4xHDY?|8sJHK2|5D4xf~ejcJ9IH4zg%WL0G7g z*%7Kb!I4%9Z?*M{NNE#iYyU2Ywl=TwRz*;m{>*~WR5?q#E%lRP9S=qQqSRPTi9w{p zO&6Mkg2;xCJ{KDWPx5oC5s(9}t@4|=<9J?z7H3<_0uOOMpgCIoc~6o}Zsqym+$5!3 zf3dZT%_S&YUr;YH{_#pY___RpHPUZO3pJ@(24&lqAURLx3#-hSAXHM~((J4!*NSK* z9b~$r+V%WqJ_(M?Q+ApUW|7}Vr`MP!cF$7xto*p_O0D@(K5A+O$ySaAv8&X3yrHE> z>r)qrh2Ot+tO^=5QLK;m5l&cU_fzYNps%u_;Dy!4%*=5rhZHL8=Zw%F-2%zvqu!Jr zOdc3EL3YSaA(5~Iw<&==ZM z=>w}&&kbp!d<&wI{@@S6wRkxNQZ{cD@}$nEr26rYcaju2|B(u*sVTBt`a17?WWuGw z%Ly!!kt9RnwA!|%%JwPjKy=sb1cEXymmN7t)}fI%FDDBKkSx8(ClNCf>84Jynp15;o|oVFY4*UF39d}xMxCi zd=lt`{=3{{+V)h{ikR_gh8o|zy;%WORM{V*(?5)Q@_m3WCi_p>S7H`~yepD+s5o$8 z#WxQ3p+x8b{2@4K$2zYc+lLlNrmSFh+h!2PCr&?mrexC@?j3%@0rm3qoh8(`W54O> zjaM)j`OG%2>z0c(+O}s^*^=NPC)lR;{eCqD`N0Ps@1xO?1N}J#$;=9#b(c$!@vuwU zYX4a<#Mn|=*gB$HtP9UD}4OXw;F4cfSm$nW=tpZm+XzHQlz|6GNGLn ze78`LamcCE#q>FmWzz{)}5Z>yb-Vhdu>gFh?(8O2j#w{#)?++PN&;<8oT3d8Cq&vO3YU=v2~jK}Sug*LDL@&)n8&{&C}@|EBfSiTEX`bF#23EU&|R zO1z!ou7cwoh=AM<{!T+)zK8Ao8k1otnee@H*5~t~CbEqv@*k_fuY%Q9))H7t5O->{ zpNxa8Bi@0})?mBqGSGsdpmsU5u(5Iuu8Do##y`AZD$zC8X8}UnuywI1ZR(WYR}Kp6 zUUPhgm-a=HW2kJ$Bbm&`ThQP{&LHBDA64y9%sB-$nHa4qOCuLLqF<5ki*gL9OaejEa<3jtk(J#qF@d z%P&EUTc;tHi83_y6~1rWP9)A7+t_BL3N)V!tOmayHFz;0D2JRnn-p$Z zVqBqmGEoL=Y!hybg*$C;I%a$q5_COMo4Eu9E2wUQd%OBz{2s=0Xok)QH!KeCt(?o) ziJ@WqA<6;Ian}FSInH56A@Z)mf>ScKr6eq9lPt3Bli-ZSXg81=s#B0V}oyDTJ?AQ@+ z{#=$V%`vH}?aCG|=cGxZR6b2nh?jeHHUc|qiRtKH&u`FQ3gGIdR$#-CVBh;NHR7wM zJZ}p1gyHn=wGAXYCL69}Jcbmj?QXy~8+0?hv%hrBzOU?X3~-Qmf05z4l4bklkkZ3D z2At7x3Cg`FZxUwUhm}=DgKaun+CWv^i3dv+DdPLjyMRq0&E;WbSOz+L}i!ubBnzgyRGR~7(k=zsjozuF!E+@DzKPp`nG1Izkr7Smag!*U+GHkO8=kfZvy{m_~qbL9p-Ff0~A;A z@J(a5GtAUc&DhEWsQuE@Fmd7rYF8l#X#p_14IE~EMPDUlsF~B>>rb5Ewm<7X-Ow<% z_|<+rq??X5mL^a~Z5w4rKpE{Hb}+Bo0QMF1h;?02kp5fWSmq9JXS;u}Zo(Zb%`IV2 zn6oXQgCnDP)w|j?52)iBIXl7SpfIR|krUJuV1TsT?V!Jev409*ajsevY|Uwa;{Wvc zF`ON2v}AO(08_t$dlmeDa#S46q5t6AG_rBhGBW=M56=V&=t13_6ddKXRFsY3aGR?R zZ~evohwyC+xP!-I8%y)QB8C5R@bZ7L0ZlAZsF{(ojT1oLc7ZxL{SV^Wf3g25e#h8c z3T^{;_*-xZe)j)F?mrEH3P=?WyNdN~C%B!Ovy&tA?+XXp23Sb{3m3;2?gT8T|Al`C zm|~0nE`I%KKyYOUg!XIK6JOV^7Vgha6`ZR&;m`dI0=)z(FMuYXi~vYNG7u>MSN{gM ze*@f02fqRC-vIY-fcrPV{Ttx^4RHSkxPJrOzX9&w0QYZz`!~S-8{qy8aQ_Cl|NjVZ z|3qvb0zeT61O_sIF#)gHf*ylRL2!^U2nwPBJq1|+v=fjWuPHk~g6RK6f(9fA;s9}7 zb@cDGl1IW;YR_#TM#hMB`>_19KE{6KA?s5CP~bHYXF!wTP3o zIFqi*QyM1#fV8%BqT%5X;^1NDKp!^y+L4oI*&y2G4|+}L4`bb!5UM=W*!qxO$@Sn6Jf z12BY5b8Si*7>oP+D_t3&d!#mBE}~CP+l`3UUpMKA%1plZc{;aVQ#1y zyAc;R)Yyp6)R<3LhzXnKuW=jMsi^$V7XO+7TU$=RDh-Voz)(>Uk%pT%+d^SZ3eplk zBW4OW0nFO{^_Kcy4sicJIUsg5zyItE7#8PM2>&)NV5~oRKv;nQbN*-2uH5-QpMD$p zS26w_uHWJMR}uJE!oOG7?{NLA2>dJI->d6)xc*fH{+00W)%81E|0)9iO8EEc`W>!+ z6@h;x{Cjo%4%femz`qjy|GK&WeCIDz2nqwBAXfnM`P;$VYlsOrm@5UKSpVAz{l5~% ze-d!6_RcM|Z|E=4&NE%e#}Eha$Eh$JtKPF`x^GINR1;Iq|!=%F!DKI zlYJiGXPVU%c)cB!F0JJ#BP%Fp@(8T0Ltgd;Ik#i#=M?=0no-_7IL|C(w(HCyEF!O< zsH>-MZeeNV;_Bw^@zy`!U0_g5Y+U^Ngv89O?3`RgUPWb9bxmzuOKV$uM`zd2@W|-c z_{75E((?C})xG_L!=vL9;E?MrG+;QAAolb4v6zzi9leuPeQdW!S%|#MR$JU!l7|Hz z(FY|a5wiQ^iW$Up`V5u}<@FGq1Nn1CyqwzVje8K!J?w#R78zWvwSr0t1`$IHJPg7u z3XcNkIPN%vkb3wIF_nYm{M*;h?Anb5d_?d2Ys-51h~g3>$fd;}N5y3-X0P|H?VY^8 z@RpgWtBaol?UkN)xZ!3w;C?Pub7 z&ZTLSHTtg(zarcE7@KxN9r{*B>B`WjW)uQjZJ+t?jp>QE--J`f@(PT5$b9XM$9eHO zE(klwT1$gZb*-?icp^yKsCZ+}Ds%(Z8ei5oxrGCBiFQ?2mm(%{C(o;^y-%earOfQ* zd}yRh(0Ok=@@UUP{1skAOA$@N{?t=<%LxkFwFT0J*n29h#uVo|rHAQ-YmgQ{b_uHSh))x2lw_`2 z@hlgA*9;3%^mx|DTe1xn7ITrYj;q4*JBpjm3rdv9Ea;-+?Z%JdrfXVL64&r*JjxjH zrLgAWBOaeXl%m4K-f{@~+B|zJYmFXTlZQa$+a=i8I^|W=vbY&iHlNp2e2<;!&P3R* z+V&}tFdfp>aFM0ffU|>POCJ#}Rxbuv)BGE(N=uPlp+!1-?gT;Eh0lldI$ZhLg#vMRNRi#FE$xHnu?NkuZRT~7qJf3YrdC!}RA3V+0W3zO zs-0#}Bm-MbPh+v7*dRArV?h;L(RA;*4@Z5;!MT8bN@F;up?st!SY5=saUqzD7@suO zvT@2%5XLiz2$1U3xnn5pLqEJ(E$GueB~H;`GIi7w1$CM0)gvBCc(<5cr~q{eQq-mA z`V@0w7Ab9&pK*cPS8njG(9iw_!ZDWgXz62q_Gp%=T<0H|r2ASPPjU*2;rmScKEXPoJ!vM^cKn2iM>K`94q&VmI#~ zgcHNvHH6Bs5sb#y=+}}XMq&#MX~<99n;2Apc}tETxJxj*-aGyiR-k66cxvu$D}Ef6 z-KMp`l1E_g>^!L1jY$h#c%Sp5YodJKUu48BF?q_{NPMi_Xy5tX9;&wSQ<%-tNTDxr zq|Nzyub5UXdMB7N$;57W0{eYs^Mx9Ho>-*dar-{6MxX8ew0WW611b0c9#48H?FWsb z?dE)`+LFPx{yx=Vr@Yw*EN_#EMtX^)FF^$-VE>d4lWM^M_>lKS@sCQPWfRhbq`L;Y z+8(j6oVAp7(K*Y6$&L7yc&B`NW@(_N&Q1|j!*B`WmQ6FxHsr`ws~)N=&QLoEXsR|# zmu$*Ez>zZ07-|X`)Tbk3fAn(a!+*EqT{!SRR?}e8C+(TLbjDh zk#s!NJ1VVmok8kszUA!EYNO-Ilc(jv`mxR$U^Pr!Ts?m`GHs6ndZLma=Ur5C_Qv@n z&iqfBq9oO7>+y@q#9yf^NWDoXhM4QzIQGzu)7$2*R8CzOPtJI+@^pZfAUi#EPk!cy z!D+>G#fsQHWE8pO3+lFH#HuyRND!}ZOiQ4|lbIhBbU0a`5{X9Ynks#v`HN=T8RK^} zt6f5&v~a~*%jNX;rXR{xbb=vqI-`7AwIbR=6U}TkJFTR0B64*mlLi@rdMUZxN(Kz~ z9I5oUB4;!7?}g6Aw{mhlwOwXIx6fQ>B$@^fv$qig8RkN?FDUvf2AFX;>hklhu0*8BIpG4)e(<#cGmY;d2 zss$M`R95w}3z%UmPbPQ-39k~8g~(QwDd3b!i0f0=WPRj$tg*To&%p1|RJk$OWYVTa zC4f)h_m(w3f7MKxpPf}E=n}+`f_@2Vql}>Y*v_|>0Vz1u$gx=WjvVckFmQP>IcNDI zr=u?CE|BKo|6ZmCy`#3?fk*F**2DPDZX8F_Qh_ z$G2@B?wq*nTC&Kj__qS^;dPHAXE{z2mj)7BAKbRiajjS~gOR>;-l)fmnbFLwB>ZK) zG=>rhhQN?>X4S|aqnL7DX4CS<(XDR;97qZYS0!k z0b2`;Unifce$(+yfJ&>IzAg1`#n|{GmR%nUaxzu~f-L}L<-8oE{S(>NyC!|Cg$OIwSlCL>HC9%`qt@s&y=?G*-ua+@y4dE zDJzLW(0KmDuvGDYRyATcuJKKTVSL&c6+5 z*E^qW?mb8S>7HPmtL!4e%d4ft{iZ5aDFD2eYPTYiU%qq9Y^QbVO84ndoWz=48Wn({ zqw=nu_c6Vu`n=0g4hg?T+m{}(Cz7;Q2Z=f3NvAH*Hadce9rvCK9Gybg{A7|@#{Ft8 zy@{+xx?&MNmHyun$M!Xl51bK^Nbv2K@l)>(V~;FF+gco*6@PjyS% zB4OWy#3$~cFY0^a*ZeV}O*S3fO%d_%FocKx`mPCM(!-=E#c-Mn)>QOI+;hU2k4hO6 z$aGfLF{hhIPt*O#f~MV7GIZWGFD)wKmOp0mv6`$2Q6wl4ikED&Hsa)Iarw%7A)AAWzD4x5__w<*tfX4l*%7jgh0f%D#-^P z$&X*YW+;pz>i#Md9zl;R-btQF`FciYMrgTRuQOrIXF83%~!nkc#! zxSdPXia+RSQaw^!ii>HnprBr`JOmT@8Xkt@(KM5IG&hn4-Qy-Gbl9&i*P^V>= znde;F$P1DSe!weT4|k>nNTjQnohoAXh?%mprWEG z7MZa3CKfVAl012LK@hcI;PB#zk36AoRa@%_;3@MC5Ug*AK3m)WG#rijAaw75rHD=E1} zY3!$82l88&JpVWWtnGKEF6>LlF~yT@R<>46vD2eCi%a*O&K9caPd`!tU-13^bKWkQ1QaISFSCm{dagkIFhb`|ANf5?r?ue%%jLaO zrO`#ag+AeKuxY)NgXWM(yCzs{uU-=Vg+3&IXs9ABXQY(pL`+r+FICf172FwB&|3-S z*N5A-ndzq`b;!|E+`*7JP1o*UEp;=J$_iiI<;c{go4M@IXNx(_sHrwHpsMl=EEV;< zXECsiV!h9=+5D7FQ-eoO;Vl)LgRq>l%-;9GRclY47}9mvOfyowI|9)mPRxCq)vEM| zPGTEDOJui1UNP&Z?zDZMCRY5SqCbiz)*C7VauA>U#@uWx;}Ng?nT}#9D@t1>gS#=M z^HuLXChP>CXzGgyuG*@tzvG$b&dRhHja|q@c=IDpuotH zvQ&E^@x&*-vrBe&&30=fYE@smsI5U5xqsq2d=Y&IX=sx` znIe*5?#h>-TI+EF-+Dkq7aF-5eP27WTTej>Q)^c}@e)Mxq)he_R6^DOQFFlv8sn>n zkUS3hQ{$<*OY*Y-di$e}#xFVd`6@9q77&OY5@HhY7pmv_dWMRM;op6qaJgWaY&7PM z?~7KY(na!(CCrC22Sw6%EoyiqqzHXW50jT>T3>qU?;gv?_6+qDS9i*1N9u!#|}i_O2&2UDuDX%)rylSo$s;hRE%}sji^F;h$NfrTkTaUkNG+F3m%@OaG45ROzIQ?hSn5^5yw1Xp3j}x+kJlyAk z%oO;1w)bMH-fTa+=wF|TuR9RHa^LjHKsnm7Rk91nQ6+rYSnW|e3}tZ3BNQqV3hbr% zP~T0Q2!X`z3F!yF6;4xm^N$Q45#Yf(76U$;`^)lwJ9AH##RoA2(n0F;? z=@!!`GuM9?4>>8G$fb@nz|Zm!^<8iwVVn@Qtw$eNwD%6Epf7BdiOcMyx3N^Yr>I|R z!Q)ooBW{5<2+AJ@k*rQAn!zdH`^s3jGX;|46 zy?f#8!$42yj&jMucxY+D)RZTQi7H3%e7D zuw1rWSqyZ3(wQ+1JN8BnnyoBu7QU@xS^Zv8Gn(E#SKftbCJ;tGL;Yj2^uujyWNO#S zAy*Z<7TeDpAmb%J+39ii2f zKh#Ye>`ps>K6*j@18!8cG<8&G>FeLjaJ!qXH6Nc_iuI3e=A?}*mryAZ%ugPJsdD+_ zkZFpBD7Lp8v=vZZ|zSSOwIFCw5+nY7oz7NMfMatF;XnfI+ zf9B86q>0HY!)(NILKc2@e@t_F>f%%&iSAX4sj6&4T2P|$Fg*+}D0IkBQ8AS6mPi3uU$J4)2zo(#LmoijtQgWN6cuq)oDKeI1`?#%q9zTxgyKC6S zMTS}luj7V?+r7G6lb!byl^=xPi7eUYbmcP->nJR92kKUbrb6y)F#DmLh4s3>r?Bun zVnSqOBM?z{qMYA`=w%Tg_NbeDa^;dJ@wbDuhUGOPTTTZ$=IblgG+9A`rV|=)HfI~>Tct;_$}vN0 zT(`5RAP1G4XO4%4;B)44WY-+;sSnjagT-2&>FXdi4n_~L7T#9T775_aw%`aJv3~ic ztRdh019ySOxgOiX_~hNq(B6vj3gQy7sz%j#)`}f7mfU29*UMOjm@*WWqnTO{FWT#t z*Dpq9yaVf2?8k8~v^|*frc*LV-uT<-muQlmnwo(*Z@=S=ot|EX3#B)2fIY;-SRbb$ z26*-*Of%g{LKWxcV*Q|5b_%%&-(AT(3GV=L!y(b8nnN=>)BTIFj%D6sk=zv|xrkr{ zB2FCl#UVj!{;6;A)UJ^P_vdZaj1>W&rNT7ePDIpn)!Y2RM|!5* z(#;2!m!K)cdDG|?e)}1xzU_)DZ1LrbZQXYMn)T6b?8JBXu(J|+c3_mlJVPTR!@Q}e zHVv(lIq+`RL<82{Lx}o@%?;5o+wFJl*sB(~mX@VNCM&KtHKOi*Q8Y!o^=XF9!7*rC zvE8>$P&(BGInMjI95Y6-Gw*XHL;2a<8W0s_#BL|gdcs;w;+%( zo=W|gb|729V+~84^t6kGNx0#-mWlpRR9@Pw$Cy>Vw3RwT)T1b=6Y>1-DH&$WsT2@} z5iPPjY!3@#f0k!k)-cQ+|0qiPSRlK1I#~Wa<(_91sGF87t$0E2mFkxX=^tn z!i09ILQ_c06bOrHB5ouw{irG?>Q*8Y%x^zW^;+R39&$TuR*(xtkxsR;v_gVD%Y+oI zs|-@A7TQe9rn@)2Q6D)jS|JWLyZAhqKPi83(cPj%Pcrt*OglU3wwD2~f%X zXX!qw)_xwR>(qMTyb$XwSvy`EC~)qzsAFM@uyDPpe+xR3z?^GP&by{Rmz+Ib zqkjq7F?{tdT=v}(fHg+eU4kk-$4v6-4Kh982!ZFqu2rHKRi%&^QOntsM?$CwB~QSdUe99RXPS5 zNF-7T0)8-(_cqnZ+~?b;s80j5GMwKzPZ}c5n|I8Mw#imwCiX>x9n7aAEq4u9>K^5; z3d(3U@Z2Uco7;)yCpIukv+y)#N#X`#vP% zwl?u__o`EIZsWw7@{cFClXp7D(OanB5lCiT$34c~74?OOEU|=hmRs1p@3OLlPIx*p zGHn}~BHU)PyCirb2A;$Y^<)01Ki+pIm1r{KooDL)Ix^vTh#AtyKn*)!w4(or@|1bR zyvCDW^+-N5tFTb*s1(^&?oPEbIB>5x=fKRX;@ETMRLXPl=Ftp=N4<|Pu6(H{Q89$# z4By%~tG(HP@m>Z$CAH&ndO@*^FGa!w`J|5N)tvm(`PyyIQSJzoUP!C9nti)ig1n{K zsfSHuveh_*floHIPe#?(ess@Wu2?(O2^!U%<^qXgstgKcSjh&5ZuA2pMuDlUsUU9rfEyWzr(n<|BJu>JHXQJ*Ln$<(( z+1mO2Jx@9H2Fu7OW;1zcoGxMN*Tdw@9k-U9E*R*}3rR@5`B7~JE27Si3g1}Cuv`Go zl{2wp*6!3MZkp;dn2JN{F4yu#p>{n>0K@%>A<^$SJLSH~P6yatxrLqm+Ou}XuWB@dg*ms|RXar>?xoy@PY#15U zAf%|2ry-MUkxiTQcgUK~Z>98Zj*l6XAH9{DZy8fm*C-v?^r#tSdY{ip*Gy00b1N_? z3O$$398U3aZ2@}F)V{B60fv5`D-^P!fN94D{b|y8tS%TtH%47zlaM@H&OpxIi zSJ!WOIs#v(W_0A#_=YPfJQ6a4aB~zdLDuxc1d2$qa?MVz+#+PTKNv(W7z5NXilP1esW6WhHEpsB08-3uS90 z1I5Hau00SeB<6j*h?%7)*(;FH911}l2D6U5U$Gm~{m^zZT`2Nt|HcGXUiwGVaOK!+ z)7P4Zrd=c>qdfA{ap%BQVV46;rzXa>&l}tM8HXo?YzX^!)gUqlLYXO+T9^tLQlIgzs5e=}4375paZGWEHP*ju#ZS zcMTXm@GYvxFJ9v=islmvDSVu!!^#%YWRwIslzPk=No+lu>HFcF!;SoTjr_OxBF{C+ z>eY~eW(I-zjQo%Om5KMck5_3D5S=PH+H%IVXB4)*8FHhd!KNeP zvd^3DyiCvVP-jryE-2(+5|()!9agN|FL^9_!mw>^Xm26Su{0%WZ98XWRif*ag5f;S z;G)7^K?v4D4$G)1Ec;O?yzNvaPfn3Jm!CL;pM>W&ynw?{Uk_Z?^1p7V%z~>0hhB?3 zOX-?AdBn_;61dk>Qt_Jnwv`#wcmrJgJbPI?+-S-WkCQ1Om~3K-NiVQVt0yLMQ#?1? z_(fq#8kn|#pI8y)qZKf65$}Ulnh)Lo+8QL#wsF3e*s85ldOKv2Z-7GX*7mAS+YqK6 zEn#)x-L+%@C(&3zuQ+!~f>6e4Z0aAc(vuKWs*rfIMYdDsv1oIabRPv)?6PFIixY|} zmRr$KB%qxhBZ^$$7WTpu$Z|@2#jDM%@0OJUic-pS3sJ|~TVYGf zhM%*kMhz^vj7+U#Tik1Y7(yym*G;K!T2}gUG-}|pMJ)1UT(YW8Ji#{m zJsbk;O}O20QYSWTZc0?&mx@deQ;4H{jbmX?miUI*7qvql0$jN!`!b0P-%xYm`>IvG zYtiSCEuQyNJ4a)bteJKi=X=bC#4mYHVkh188sw0TJz-zgKa6}X4rUrX^+Ri7vC4>x z^8F-lQB5Ct-_%OmW7J`oImun;$i(=M;R@jBvL!@6-SX1*^R6mBuur zg7RqP6^CZXEmD!GiPcBvS1oP)sWn_kDa@i@5r<7)`$FDP*DD6WF0ECIZDJK07_H!6 zL@iy$>Jf>Y?qX^W-Nxg|U@hZ4O-U;wCMhk%(NjBWKnfr#=U1UmUT592Yl37#-Wp1@ zZT6u^y=SX=6ym;^@aTcF?Ze!SAS4Fp)U9*_Q6>=zV80Ng! z2v$)d8dT7PgydT#x+!l{7C-|ZBv=YxM;}Vo~v7)rVq%U|L}xdJ5DTxFe~%p^r`KFq4WUB1HE)dhBL&%o`(}>$twA$ zqS>HSYAJPzqx7~8%_FUjvCa002wv6->j!bs4^MN~FC^7MNt{l38#Mcq;++=lYtOqQ zQ@LOBZ4b@om$}uJh<+&}HBf%9T%qwMptB&uqoT{+G&cM~$7rVV*O6CD8 z`*D#)WRgxS+iduOZ`sp}$F4R8Fzmwmimc#=iDtPu9@=>xmWgqR z$@7I@G|e6wsX7IM=SDLIz8~t7Bzy?7vPv-EOo^i+{9+n}#e?3|gpZf~?o3D4hm*!EFA)iSeiC?)OR zq!cqI&P9ra^Fu+QFJiNmiqe~hBrDgOTwn*etwS;a{&jwW2IQZ3hM+DDY-A$BbD@ST zCUI}RBIUR*M)HF_sT=8CBz|06Xrz4JU`u?F=-)r6r4*XFp857x;HpKw7ZE-V@Fvir z+`i{{eC9#eMCV4;WKw{GE$;rSoGkqh-d09GR`mQ75Jx*|s;t)Ww8+w(I)NtV`5kz6 z)xrMM@njaYJIuo(pJg>0C2Bw*XK3jEF?C}^AhAsBeRClRj(Wc&r3 zAkceYLbRDmMI5Re{aGq3M!OR%ZBkOyIXdXmoJz!W%;r!-Jv!!D^JC@#cT%!(_d=?~ z*fVcK!HI=D@O*Aza0?-%G~gW_i`#3?{t5S!(^9o}6iG!VOjeQ(G8NmbwSwZ}UIwt& zx-A;Br4`wR;6|b1kKH&5CsYLDB8!K5k}MYx7bbUCn39|AdZ-V2To|*!CbPXei@l}{ zPDv1Xtwq#=X19Uwl+%3b=muHU$L`@dd#zGIlri@{`%+wyWlk%*Ei5Z4ZF^TggEMA0 ze{BKV7OqpRIAPPkpufn_x|A80U}jQ(XviHgZwXF#E?!%SJ`ub6(OK)Fp!)Czc?OZ` zqm_In?$5;TRNG^EypNTXaI&C|fq!;By%pKi+cJ>_yrQxZR4r)`CBNh57(ZpG3-Z`y83TTo+hTK(E1T(kX3xg)pC#yH;DZ3 z>S=l2sy4F9tx2c)QKPJD3a8tUxrHdJow;EBF^!GvSj5OT1j$grOv~;A0o^%&VLzW{ zj%pQ=ic^ibM%hD`$<9Srk_V>+)1u|9Y6rtVK0ituC*@}8vciNZ_buk8=nm?nL#ShY zCpfnR@EcEENdmtvJn~ecJ2Me65)SR7H`C=;5ZWrIi^YWj-7UI=NIjqqRMi4OD;h! zJGvVs<DS!})Zt7??6qE2hp?7Mt&~m%jLT74TYuO4bO*ft z&xtp=9y;em4E)FTeI7HSWJIQgO1lCHnXC=XI(*NN_LsOrwgt3%J-F ztjV2+@He8;3MS4lGz81zsy~XQJ~!Mu{hFj*B(}s7R!kQ8$|06`DKc+RdQgfvXhSi& z9@0t(TrWQ}KKyy(*{q^I8x^k9@UbM^ZqpUl55>2_*Ap?vZ1yHFZ!rf7q0;ZLtt+oRqzF49Nzr2QCB+j6|jvg`;Vtczm)oQ$aO9%nlyHK8Zh-q5E{eI7^Zg z7orx?vpaC$>S52pw3K^aqMv~;t2B0(C5x-Pkj8nT@TRrmbDZ#^^%q2 z7Q${ZYY4HLqV~BH^AfbVzW93_kEEn-Aim@zX}uO#6)!$a)mgj*y*8DY;gqW^A+F#i z*CK2b$!C*!QYc+Jv8F&@s#!59IjHGDe9F4*+ygFD*HMZlFlO#PzwmsBmhn+rHlpi& zN5IVRf;EQ6(-YqXYAdgspHbbDpidB2m__qYHLLz3- z+CpfpqBM84v|d_yL!v59y63bn;(F?w81YgDGS(N+HF6a4a?xDtY5PJ@|m8!DCZg>1X!aY_cl>wRA@<(g5&Ef;4g^AwOvGYKt5~^0b}w zm%){?^MM#J#A*HQFj)ndaz}vt-E<>IfE_7ord@Jx=gJtR9p-i#=eyhNaam`p<~{{v zD~elTQ_~~tUwpwB6lM!VOq`yhrY{mvAC~b{hph0|d!&u?={q0gcV(H<0qq7x!y5-1 zI`#*x9clNi3zXgY2Oq^(!tO^ZJTs6(WsC`;NDC#9jl(%pPICD9+Bk<0@^Ki|f4?UBpt$m)*JEX%7@a>uZM^J69)(nSR4uhBEtnXOzjFJf zlC(uYKP>6bXj-X}*6jp#%ndO)u#u^lhU`L##m>djsUMB4DZN0}c3H~i-i)p3H!QdG?|;8uLfg@X$X+Z1tcyzKXSWH)W5nE^06tjA zfe!Vn&Tq$`tY-T@DqrN|tn`<}1j>Rk-tE*m-nO?3w}0tn&l5jr1{*!RC8kse)O&=u zHAF!&Dl(|3n7!ANf<;&xAh!&NJ#NTg=?p-nC;jgs!l@ZpSp(Pb4*n2(& z6=JZ(X$t61=Xu(<)Y`K3Ogt-ij34-zxcbs`yFV+mK1C9lK| zpMMZ0Qq@YVie(P`e6`etz(vIvrNDy6t7a64asYV=tFEK?mjRPL?XzXuS{<;pVL;zW z@<2FpIFSRJa`!$M?kwsi%j_PN_HW)ds<#Mrd@Ik(i_rOl#SY?r$Y*ea#jxEMpmIGI zpIfje5%Ji^GVR;)`HA1A#z%?242vZk>~oV*g<;ve+5dTG7+%ONThIE3B!nmTN8P1R+~fn|4!;;^H{OAe_Hqv!C#?TzzVds*PxQkyZ#) zbsz6C9#~3v6mSr8bE8pB`1ddDSFO)^14ys_8S);f3l54W&OE7O$9QHbYt9RA1pD4J z6R6(wIhEf`(M}8fm@N?eC)6vpKAlyhrv>ud3z1f_#$KR?##t0LcSF`+D{SkzgrSAEbovUg4yKQ5-g##YR5b8**RX<1l&W zPED?ns}}L++LU*4+0=*vdvkuNlEzm;gzn4p8CrD6Ehkj{A2XcoqcA<~ggEQANKHry zbjonki#)K^|1rhs&|qzsv{g)lytxaJgr>st!=lWaRDgFbBb;}oHy2wacZNlBdk&B6 z$H{_1!tjq=*U3Tmo2Ci^?!`j((q5{oIHNclkbfDj+IwVvYTb|vYzQu?Sg)$Fx?ZCF zrL<5%Y<1`dfg1iy7goQRth?LtAO;A5fzI*%YTUf73GIoQa7Mn$H$&oHTK0*Z@B%K0 zpG;gYO0v@XARJOq<-0Huv~uff1supD*ss3QqvU9Qdfw*UYh--9KBkAth6{mtW-0F3dIIofKHl>_z^K)sIeQoe`nM6&Dih1&*b5 zT)~&~!XePm&?NiTkS%coM&l3fMjnA3a(dw?mf2S-6VB*(?4RmW-Rld}-VlwU_OHf2 zr)I7Ntp>F1&OiC)K58*KKDvEEpmJ2bl@oQ5woJC1++D8MxYdTutsSfW-;XBsnMp#= zlN6%j{2`_BdDb?C-R8)9Ah!5^*3^{zoyn0C?o7&irGVKmczF(5G%ptMaTg>XvQAe= z>|2BOre*5ntXiBko>fIWe`jnI2;Q)(dT-_brLe0#tQ&0}X(#-bA-}a{@rj&VldCmz z0XVS}DqwcC8{QW?+`$^vdGLj1ZRHXMIRfvYIzl6#yyZ!sKMCf-yI0xFqk(As!1{oH zUUnZc-kH0*{g)x8hiaukCJD&gk|%B+IoP`IQo>Rs4N|xKzU>(G#QtRv>sZ+oZI5vB z$az&WBBgIHj`OS(-(V4mw=rO}x2UcLJ=OZ;Ybr0_KnWDkpXhXsuahmyM?1&rKX0E6 zbWEKUcXxj#u(3woN<2dKDsT8LD?Vola*sAh#^$NGKL9AiJJFAXU9@#B+xWNQTIFPa zEZl%r7VJ4;p`Z|Ic2M)jAi><~(GY?bLikS@4Gf81DQ$Q@$ZWKpaz5i7#2pcVC1ib) zHnPF=7TB*;Itk;x{tEF?0R?paeAs$xF)zN~`@&~)_7;0O(#T|NSyXJTH#!ChVsR6&%FoHc=ST4Xd-5%^RQwd%4~Yn3YV&{x(jP~a z%sg}#%`YtM1FBIAz-~+eW7wvbra*I*HZIV+w0V$ypS*GSx%VL8 zovuLr4N$7AA+N_?By;6h$v@gEE@pEvp6LG zdf2}!SdNPS#tXXDOTzPLhJne9m=k@HuexsO<^iH%e}NKlD>lC@4H%IqXlkGb+j?aR zhJfl{XeeV?d4adZUBV0K)Niff!f$&YF;%D=VXX{b+~X5=hUlWyY% zTQv0Bw+mkPph27t+ONj1v3ChWyCPM2gVR@=Ef{pcgr12llW#7sk zSsj(H6=ATRv4yJkcb?k1J9vvL9sW8EH7J>$m~FoNPi@5kt-K9P5Us2c)fj=D6Bwdj zvObLq3q`#amvxWv6QnPzd6+yOw;6ms+$wvb98l{uGZifI6yC7tn>qp+oKDjxUelW4ng)|g;r=N0HYIE=$KhR+sUzB*PI30meaian)cmb+=3Nd0} zo9C6nb+FCzTUu{vFJJPra_D$ehzATx`g>v~`T^s%X}jxtBPOPd0#=s&T;*-bzqZ#3 zRAC6m!+s}$uak@J)R4q)paka-oK~yBxDe8o;hc=kV>j0gKyfDvQcx?xJ(PXv@EL)0 zU)O3CF)DDE=D}ktB-3AdNgm@_sK2ly$FE~g?{KLpG`l#bgI9O{G6WI?qj)~eO?$Fy zT%&7mUKP`?6o6j_ZHh%6smr^U7$=iWd4RSl)5XV$l@4>6nNhP1p=B}iyD!6abmiKP z#6paPuY)8;zs|g2+)9vA#FX3b6(x-KJ33EN>D2M2+&Ou=F?#<*&Dgy84mjD+g${=w zmtK`bmf#{jI4wG}??ae3z})E3OE4_zz^*peXgO`rDgoS}|?fLlKGFx+96~@*-}Nl3yR;Bnlk(h)l3A{TqN?gD z_y{n|y zBu_L)w#maK@;aJVPEuRdAYVQ~+Y?n4)pP7K2QU?h+Iglwghz4Yf0j-)<Dvx~C z23KhM9YF8{i8d+Cp?c~#{tMTff~_w^R^#w^qxn#tqa+VkA!h`NbB{(`{$^wW0o?9c z*37-Oc20+2>`4nZf7?cZtKWWdN7@bY$o#pP5b|6Ys1mS=~`i)gth8w0!3A@YMzD=3h(-9+B*M${{{2P(hieKz?{QlPCl}U!b(5+`& zD;Pbs1i>y2AZY2S^z0Se{C1x5fK0nZiq-ROV6(Yd%zB=djsSnNokf6(S$F=vImS4BK0;ar9rZ`Ad@@D&GMpjulI2R7~KiO&nn8LCmb12h^y4^&m zceUtichieFB}RMipM;f5B?vEj4qFM#=Xvv@{M0_Q<%aYo+i4B`{h!XCo>Ah^*o_dxLf)w0(b0&dcbF2>L6yq&cIw)yHh$YTn8s8`$hmZh5(5P6=k>$oB$8(=av zwh0U`xET6~;z1!>r7e}_m3tMCe9Pa!OaxL71dA`}fUCp$ZV}~uYn|BU1fA(7(oNU} zslLiP(uNjHvT%9KJ86GCd}A@u%L_@gt^YF;Z=OTevekl^36US5nt6x?bi)`96#$#` zZu<6ups3sXz=bU@_A9qxnoGb1TUcIG9#(%{`brSmB8|(W{fzPHgUWZ)lVAVMmI)SV z($INXk)Y?U#QB>7T}AAsk2{UOsJ22sSI`GzdmYxw|LX&3z*ymc`QSi*b^BRFu>Yj^ z303@+Cn`SEJ!9bDQ0vu_&vYpZYbx_SWvxxS zK1)h`j@QtIv1Vm6JbC7&JuNySSMvx3?0>XOAwY2iM$)>5zGrgAxtbEWYa0prILC8W z5M463oJtT#MpF|)UVGqDf3!y?6euQ#n)aP%gAauks~XytW=^Or6T&)%|72qxh-Jl?p+`kwI6b zjIm$xaAqnJmfHFS5sh=_s5UfZ_@v$ClhaO28O4%wV7U-oCFoS#?JW2^5b%oH+goJB zo@+%$nU~m4-`t6P-;bQ_(y>;rM)!H1@D57B?!Y;Dq@%G&kUNEVaoKni(Dp%~z3AM4 zCaw|^W#RB024@)sGl;PuK`Mo_4So3;{ZOX$C<8NC|JQ{bvi;~zSDRYM5Y=hMGW2~~ z_n~?JdA#wUdlkG(Jskdavs$_81+q zlLPhpXZh^CMuroMdvqIQEkhzSf~}7)onTyJ*&KE^ElHaBz1tTWJ92r!liu5rH79QA z{w|9-IDDL{=);TOVEsv~ML#OBLoK5;0enHGQ_-QDZLfGk>r0&2|2b-wVh7k@uo zkSgYDkCZUgpYfp!{=w_cm)0qz<#=Edt?Xj(RVdPek zO1&0ps&qL2mtm83%gwzg7bYY>?@yn0VV*ZV;il8_0ZT_-kEy$Tq99suE#0Th>hh^H zxE#4DB-Uc<~F#o6?_$o*V|5_dDUs|(B_ z002X->pjOJ-146mLFPDUqNa*f2^fI z4iU>;cy1qeNc7N%Uw<0yR&A51iFP5Zf(7sX$nPOk4?4)xbn5z?;q;DWv#5g_HxZ>hKH%>xK$-E zuWxPNj1-E|yd*96U*EE}PL!q3>3KPr=BIO^ z&)arGx#*%h4FortfIcJJ`ns*ghD~a2l0@LK+}n?i>(O$LNx!au8S1bib7P0U9Df8i zI}F0P9Rt4GyyZ8AMB@gWcFBLtR>Z!1gUF98&jk!|-|vn$DL|L1tDbLuYd%6BcJB?E z_duIt>y^yM;btB7=d;t#f-H`fOMAiGlP=du79H0jZ%V!27~lHgFFcn+ckftI%oRw= z4Up_(7Ulntqb3!2=06}r+Oai!oLY_G!<|F6X3Hc2rh)K?0=KjHlH+}<_^JKr49)ty zmOLT;4`|79bk4z^70>1Gk^J9_{zJOR@B1sN^CdTPm`HT7@MGI)2NS>V_3bHS)S<>I z=*rVM^1jUHX2YfNzV&gAl!MEqM7~Vb(4`PRscP#;_GvBsXPeyr6NCtiCE1`x?N0M% zj*kn1Ba1h(pJObCK5FCkWiQ50?Md0orzpPPZLC+L8LODMg@Ov;(P>%$B6s2gL=wFo z0Uw}Xe;FPrcX0@5q?zi+b3U>r#UgIdVXSAUFOrWmfAM7pV$-r1L;M_)BzlH5A_6z_ znQ)`xz?$+%0BEdbPhEpv`@Z%Hfl$oRfg6-C%$356M_-B%wso}fh39u?jeBi+4MxpYgk-?@ijU(J_dEf;uu(4SK?U-b{5K&!2l15;Ggu zM$;5Giti%@DCmeSKNlXB>lZz{eg`Oi z#n<_yB`t{rg6`y7zWa-k5B#p$G5c%(ybgz16C?!e#{*ovYB_d%1LD|Dx18M4baA@pv07=_G(m%x54k#AV)l{+ zCnH3hFcfP3bu+}oUxvc|l5Mfwl*@4gP!f52`&)z3Pc0!EBNi`LfiAU1F4N_38FsDj z{e^H~iK{ogSG*evb$Of)xf@-IO}r=M{dq`KE5@J zlz=(D_S=U#QTI6fDxQ&3^+_6vc(+d}UH2B9;Abepxm}-YsF$?VGQP_hh`{d_Zy3c= zX!?1;(B%e4eU!xb$|^Ra?^BnqV0B<093vhoT{0a|>S<^Gd9i?IZB1trvFXm+)8SG* zU258zvtFgY11==({5E40PFJ|S`sdTNjz5qBC0Oky0|X&S{cAq{8@i@8SX}nan#w?` zYv%g+-OraYtH>-8cjV2)?&d}+Xe5d8*LkP6#yx8YF(#*Yo2^uF=pJXJ#%x*%Yu*r2 z^Bv%oNG8>Q9DA0Q(zv*puG#~lvxvHUy~g8TNnX5tkc_mtG!e^%fhS#uR@RFKccI4t zStR)F#mZj6(UNhYXB!&r0Z%3@#oQ|r;RYP)>~aH4p?Rbpn6-WaXGxaZ*>OGoj z>u0aFhr5bRaca1~3~u5*tT7uOG0lx5LX(dHn{;WvwO(T6Itg<73#=UjbW1lAqwRfl zpo_G!h80$tRSLv9eL}yI-o+vZ#kBl(R5`nL8kg;8KA%NO_q~ah^HA&1dINc%-fbu~ z{`!G}njyC3eP-8t%Um{hGCp(la7G17@OXH;y7y89H$T>SHwCp90sc(()~5@dKlR;T z3N5a(sf(KcqB{XK2^0Z;Ev6EY!`k-tzod!ss`lJ<3iyZ>9AMXh*4rdmjIHh^EI+#v zG=>P={Pv}DRA>}Mro-rAGzfIL$yLPODv~nyYljE_<~vH_z%0;m$S^L=q#Wc#T3(R>>8Wr`l;`=t1!~xfWvL6HUjGRG#+q7;`|dfo5S|lswq(d*XMGhd zcEiH}oBR$y{;jgU`n%n{9@SsEvh=_SF1K+y0)?ud z$u_{tsPTxo!mT9T>wr5o*3LdNa|G;vd zczgQWZDsBy?AW$~ZI?fYM+`s*q=d8b#01c~Ify2NHI=DXM8b-UJ2z~fhI<%xOm=16 zr_VXaGx4C55GmTtcw%@T2SUWEd6mOu8}&oY&H<_zeb5{gPuACsZ!dBTAl3H0P{rtl}c_ zkF`w3e{RS=B(W!3<6UV536>gPvb#hg+aX1iYl4*Ko572ykKW9!x9-u?k3cMTJdebG z$dljwsPVPrJwV6}mG9Mo6Tfd%6^3CV(lk3h=;_=3Mh zRDXwBd)bfFPxw&&{Hc4jh$Fu7xdz_x>OBR^ZSsdf6X#b!%m$$`p>#d{+c+6Eu9sC& z)kDi=&aPRY998k}ZBnKnm|Cm3$=MnHYoK-+|J(5G!PTnG&EPe06AzD#6sbRsb^H4~ zkXKHEz5h!D8^G_)`kZo%W>2r3Ab-0n{Z#WdGkI~S zsuT!vgftbrF=9Ja7h6BHK1y+QdgJ;*u#w(Qkew^<6xg6bwh*W2&pADk3tgGtdh6mg ziyz8_+K}dn?#ETK6JtG1;=9R7aQSt|l*#~Ze4(TK0BfRV-5n?gqadyp09CCcTGU%U zI$!JRFpA8|mwJKXRiiu7U%yH3zR>r(DV+4pc_T}BY(56g|J$Qtfy}FmnQipzqa(Fq z_))0xx{nxutI1DB0=E3eY|l!zhH7z`O=Ak3lDc*y_P>!Huo1Jo-~MCWy9&zs1Rj}c z;Me8n&qaP*5MQvq^llk4uB}MdP&NGM4|*BDRR7P{o#R=((lQnyGd>l8$*cRDC<7V1{Z7 z;&$T{U0mXM5Zan0Q_WfB?bgP3sBM7ljEEj8I`~Wd#MWF;=r)+q zxP;{?i@CIXrIVPcAeZ5%nGQzT@Rx;VH2Gk>Nqt$$Ynz2Pk}h7VbL+<$38CYDGlE@#OQwK5l+i(Znm$Y&`mx zfuPrMFpUNd+Z~LiU0j&C}2O+S=;q4YJ03Dm6E)MPQ4OyxcTBH>-GkJ zySr63&APR53}op@;*d|hqgI7?FYw66R@mGgS|~JnK*J71Y-gKa$U@ zSI_OKbVJjQr|EsC>yai^*d+PAWbUx~vPUcY&y7xw2HodXw4-?b-Ks-sSWTnqMg^~) z_uaT?ryLE*$EcMjyxUv=jVKr=l<$176uW!(VswW;g8k36m@D6ZB*ntSqw3EJ3{Vq8 zL7W%Ebej73;d`bc$j*!jEK@I^*cE4JGS!gMq_HI+OQw}S|OvApN z6c!ca=XW^7=$pC7${E1(0C$RTR(}~Pf7!7tSVm#;bNYL-DS^QoLgjxMbdNDbK|5SR zWN}CnRjs;KAoUzcjM%dt*f>lHe7BRA?$O52qqJZ?p5bk|1*S6h83WuAMYAWbxP^;L z-&lCtESy_3yKROx>((A(FNLMEfa=rG;gTP^pS_F-vyR(~{MOr))F-4>@n-VEKb^c) zc$PJ^t@iWnLRLhY{-BR zem)A0NXXe-ckkl$t(z+f?(Q-J-Af(I-Zu2-fa5QymXNYf)Qid5_7~>JQM%TDIsCiB ztH9`B`8^lJ*9kZYY&fW)^+Y;NKUmpLZ*>=7+=r{Zcdja4{ZB0N&$J9ULxts!K}<uZP5kw$55g5hk6;`@8ix?Y62La^;SRw z(_S*Sw0L+Zh*!+gkSI4N0=}rXC8N5kZ<7bVU^AW55T#i+Sz+9D0twwuLg)N-5+EmhC7JD?CI|(0@%r0GWDoT_*glKJE$hD*?2|sp7S%nk4tR?=c5{D z+ZA_ZRcIR`TvXbd20lf_{6>e3i(b|~xJ&Zt!^ z6zzjJvhaSnYqE`Y?l`<91T`-zvd-Y!%5v!qdI+;O%D`Elyc=t?`WeaF6IKkdz_*dJ z1nS$~ej?UoA#7`#6)&d0{-R`P!5#4>?m)#_HB*Sr?&xE~+w5f^Yc*)_C6O7y(6*E; zcjt1$onI%MJ_lM{8vP3m@M3(HjFH9Xfhy=7xL`i?UM}8U0Ie_)&b44%+f-M`SZ}^g zv56AXt#4K;pjKKbV3-5@kiphvMWSiBTm=d7unt|d$5l53xm!@p8>FVxk5VlZo;O^u zB3JM2F8xHauT!(e%a}j`@aSU3@g_bkpZ`aa_UZWzzIw=kq9f}4OmhS}0r*Bz@$zfu zQGqaEQXtj7Gbc9-_}R=1Rx_f6`5$HLwB4S1NHb8BH!d?+>2eYVCW1_QI?b=OB=ne6 z9xueIqo}F=DEzP~o-umv_CNWMJwmYmo{@x){`z-{p%K2|wDbd=DIqhCi}SOKUxALg zGE3b`{@fO0lsnZUBxxvTi>g41Y#wDH`ll>2?^x98_w&g;s4!%E1JsZ2eq1Fni|Tc} zV2OO#Wu{Z6!2Y{8ZS_*FV96+rG8-wd`}xciF-h0Pf@?XCR(8jlB~#DpYTtfK+cVt=~>s*35oBc$S1H{Gmj`Y*D7PC~!t#8wRKmf>9J4S2fZ4nBoT*cbF z)71e@;KZ8g#(uYrC+?4KrJNNU+mBlgrnkLKzdQ9s@>g1JFDPYT@l_<2^7h*!G}|Db zOB+y(TGZW#>7?gA8c0C6xobF#<1QfXo40N>b+%raQL3o7o9_MJa&L3k^=d!&axf6! zT%5y=5fp5zJ>WmghHczl?>^6BdTxAEv-)j1uXv9nNaLAaVQ4#b*e_wyEB| z&Pp?pvwNhA??vVzsZoR&&b~SIw-}0i5LfG+KEN_tGAlPXIxVOu>KoYbpnNAfjwaLJ zzFfTEZFI!xiv*;nrK{A}(XdP(|y*};Cw)1tRwb4 zh#kWa3H7n}cUU5uGK@f9I#;n+;QH9EFv`P=;EXLnxQOBlwI|u%F{X^#81G(SR`-bI z^_+r!WYUk_Cxxw|*}ul}U%%LGIA2y&ET@kq-Q~>gCn)m!nZjToU|^-&2?)MaXHjl>obUUT_suhLn`G?MCZt(ZSbpC-q@)&4Sg zN!d40s=3cg`A4Y=S5>-ko4(O>{ib`)ZNt~QD;i6{42{pTgGPA}vUuZuVRBaI7Sr<( zT4KPGuRL7Y5UvilGf&}2PsGz4!ty?JI^gx4i$3rq-HAkzz~$!JsEMW?LyMWnjCa;=DJZYq) zXc{^lL}BtFBuxDHWA@Wsw4U)^@2Rt1K67e_g^c<5mwb<+Z7TWXP{v`GOQNQxc8VH2 z%ed4_u2s0TO9|dQi~wm#iWSXTS|$lyNsLIa*}qv=CQ-6A>F?TuE_HrxWkhCYKaesv zY`YaJV_Um71W0(1h8-zQ8vB~vG|BhLdyDQxpn2M{VN_f(+z9;__zO5d)=UCi)U#Ap z@te?ZVV+`Su+{Qw@CY+oI^*gI;!!uUf$67S>vwP_Nj3NMDMo1=T6o(Sm{d;*ns zv1N_N_NsDubaNua3S@LuyFv_d@UHUoT%+IK>#+07Y83xRynfSoIncW<@qy@izWXfb zF3ikn-CrrWE#{(#;#hKuXd?pB*MfUu@dIS}*oPr5GS)X{qewv`O|Gki|K(K6hM zK*YHAAHx&oR`4m$^|RLhwAKsHY)N&`J*mDI*YC{?Tipacb_{Zkm3xV_=9iAZ(&O*i zTi5_T?=~@P&nTs*akcdjB)W7VOs7|PGs0EIh~5zlS|h)m}#2G?j%kBh8j2te&o-F@5Yggy_noBuODQXmR9D+oUi@Y(T?69kETzWq^NaCBphrZJaSC^1?EuMw5z zt}A#Wv7?p`YWJ)$*k_8P9wldKC#)oAAW{z=JN&7@$Q7>hj|S2on6e_8-JYzKzb>z# z*Kmn(uKeCT(LGjf;Blxfq@|LTO%K2ZdyIru@%mf)$$&q`xh);gRX%zOWneA9l(jmB z9Bn*S;4VXvbovCb|C*B(B+5s}zZZ{t39E4%r@jgU#?g4qL z2U$wIXU;%DM_teZ$6>k?9}E0wL^p&C{)r3Fs;zq`&i5qlUif$NFz=I?qG(#QFlShT z$ot~oi&+Z&Yr}JHX?~Fr>8Eok~4K@3K-g)&-|~3 z+?ZKeS@{W2dySs;h*0{uUQ`fi&Dm$pA!%g5M400}4!42|o~Jue=MrtBI}4Yxvj2&S z;(}?r$`Q8)b+lb zkpCamBXZ9P=!6k==h?@@w#D~&g8wqyLZ@Fw_pdCaN()=?*X2bW4?a_+Mu_?NCUSCz ziIQ3{?VB*1I_AFM2L<`||J)M94Ag$z$n%WRaL0JlsB2u?h0ztz7vLSz zyBqua&DM#6)9GR8ta@I1roRmT42XRavX7#@miILWH&VMa7P@MZ`83&JojdJbZ2)f= z4RZG1&TPnQzRDS{m<~*z5ezQ%=4#Eu;zH*XVtxwHgxj*%hbvVyk@6U@pCItPMyQI=!GyQmF*^M*m*!Gr1G12KIfONnng2QHg z>aIy7h=0jXaB6xSxqNOaSUX8)&-^(UMS?b+vhU~JKY-@k9V`MRK7ajg`FN|0V9Wp8 z9$EEW_=|yYE%yUyEaD?PzH?J-ERoP%d3!!aeDmP#j)H7BsL;Cp4x>({)$Q*~aYuaj zogd8=jI7WNX@vSV#*7{b0UR_)LI9KD{zyB;MhANxgtPUym$+YFGSe8Xx{;8}%?$zS zRI)evk%kp>ZsBx9(<|^Wx?{@6a`Ua!u<9+8R>JUfsE* zbl~RJDoH&f+~W`5Ku+6b&#M1rn6lB;1RAI^C*SWg881wG`7m{zFRU>6WqA7#%3Hr= z<6@LRNrweFR{qwCTu>g|G*w0iQh`1rWU?7ZdZE8)%jf>owFs~?{re}Tbmtcl$E9JDA*^5^&X4+l-9r~XPkuLco&Nbp&&2TTJIiZ=dcNB^c4TA7u%kK#L9(n$nF&-j) zut*<=!H?!N(fNjfr(Y%<@i7Y8^GbWR7A9dP4;%MUY5VVpA&ALs`tkJ;qw+A>6q~>q zXr_^4uIJnk*O@^4=hMa!`A!d2^P7)=z|ES%KT!RCeBh+ki2&Tf8EJhUY+*t5_BL$` zT4qcWAzGe|%M&@&4VR=Td|Xa3fwg5N=LMnn_Up|o+;8yda^zXv7RRwC_Q-YIJ&w;M zv?t*7bi)5K+!=0=uX?HT2_M#kHOKshnJwF0hf1=QaJp%a)&N~~$;;=S8f`?k*5!$j zofXUCKinP#xGq{m{HXGY);b_S+H!=wH7%$s#T z41Nu{HRho=1zUA0rhWEzJFtUmITA@3)ATospY9I67bV}urwaZ zAsY9z-~G(W``Q&BB3HbfM$YMYie}Dy2KN!-MJG@-UF&%Bj zVbcG5z{r9>N(c(%0PJ^04=<};pwS{OP8*aoZV8c>`)w#sXsx1(Q{M|EPKT%+9PO%p zJ}hc3!AT5pVDQa5O3u~e9hiUF!*CvPtP*&c=tF2{LmTl@Z1b~M{6x>*f z%tZtjT8C>vSXOIOXY8VWw=HQb^}no?jQ{Y~)XV;cb$ApYF|y2^zeke&XX}0W&u6(Q zM+&~*LCNRHndWxM#*H89pAx3cybZv*hA#>@-o7IJlM7Q|GYpAnQ*ivbYwJ8t9Jv^b zwz(X5_|D}6t5yAmD1iVp8U1xpMab_(V(*4Wipw_GtJ%L43?!?yS8tF8cRDXr{r6tn zq;ph#%;7BWE*p~4ZDbTA4aY`g!EU}!VA3#_$N4wpO+hfDr)Hz_*0tkpNr%;QD7H6{ z=W82E6W>1llQ^B1hgxL0^3L)emnsvcp`}hG%~KoNbkgEa+P(s3{>xAVldh@zJ=e^a z?G4KO&Y06@B;c@DL#p+0sAqZd+1b!D8D6uLk0ig`1jNw8fbpO5H;8jgAs-hq6H|sw zmz9vtNPzNFTR!e8Ywp0czL7y2sNuOXNEX0PF*Q#ILP1%axE726A$ULx-ac+s*!^lth;`dd zN?b#PoKjt`ZFGFCmwJiV z1n99|zvllAnfHmtV@_32Z?$>(!6)QF3HCZhm8RLf$QaDbC)xcmnCaN^(Jc+V$1NnS2UAm{a`1!K zX0Yb|aT2Q8Vx(>Q9qdpM_F^g99eGyzA~yg| ztGB28|ABdA`DGgqOCJ88M?gP!DmG}PKS1Y41knC^uwP(toj-H3+*A2~PoXy9s*q;J zP2Nlc4i>=@GxB*8ZUF#ejchUS(`WV}Fnt6B+nnd3AeBRd=1mU4MdRF^39#`z5W68g z`Dzpa1D>`I(iR~g6A4~J7cS^i$o1xmtBFT^I_J^!upk2th~vFIA*rKJV#DyJej%(~q= zO?8_7GWZ(T9?+!HegA2EA`*bypJqQ%Bb)2jaqIK-Zhs867AY=Cf`M*zQ!wK4n7*%) z2kSD#(zh+!c-~u2ZocpNi9l>puc|A>xq3F~h84C27QJQZvni~rdh8O__i$3~BV7-0 zor9fa&84c7rw^*2+q{iciNp;X=gf^}ckM6Rl^nOAr2~AIKFW33G;|xgkL8t~*!CBe ziRV9k(^JO@oXy(G9dh<4B3j}LwnDeL2fh$u1e2LOkxgyI<|f@YZuUqfw_6;Brt!x% z&{HL1MnYPc~L;S#iV4vH@@8$hLxHu~tVSVh^X*>B+JGbJEH2tzwsUhM_q)i?W+0o>Z zBGe)qCD&g);k2mXmmBsp#~m_}y?s74{{#2+ML;sIYFBc3zr5^cU#lBukH??pf_ZFi zk9>U@3%+@Rz+t6FM?5wQ1l8x)z_Gal*i??$2C#e~>p3A3Hj_;0{WZX%Vuab({7 zE41#{_cemgSGm}TyoaQ(S%G(ONjKc7!kq)|)S{2ivQ#z;#%?0e!iO)~^)mzyUcI1-7QQ_z$_*E-0V1jd_lJxBDKN9NyQ+NN~Zmcsp00Aeupt80Mk~x z<&X+$;aXsc_45dh58aJ)+|9(mc*?NofuZZ+?QJ<=Oz_DGfjqm@D|FBXbZS=q6M4$B zdtpB?0Uoi)LM_p>m2wB!R4(7p)(IF=#Gvg_QQV&}!{FgWp^nT-@FUUsoAIt6;5V^z zg=DCbUYb})6WXV)l(RbpUq={g$R3Q~U#k4MhnjEMO*_`nte&hF+!PTJ5!S^G@TEs< z!Og2DHB)XnnO!|V4Fgzf55__i4VEX{#i|YF{YLyN*T^aU=zPh*c=9HHH$Ma*%&RFN zqG!4PhdV=ZXp=@?N8RWw3?1@t_4v_EerU$vaQ;UqM(TRBF3#Ksa%jf>0MgxZ&*SFf zr5I{1p7rB18)kqi$4^r0Sb(FIVZRc^3zv!s*iAQk=ZWO(trNCr8ubj`Mu>3iDG^M9?yr%<5Dm9xZc^@1=k)i$NSaB*{be0#k^=8bh86%unU&*q`(ksqdU0c<0DDiL$=A})s0!J{F+w2+d>!2 zl<9`b!1}gu{FH%P8{eCL5YX*_m4CbCyU0_5}cgBM`Ng*iAAO?l5J>lGUkq_0J8us5nXnn^WssI3H^`iZx*rO_X~jE76-n(QD${)ES45uo~c>Ji>TCSG)c zMw}U#waEkTOA=LOW^!SVh8)4yBFx*Ff$n)pu8iA`yU z-oAshG;g-25dcz5e%J&@_}R{``AP7>fr5_!9_OSh>ZD)!&hcVLuQg4(>?+-7x_N~Y z08h5>&B`XHsO?VakrtldQPc>|KlZ2zYmp~mbKPM+CA|mbJ@G@fGZP7Bb|u4IdejJ$ zbm{RCpg|J3uj8W|m$_~9!?zVBkJo189Q)q2K6#j(lJ_9_kO2KNh9|=q9uo{#Yndmq z){3)bjshNGNH-053;Moec27THG~`C7Vwoup(?^*_$ty!4c=7g=@~xT(dG*(TQ0bMlm!>1BlKFvbCbn>nUMQt#Ou zVW`B!6nTyE>W{Xu?o5`WxJFI~C58DqRL)!o$3x}9rndc}BgHjJik03jB6`wXu3g_Hh8_TZJ3zV z7$n)#+P<&xWByQojj&AC129&WR1{}UjNCq&sQ1`!lR#}A_n5UFto^&y?^bS-f}9xx zW^A=Q#4x1fxIv62jf_`Zj-=}uFTBziE#tla)X^Pb{RyG7PxQaUo&=E{jx8%Bq>41l zbgUK3v`$E&F&Ph)tqVb`h8M;1?;?62Qh$3*rs%Dsmq0~Ehr8kn?e9!XKC=XcRhYQq z9mK5Ez!vZ<@mWK!aXkRNPS_I!#n|K0Z;1Qyow|7gy~jHYv*}B)W_}530)HA*JzZIj z>$*2Zeo*ds$_Nx<^P9_+q}*1Ud=qSaQr?)W{CDQ$RU0@v!bPY$0B$Z{-kjfMTx|Be8Nr5J$d_f_;%S zm#e8VDp6$|itr9EbTPtRwx{iVk@XJv((fLP<=@;i7iYZ?K|-_O#UmJw>9WYX*8h`& z7oDlp@8d6J8&B^qta`R)`0TYY7ZaW;QH8j<-?l@1`l8E&9-RQNN+i-2{dalOiJd79 zOUf~J_VS(%czMpOXq0BzqhSd!mrWazdZfU7mlDf>aWMj%TATz4w4ypw{p}rl-Zwjp zOpUHRu}qipIeN&QY^xoeDSX3obep)87lQg=!zMwDQX#hqmX>zK>78lggkuaQ6q8$Y zq>jD5-&MEmh-X#-)ta2rS@<#0TRae0`4;!V5a>b2PmQ1tD1R{)Hd5KLymx((yVx3D z27MRwSol`{RqSH|(Y2D_wSaEhYFlWVb#nApPR74mvRi^J${j=d3Kk2?ZQs;y{lDt%f09C(zh?gHj7MEe#3lv<-TV3zL3Gbv+x zZF_o_hPY;A*Robhy^CJS1{8$5E&CnR%ATW)2x~>v=cvOvF0l= zz&j$MSkx2=^t7Yvs-p~18JCSM3QIYuA3TI_)Kn}G3)22q>FU*Z*|+-`>(0L66g-(` z6d92F;woN=SupzRlF3!XuGQAhhU|z!hcpe5_btIW9=EBKB#a6X;$i->R2adGezU9i z;i&7V+I5}J#V8c~Yi|UhaAI5*QSdq*n0WR;-K%pfpRji$?6c}$u^X{Uo$luQ;S9&E zvzjo;F-OX5pQXI_)*7LO@vHHVmC>7Xwy3x(Xb>wgH=U(tU0ZD~TrG^G1FLQzmn14p zCaulDzuY%A(!*2z3734`>xjhD)p$BB+v}yHL`uFf^CeUw;eawZi_%l3kW(8~h zwjQYHLV$pvi@;zn+>7aNNtV%A!no1g8H%}Gb~3nfze9ndNHS|Yqi4nCV z)ketfrB%Bt;-Q?C58-IKWWj(u`f=U)YS_$-7dAHkoeIF34w^*56tN`RkvSTN=ChQgno zUXm;l<)K|ql3FwPWB?v}U!j_^&vc-WSZI^r@{LGFHqZgiSU8vYp%ws@5in`TSIK(-Dk4qA#%26pdhMtcnTWKg22$%GiY}Hrq7W`e!(TdXG%bg3W#HQ7)2c>PJF)INsO)U&`Yc8jJro|^R2F=Dwr^LAeA@A{SnIio!6HY6S{ zk@B5}0aw!gP?bf}(XNkM^0ujb{jo&`D^ z>`G9tm}`}_4 z6AGCCFX(j4HgjX8oY*`G66zF}ojgsD7m1CV4ic?=82J9gP5;*bfMIaXhw-v3mrmMj zHs`w6?t>v%Psl$T5O1N=a(PTFW8SJ#KzYK=uS!-AzT$m~_GCH+pTtc=ytsAPK&fg0 z9lZ$Nx5EY0buirS!pS~OM_z%a;n1g<>1{PK)%RDFV4w-@eK^d%zpc2Bb#KG%{ee&`X1nQvpf|`t#JYOsCb;XhHcuO-e^)@=FMKqr#@LK0adDT#Zy!c&VgAXqU*cPh0 zvqoBrDVuQXs{CvXd`47WrpUBSy{gebSczki`!afdFXv5mVuF%Koa$_V*b)CaU9BspU?}(-{!e1JVaPQtJDZi^;`ixizq#4-~ zy;Lzf{SCYw@jKn{;q58b+98Uf{{gR=+kP$Nj|F%Dw$Jhye`k5eW<7XNJIE8F`t;we zKlIFtJmegNzP-+lNgiiiTVrZ5VvQRAQ4~=1CynaF$cq}%R>ULh-&n!V<%^8W)iRsyJ$@bq~MuPzRDbi+IR-k=v1=nE5BO~^yO{H?H z`~OpL@T9}z>+7Y(1mLpSwfB0no$usN84j%`Jj*c7rBIJguL@k^b}1G2&z<_>Upitb z@J2-0l?BN229-ttQGwt8FSm$)v1#pah*|yLt&PPeju}pF@~n@U1qIm#3~>*+(;(|9 zFwW$m7chr+Px8bm?^r$A&ae;&GitmeqQ?ef=6RoZh_K_{Gd-^RJ2Pn(-UnD^H`SHSkdy*5DBXy|D&85f%1=>12SPK8st-`C`O4|W}wg3~cmnL&i9^HrhQ5;4h zG<__3QZ4-Y@@>Z#(szbr8xUqTd+~&&D-T9XKl8RMffOrOk3kxOq!milknWda|8DWN zWmDF@{W+kK9H*R?E$AUy?2}-lV>^B06Na5aW*jLU{WZcnhhwQtbcY<11&RW~MRT!(FU5@2WPo_NS6Lp~>d;*LqLIflAubF6>YAwGVE@38bF41=$rgPhP# zJ=k_K+nj{rgp&RLfuS1qXMME z>Obh5iT=0a)}J~#DEs&s@1ZqCo4aaFO`&%T_n(W+TJI_~;f{JMdBRno(L_A@US_Zc zB;7@Het$O@q`AY!CbO0(6rCI9*Jo&-{nc2IQ}CnDN#|*Z+pg)%Ld-nzk&m!X0EVjT z6T(}LVxG*AOYBTaC4hP74j829{$H~G&!YZW=}VpybI1F2u78sHl6N>VO@oaAk_}EM zx7s#M5Q}gkGy*{pNO7!vvH7it1U4w-QyF(W**+a_J>q!TTJ+ZGRMu|y25})W6`o+q z{nM>1Z%AQ@yz`?W%*KU)$J_czxWl7K-FuKa2>Qn0_;SMJNQ0i+B-r{uk$iQI=;ybq zc-pTJd;Y1{_(0qIy75aX9Fa{iTlZN!sURWTtm7w!Z~T!~Uw>Y{dANg&2iPP2Gs)5A zXVN`y1AE7w(C7*J+BH>Sp#qFT!nNVqqbnB14J8e5cuGpdluZm5^Lp4M{-~RjOIqxF zywz~^a^L#ven-Xv4!;$+%MjZ16{@5r1-7RV`N0U=bV8xVS>4vAXd$8To{Dc?U6`fy z+x@#WeteGHZI9K-MOzicEp0aouQ6_6))QHHth{L`{Ex=^c$>YQfjo{kz4@;2kS;=I z%YT0CKlVfm1~(tkyU&c65Nw^YCbf+{-&m)EGoP!Kn5KaCoNq>v^ch`ytQt?w8tr{= z#P}?t17YjEjxSH>37vP z)L}V%H*d~t+nJ^<>|o<+PtFpl(&lS)R$;@t;xel5guw(JItd;s0R-)H+CMH@2 zUiFTA`3ZiPhZCUD)6b+t>q$h6g|1w-e<3u%tOybW<6nPfv_BP!xasJnYQceY;bxnm zyY?vp?_BvV1j7b++AA;nDoF8~VYT|xJVUqU7kTt$R;5){hXe3%b7cGu%vIk|upE5Z z9_G<^?BSO@Ni?sudq1qa6f2?>qA!z|Egb2a<5YLC4bMzp@k93;<8WoP7l6{#%ZfzY zeoKd;-@TxnK$+pWr7Z;^_WPr1O`Jc{i;!glyyrv8&G=&nI%KSsfn|8}0gkbWjOGt%KENxjxhxx=it&9)kv$X|-iD-}C`WLh zZuC#*q~HHkG<+5(B$A@%^>BsC<&8Q!C$yO1M0RRk6P?*Rdxc(92w*<`AQ^Bc_65(> zX(Gqb&}GnPu!Y{OLp7nkr!8$y3;&C|{g;VkcKPiyv9!lP*sBSg`Pw@IrsBj4-HYTt z(jVY_WhX$x7%Rjzu${c;a7MK*XiIp35=hh@?E$5qqR9 z^gw6SY1G}rH`?dd+SHa$$x7f!ay;qnFf|T`)LIFHHCG;V3dL=s#sbWnym_xKhUo&A z!ia3l+rL|7P;@juXkl#U*i1?L%{E4yrIAngXv*Ytf4LVr9N&7T@xDp9?1whkUPSNB zZ7L{;X`&kIqPnvM@+BT7zIP|J?HW$FTW!T4SWi_gyD)R64keZ79taPW{IblNREb|o zQoYz7$C39@>yEs1(E49lf1F!+RMZYXNg-lU12&bSMm7Y`^gV6+r^a!5iKXB2{U)z5 zq$#1dUNs{UP7gPa@C6)wI|E-lBKX&s32xu}F(Ks&X!FyT_MDStd?f#6#)7vu7^k&U zWO0)b!(vj+hxFBLB?j7l^!ioXy2Anxu4%a3WwMTCx?K|2GScAN)9)-AeOH0)_4d_^ zGkY`U%$H3qnAxW7-^f1PkR7T^&yo5bxNAxvE1X2O!_7EtT{jy|hr~3Ur5cpH0wxs| zr>()3=d&`hP1{~pF8#aJ(@3Rv=jC-KV;jc8YHntJcjT<$a?YVEK0NEOcCJ8z8G18I zLM}U|UOg#>*8s*u<9$pYa|df>)^0tNurwpbwwlhe>Yt7J-wwKGPaX-@d-I`6s$R8_ zqcMW;%m#I}>>h@yYHV%=ZVPS9RP|UybQcfSpZp~wwh<=tK##fZM%pz=+EPS1F99N+ zflBL${AR(Ew2x9G9Ibo_TOSwMU11_2(dt0FtT(w`%|vpm_P-!J>?+ zDPof>hsFMW_kj44(x-X)qxBTj`0i|VpeSt6_5$u#gM*xQ7Z^>nX z5j2rVH=^N2O`@i5>nWR^3q~P%5mB_^g;fmo!ABm~{tp>6E_qj_I#< zheb0nalx2^G+B>(6IW`&S$-cI}aPsS{Hcfx6LA1U}~WMko}Z$I>=Y6_JTZc(v?w z+vUsfCprWwJ*kECqI5a?H;&hC6eo!@tQ}!xhZdio81QCcfAwDQW8NmeJ;aw=lR03K z**?$MJ1r4YI{K;Yioce*=IA0`8A)pI@W_wKoInl0f=``G z1u%yK_e@a315ENIm_9XYWLXEN;37fuTdn6NbBO*@X~=-IZJvNg96Yl%9;62bYo{=d z$ZJat5I;=dNv8nWRTI#}EF{pvFxdX1j$*6`kE@`@)4aQ=ApuAPXF2jvBI@`C-Kk2_ z7K|iyN(=k9T(}0i6mAyLMWx!kwp>mGVQFgtdk;XlZfL#<5!8@PiX7_tyedJ*ntf@J z=A)eV5OxZMtoWIXtTTtn!72^@$_v8UvbGo{Pmry8N>jQ$4Ym~ z*@6s)Bx>jMbiLGs#pt}m(s{&V+<41n)>*E7Pft|Sy%t}5jV!O5RnIEO10wX~IpZD0 z8>u*NP{&Kx$o8I3Fd8);O`f+e;7@2rb-C}pzAljB#*udz>+5)SY&G_v0?r#7=KI z^L$jzh1_((RjB<;tCtI|^bR`_hO6QpAovjb0qe zwX%X9hjJw1MC|`KiE@87d^r)fY6vWGhjGyrzY0u2oZ|*g4q8zMO@rcfOX7n@w zCXN50%v)ZB#?}mQReTwPFXqopARiY=e@68ZG@|=|(+Yu2=sACw7~MM-p!21fgp_MY zNr(Ab(fmmIO0w+0D)JVs0^kdVd>`Dt<}J_4y+TG}D&5w$4;5nBETi8R4BKJsz8XS+ z0O9Pl1m{70vCz;46+D|XAp~V+W^&kAAC%((bvr8=nu0nY@-Xl`psQflL&ne5$5)}k&v$3|H~M8=9X)x`^SM;AWVnxqwU=OXSoD9* zfp5TqI*(?>EKr+zRC-oZH8P34Bje2t6$=-%b3sPWUyi2yFu;M~^Tx})ts2rY^1=-) zlKNyd=cgqpa;sW6{mx=@UQUalrdF=1!{b-wJ1r8evGh@arPX*6KictrDczQkP~F=M z@8VBk>tFfvkz}8nxj~#wky6YM!2&X%L5M~=p*v$^Y33$xn8V~CuYY*s#ed6Z6*A#Q zdN2BL`xu1O{T}_~c4(Y|W%%kD< z_U3P<*?>Q_qc+;u74zt&A@seetGq_b*(zm}`(L17{ zBmP-{g-2A3BOlIeg3K218JCQ)^Vq#?k5X9u_&&FM)`ulb;eWH|!Yeo+8Sj4A8rH?x zp|k|}99>6`Zw+los4%0p>?s&$8QTS(8n(KA^i>u>{@k-#%2+Zq!gY_CjIV7!jHGa} zgCN5_Vfu^t#36>0BjnPKKXbR@H)wa2?#$rCRFGK2-~kFD*s3u)cm_iMh)h2*aOC zB53IZ>G!0Ew~jDy1n$LmNtw{Cv^v|0)7fj3Prx*WLOK(${p%_=9H{Br%|{`h6BeWc zLWuQ$rKL!&aq8m2O7wRFT-Vb$Bj~CHn}{M!KaTV^ljZUjzUg#lc@i+1i_VUvZS*V4 z|FLTJyrg8;{Hw;VaDjWVzxts@xW;g;{A-)qL;}TiL?&u>MmzqXK^$siXrN<}R{7sS zAcZlMn8;?1Usg5QkraqA(QyQ zz2Rt7-V=^3lSB~FXzP^n4AtNAUWrO`VJ7ij7TshsWxSAE%(s;LqTvWc4iE3+8hCLl z?1%(xT~ppcgw$Jgc!8lCUbP#`sZh%%CO?Lk@-^v+5bT@wE5mqFl!ef)Jj^>bBMqf9 z9aax4t@@+Qt{eJTQS{L*cqAYHA0uM|tN3x^g~Adt`CF3Ihgz~U0px^n7V{{hi#-t1xi>I+s#4h|fOtpy zVB8^7AfbB`X)~{b+B4--+3sku!0qeltD0urN*ZvXgr&_s)#!=EYlVSNYGE~@^|<{z zBlnOF>8R*Yk!11?2d_hCk{fJ6pI!XYj)YJvJ$6IKkSA&rk7wipZAZfC7!hnHb;(Qm_`WajQaB=dmsoyz}W=t(q2-PoI8E?MBgX3x*>mK!fs+sjJV32GJ{FugkUcdw%E zG9~xq{;eVacHwk4E>!64FV8Awe;G}&XOWNCppRJ{W#2R6H51IL&IbUq?`GI|^n9p5 ztIC~*l`Z=F*K@$>cGA#)=l4piN679$^nA|W=V4K+1@Z6xSHW@Xy`QxI%OuA?4`}?1 zt@szeBM=D`nIBEp2HaWWtThT3L(tVz6WanbOfr!_P?12r1$yx8?Sk-l>(NnFpA&12 z$8%UuN68DTnI?#ii01E@g4@)K+$B-BbpnOeg&xX7nnCiGx^>tN zeL*quhyG7yiudoqT?IAq;@2(}rbwHU(0qps*m8|kPP^R_5tH+Ro{FY!&J#YGi0X%E z;{c{dD+n`J!SCE!vstu8%H_)4j~5ryh&qo%$1^6B+P#i`w0ZNh z(ieHy5}9M`!)&mw5cI)aq_tVX@Zf8_h|C*IZ2%^!ZxzAsNYBVI$|V& z`zBUo5tw~rbecez4lx|kBV1H}T1>SUXWS~?+ICuKt>MdS$y8$3{4fFpfL`Q8f#bC?uF!1K8rkJXBi(zk*V>5zy{`7 zi8bH*2?IUlVbnbFrj1HWgoK)i>@wIPk2HnxT>c%aG7ypeKXp-p!X^` zNN**u**RQViPeRTn~eTmzfMCm&tI;siNsBLk7H##?aHLg5kwLff7@MEIN`7M>?+rf zGpJ!E?oU36PQw}^&2NqViY?99)LX+jh&!$#6%Z>Dhb_&7~#CPSciS!ccOb`_`pmHd8n594*s5@hNIYtsDW zZiKq*vun^+M$fmWE4e;ZPV90@E2g`zjR^rtBD}E|9)&#VbCDkW#yI_~ zDkN`6o#p=~a5@#TQbZ3iz4&2*!=Wh}_D=0tN)eL|-JZB#DiJMhXIs40@56AW;&6JlGkyE-^Z(SSd=u(yUu9k`-Eqa&dK!kW_+SsNS<@Zwkua%- z}C^tV&$AQ|MtcWy%jt2J4ENQ+Mt>B6`3n>s2_vmAxLKDmwUGa&SQWKrTR zwjHc2BIp@Zk@R_RX*~*Mf>i27r&0^%HzE5qo(e9j3#ee#6CO9w>2T~^hE~pBxlq)i zS0Zxy;^(1|9gg&?k4pA0{^vg{t>Q;{yhW#;KEXjK?L^f-kLBkyb4wg}v(kxh{+42< zm8rhLi$cTDWA|0^q-B+JBpoc1AySE2;Ynln$Mk7<+boC< zOW^#l{nUR?EYi;}JPA;#iO6~-^`tD9t0fQ7lrD!z6N>>#_-*6*K@y$h!M)qIjh(0e zv(;*xSVCQUxVkmg{|z7|W@Bt4s9`X)A;0~A;RIfP<+W-Vlt$oz)}xQ#IC`<-3=4;I z0h7jix}jp;ZZk3sAD=m|mLg!A3@v$*r5x;aINdAUOMFE~7JYqKJq59^)^)S$f^KGj z;m@eBx!qi1S|0?K0*Ua30x}MDZKE}O)UR>Ku&Fbf3(>;eimrv3+~4W5eeZDjWWJhM z0TZa6)is$X@54IORlf-*u zw|$D1>|-v#LZ6h6wJo(+!0&Ya8z+*IxQ-twP?wOAK zfMd|Yb|%QEt8(4y-bKDK!0Aa4cK;0dACJ3nj@#*vb^b#i{?+?UrGLllr8$cyCUCt? zm_TDGkjh>FtHNb_N@?w199~ENO`DzZHte)4-2ZM#1WMNX zVjTX|L8Vx*u0B7*Zi5nYenhAc zJ*8qKtKgW*@~T9j@Wk*+!MpO(qHHzA6xi=GrL6K#40r?$VaBQ~i$nK`#QU$xa#u9x zGoKO|@q=IU&xW>S<|IO5L2vFFuKy`N(SX6^-@7RcGHY^58Oy_{uJXD~T@KA|V<--d zqZ@E+AB|@yG<_a)#pP(WbgrrR?}#T2QYversR8Bm$%XOSFYju{+$$$~g|!8?BX1^4 z4p_C03bkuAn0u2kJ$#>&#kS>rc8>l3-CA36`#S`dif2>pUF3GTN3Gr2Q82^QS&%Yx zL29i%GdPHkA_bdMM03f!b$E;b?8VP51Hjqj*UWu&Db-k~5PDuZ1jLNjG2%WP!2dW` z92SQSA(@sy^*r1)R8k|{DF7yZcrxQk3h>GHzgsU&#l;gRIy&Uea%sw_B+G?A2+kmn z>xL&Z7)41CHAxxtF0jK-eo0qSs}x`|afJA`posZF2Q_S9Djm z+%mJdYHW()uH(Q<$1?cab(8W|Bk?{W{gq;1@yAv~WOF2w;F>W~xXT8rJ<}KjsU+!Cm zNGoaX%-8!j^QL6*(OX$@(~6piBzd10;`-C7)h{gvFZ){1-%x!J_kc4IYxzRvOBKqy zT+R0^qGa{csR3+KMO4zS=7N+3?nwpV99Z-E3TBCSvOS4M?IF;etQ!8$wv-vY$ zd+a=eOsE;e9_b$%tfs&H9~>TIcB~TlQOQ{QBz;12>$+XuJCNm=Sm}PWH_s6EVg2RE zOi&?~nj_|!qxY%U{!yhunfJbgMg6RUhIx261jj!ys}_nprLuL|uBwxi5%&f4?NYf3 zHq8?!{Todj)`1aMd#5#;1n(2!!Dku;ItpQRjZF(mb(fXFz9o+{Uc~QO&lHx<l&|>Le#;uU2Az@n*69ujYw3 zPR&BEv2^HxzyRHiieg=roCoH-UGFkPc@$vd792;YqchVentKI%(4+c(mkyQ^5h)n( zJp287A2B^0%}*+R`|M8qB+kmIYbm-gMc&2sr3RY{{J|A$G3^D7Dci73qk{0G8|RR) zdhBcp#l0^iU?p-RQu;)jE6OC9Gj+=0s3!Hf8_?7KZVc@fClizbnmNmMR zW4$$niZvXPTIf=YK@6Za9MyeK&)k|Ac* z;ad2TCGs>Y(!p$Syhr-okvfbA0Tj6d6v9-)Rd0%8`nJQyuzj8XaJV_9=-uB1{a=Gk z_eP>nSzKAhE$}wH9-X~<-LctyX>@+O;U>H)9aqDu<@O{h~D|4Ah`^?t}hT6O2NC9X2DpVqz>f9Y>_@&ddKj9@$Bp;=UMx7w-`GnFh^ylX(-09QD<^QW9 z4`RG(3AWQqj(?Rb71qz5zvpuH^VtusS&GYDs6J9Qvp)l2L@UVkpCbzAYjVvRhB+n% zISt6hU6&|`(=tv6ya+b{t0!_#5WX+A)6iQ5s*LPhTjyF$w5!)kutqZ5(rGiT4t!$r z1I@oqugX$KW`;F7+)QCexFA~+dg}|By&>AO3PLYRTD_o)FmPJ7ZzM-i*zEO&_BnrY zTmZaT<>v(#2K`4epQ~QcPz`ZioOn71DxcF#JeMS!EAri_P8N@H9ce0castB8i{{=X zymZdxGHgrTiq*Z;{bSjmft$t?pvIE(t?l60H<_P9mSJ)9oB^dShyu@Yu zM-9xN1{9n0LT1ZsfXn7)(a`(h3Ym($7Cjq}drb201Fj=JuAiWYi%BY-GP=!r@!8h6 z^W>(>#yYQZHIv51iZ1Oe8E=9s9YGSj;j+2y`sax-&b|#w#<9OTzB9Q~v=G{9;Gx%n zmo~G?0%y`|%Gnmcy=n>>5`dh!w$3mb3+->O0Eu7@i+C%1r!`pLrB=Z%&HP_F;6mzZq3f#xj-epC!sljeyB?oOt z+2P>eq-hUn{DgL8?2M$>wPx43&&szCHA?Cj@D3Z=)pEA*Vy;V4U`}P(tSwyzI@>RD z&cdd*YjP`NX2w?k`0ow}d~96%ck7d*3xpkVvE8_x00;Fj zP~GIS4QmzKw_6{k+crS8wY0|H!gY~!b@S!CR>Aa$33c)Wfy= zOFnN~cBmV82X;mK%I6s`?os32_Hd1^ALbCu+Na^-B2bvU>!u{{1FNPeHAV9!)zC!m zgQcp2_6TxU9)d;nUkhckU)WKjw~}>wGSk@bH+0^2*(uFWS0=>xEt zS&I-+(to9}Z*^q=NeT0u!Q57_nb44(-HPfVMrZ%Kg%7H5@4k4^(x~ZZ^Gl)8r{d?A z$uKh1yal`i%cYTkIyO>(l7xw_jc{>{i5@%PI5g48WMyge%EWy6?eulVmtCrX2pUqU z$V~1`=OOfvqDVM~&G&Ij>xaE&zM|3$^^ZI}3g@GhCavS&!EPL>Ru-`Xdp|q&$`7ZS z<$1LOD-Zg>?#?i5VVp5g%5zm_Qx{*_r&9C>metv;Ah1*G!rKsUAx!q zO_K=0rY+fWJsv%l;!hc%nYTQ>lbl6;D4WXbO2Z&drS=InlD~2~V&s%uBKA?^3v}#A za_po00iy}17Tp_qNS%+*(vS5#AU^blw9~p$`mA8G=BxG$ED^r|FAqoL7AwD(SpiYy z>*|)sZNRm>8IHnw+p|R?j&|JetIy@)2Y@`f32CW#g?2LWQcC*bDdV&o-or;>Ibo=6 z<&jX8;1yYVVLcF!aJ(X9H_1dhsf)8ZQcGL!9zIqG$U-t1oP-T@Y(Pf5|G>96Lxi9F z=}$nHwIpqO+)h$MfluVZE@Wo|JS%W9_RMx4Y7j#+$go0d#!l^-PWeYf&j?$L)70o0A=)Wf1AvKOE$`aez>H}iA=i4L zuT4PwXbO<@Da;q~SyF3SDPKc7f~I`4Ayk+PsdUQqq)l zTXhyd7bK)4^4&eOwMePm%C-L zr|}d9XY`eoo{`^kdNv5ic2C^kcAB=FdRPfr5y(PPGUIfh?sDIl zt%X!(y967`Wd#dYuBYZ3G+zA3oeYVnk{_~_IU)v+I6O`8pd!b8Go^h*M^XLd=fU7) zK7Diw29_`Q;|;x@YE4CBEKwcM(4n^fkOw_vcjh=${60Y+(@_|l8b)u5zN!J5zb%Om z4uEg8C6Jh2o^NYZOi`TnK5r0yhLXYK8!=KTJ){vBcS5ZAqDjWt0Z zJ=ZCT9`^2{3k&J=RMZPB+vNqbhj?{CYoKv>X1PrCw1i8ZRiF~b?3q&-g$&0>)}L#O zS==*ny7nwVTnwULCTzD_4s657N)ox!2aG1|sg$SXX88|y#~;S4scm@RXO(hu*IW3- z&o8qp29^kN{D7r+Y;OxYFX+8%-h_`pltT_6bu)c4dc`u2cD9Q_I!_3& z|2jWTW`;3%r-EB|T>oxghPlqiEO0&eKZ?%6p~?1b!|!Vc7=%hIAuvFsrB!+`Y8yyP z!zk$nMFAN-dc4$#v5jW5h)Rx*Q5zv8Fc?TTzi;0k@jUl^UH5SwXBUEm1i3%pkyC#c z871|YNI@`AFLC6MalmdCrz|UJQ5X$;J0h${=ljC<-+Y@DBT`1X&w)1n4|CCyap&M_)YSB92(O|D3~A2bvU<~4rp)-|a>kNAiA-i--R z+%rhuwLZ!)8r`H6!KDj_o^uI($$fyRfsDT~0C8c9AQ)f2-&$+6&cj{k%7#mcyL$KL zyWK-OrFj4RCs2;j%2t&D_`z@V? zPhV)SgBMpMw~~jA%1|aOArd_`$)eF4!pvolEL=jZrVeD3ryXI9d@H~U%69UX-e1D3!>@5|i@gs#!hUuCwyWq^sZJ9c>o1Fk zMxVjHE-;jO&FR230Q82TDipYg6-WtDmpYRz!v-~0i{4_5&&f>BIL|(=XDtzADC*~w z-QYoGVfwfA%kuKW8ZP9F)dg!5clST^y+Kkge|NX@CW~t}%E5_73q_^Hy`iltwHn-E ziBdF{x-R%}kas=}QtACF?@}svW;=HLmi2?7`~{`ki1jSw4Dd z3!S*!>~{C%v=qLs)SuseP@-}FF`3#MLhtVFqOC1hggY~LV>g^s&-H^f3(OnJ7yS-e z2>@haHM@J22$ZmvSW#k=WywZsLyOmOCSTX8fFr?Bf7o_6Rm&unU=-g9Oqmb54CP#LS2@U72e93XT%O&ixST;mSztN zybo~Bjc0LuO|=tOHL^0z8@+r-Jbu%#N(t{&Ovs^6-N+KcRdJ*>H+1zU3cir7I?Hy} z0;QL9B8_opB-p0>6F~M>q`BU;9U=_M9d6K9&zHh6xjS~U~&p++WjoHetHtqWUFSeP3+*WDRPF_!JlA>wDRnKlgfXt ztk>X0^%SIhYPCQXYKn^Q((;kHZm@SRMg0z#!VDYBqniauiJ}(O64T#wB6;7fVX&rh zc`_fnu`q#>OhGNkXAc8=F4CcU^IJ~rR4_%j+Xn164;uU5KUWYz@5y00f0Unzgfe-= zW6BEqM_=#Rpw4=OvNc2z0li;WJ`+|Fy8ea^B@FiL9-wXdzEw2_s?kZNLFzJ*aTZKc zI{4IS1;`%JCN9}fhXxSe`@CVH^yA*!C4$T7yg zB>m}^PPq+L3%S=9th#x=G3isgbRE<5#fgLN1BJ}5OLYcbC}CwYPwg;h%)8GT%odWP zfK$aAeHVHyENdPqXTf668Leqbzya#%T4_-f|G;v*4zsx77+$qMUO>8Qif|rAZl&sFR=gtY24MX=wkYP>?W{!)>x&x`(OliJsC8nN+)g1t#s)Ov0L+6%JjZn!_hcvR@ z;WS5RO8nl}sdoaHT{2^p7ehOrp=KldA*++nx}l(Ia-EvFH!E<|L|Gs=@^Ye0tKqn| z#m~cSyO|@NEFWBUcsPqof4HPq%1<&ty*nx|Cke1N3KfiAAbd3FKYA*^H9+6uU6R6K|#?694 zw*L2z4h#FN^wfqcZA(J59U4%MV>{p6e4*m9>S$)aWMRzgAVA*q!T9lKD1BxWm zBn@jO7M=^2GngIL6$TpT=~(t;^t64YMX!}3^+w1-fd^3z*CkJM?wQ?J45c?0l#XYH z)IsodOtL)O>mvYkvhu8E?#A7EKYu5mD8Fc!ztV0mH6*U)w)3-MQdzu+TxPyj=`eU9;Tx$Qf zBEtNLOHsVD^l{KPH+w~%o-5z9q?~e50$ItSTrF!W%Eq|q$nGN!K2^_7k?VYJ8kOC` zv}o}#6_#FtC@KC<9x2FHby>GEu2%COoQSxFDCA>`;k|7rR`;g#H#+L=&o{9@MhaUb z8qn=j>*q#UHWA1>lvkt*?nQRrS08~|)}mXDN@g+8P$di2#BZKomxfIcxxDuN_m%TR z&I}ZQ=69c1*v7XJ6%!Bfr%7yQvLJX70)hM@zJ<@ki1pc;tNVNEW z|I{p<20uGdNH7j?N6Mfox@?Mre#Vyc+bx??PO(AAuNgxerZIxnAFAK+F?p?7n6Bs< zw}etSa5c?W?P<32nX^JJ@Yk-N2I+IzC7+qZ4DB80*^@^MjRq9MmU>i}-=@N?b^}U? zBnNx@BXH}{-hIJu{N3d@dVzZL{{hT9J}9#oZ;+bV`?uh<){6zBYcjd;8t zoF&*bT#IcMT36B8+HnA9v;S!s2shxc$fjJDaTJfc!R<(B1_ zVR)S~)6d8xP4lmSvuGTLRtZlMpHvaD)v75zYwTqAPdkr%5!U$V|Gk(FQ>+O?v*_=cwp9WG>@OM!t z$c&Hu7Smjy+s01Z)^wzW+rBs!5t_WsXJ5GAVU^g=3Z`o-76 zx5_L0J$KAsbfc%d57d{shux8lr5kY4KJ+!tFaGMGf6T zt_cWP#(iW2>V|bq@Is5SPK>Y0G#6`+3zf(LfejH?i?b>(brT%ZAF1yr61xW#$7`KF z;EYX-g*%JV3enE4e=nEuBpoH>mq>1$)$ww1crA6&vV+WJUtyB#JPj;j+E_ymv)&xn z!)-lm3%UG!I(aS?+-*#H*9_o`k_&=k>pg_0)@HxZxDsA3i^oTW7wNm}&+44rgifw<5>MZ}@<9MnTQh5Pbg*m}sbBpqGS=cz(vDp4s!P!(afw7TYJYb>kwO^uKWo zXV>vI@q+rb#95~7VQ4&K$>aMi0yOV=lM8qE;y#_99@{xE>AyNTZq>*~Zk_>^q9^k{ z+j-O3Y%uq4UH>*nuT3|xL(N9Dulv$J`VCL}jSHVo2)dI>b1%MXR}+ChS>`O!HzU4f@A{g+zOFxH+xCXL-vv7%KJ1GR@}8&^`6%lY$JTJwhEe`elf>I)&P? zVeuL{+7#$f1VsD<@jbGDUyJi`M8UNx_1(`3;Nw+dg4vk|&3*kjn80B0+BT6bu9f17qfml$DqEP@Me)Qd+$GI{ov$u> z_6x&+m1j4O9Sadn9n8K@GK5c6KC>xrsYzo8!HNO<z!fMoNck7XqA{(4*Gnalq9 z)1yb5KbEF!oNGK6_G()}z|a9^sH}mol7%77JO1hMr%w%Q7s?c$vn$>$pX&hQ)n{B) ze)r4-*$lho9mJ=`5?_y`rs?=jZ8x4}0e`8N-)hdLAthhrW8M79#910vySLir4D|Tq z!a1k^8fZxnoFG|d9#DuTTOV6MY$v)0a~c|J#c?T4bthrVdxj>0Q_6SWVNb!VD@T7+ zIGBA^bG0};_f0ank@#B}gK*-jfRuw?xZ7N;n+h;>iV}vUm2rl=9Fc6~-cym1mf|sO zTo-TrR;Ow#d7|kn=i-e`Mdi4yiYh;q&v1NSS|fjzc9HazLpO+Bx6W1k*&?1a%B@8~ zqsuytG%{khlzP>}&D6w!r(9!?rJVC{Tc9yBD6}mo_Pt*_Zb(?RpKj`?kD#X`Y4ACF!xWYJ>VLPp7ABR2t`f879ft{YHi&l=ammrjDE^=?chic?iW;%W z`#n39eG{x)W1i!wsOU01{D?HD{b4@CSh$;dCZXB%g*8_ozpe zhkwZCh@73w8F}}2rgFV3?>klGpR#hWJndC2(Icnno%{UnpTHxR@F&3yIO&NIHpY-G z*RU;YH{^B|OX;B1&Gf86^yS0kD7o$ef?+7x>FodgkA2~qHF?4Q9-U=pFJ}8E{PWC- zDi&{yIoGD6_y~Ox?LkISc|r+iNTh@r_;JEJTRmQ_OJeLM$EH;z+0kEr%blQ0j;=o9 zg}7MhHSA@UMRm=doVz_sw#|e}`aU_Y2rzg{i=3~|o4Y3Ejcg*R^mXG^<51e~yX|yL zQ3aA@sL}k=S60}bDT(EoxV`b?!!*bb$deP*aIVVXL2Mk))?n8bd?sD{U$wbx@4EUq zd;TcQ?&2M1A%hN(f=_A_%=sh!bny)(>FM z_Wt;N2Q~-AgsFHSwFsPQ*<5BoN~peSbtbM(yi*s4J7=81uZ3o%7Srr^4YTTJL(4X% z-+W9$qz!X6G{^*A&mTG@T4*(?Cfs2zk$OhIbF6UrvKf3H+6x&vLhzLP$xH48OsJ0* zJQ;0Acj}X7!%f3VE=N2|xIpVxBjVS${5c2YORK8-=uYjVZuNktlsx~58PKk?xK-Mv(>gT zLz>HR7|>McQXT?n|J>X{eaiIuKdMiY#vl+q1R4(e;uPwA0`8ipeH#Nvaw}uYpW@O1 zs?y-xW}Otnh~cvGrvZz^q#>LRqC25H_ZeMy>*;x}e5kTs^D(vU>+E?;w3oxF_T8Ll z7krKJu=SDBNcJ;mmS3OV%QLJfd6s3-_pN?E4I(?ZEGe~r zrILMW#%Kl?1gM>{N;G zEZcF)Qla~ZjnxKmiC&VYl0jsaGS|fnk;KkU9#fTs&LO4snJdP2Xt2J3;O~NBu9^pnYmqZ;{|mt`-lZpw`P+--}E`} z)p0LfYEw}D{y|l-+<-}TmUFQLRFMHhqf44wo#qBSfFbhhig>h0D>sFrV^`bz@Mz*K z>P~+vt6?2PO7KmSC)k~$!aE`f!KlTdkb0_NM(Pu*Lcy*VP4$OXv*T^1o9x0dSKP9K z6HGb(+X(%j#^)n-w*lj_tC;wm!x>E*%d}r)njL06hP)34`x>9V8<=!wcRbbJ9xv>9 zEm*n}4CF){;}WwsN$Kk3cXa!BLMlABq=hDV0|;V;R-!Ev$N5{7Dk!efq;(T#c^-7V zx&tDb%K$M%b-g#=Wxw_edCLp(cT|6PToupaiqcb(_~pDnAO*=v#?Y0+GEQtq8x^Ok zyzvaaGFIoo6!D#!)KNzu#kL0mXMMzqae5EJ^WT=10d$T-;e zx1;K+(qc3^I3v_=)lS{il%umwy8qqG^JiEdt6NAU?zqeNRTQ%5#DeovSIY81W&CeH zz1>}c&tOmgw#bgjr@8D(7F7UG`&Rinr;>BL6sypas#mmuvGiphV-Nt#c(`9*Jn7;4 zZ^}>FIq*E(XYuf!sqmW|zy{^zv2dED&|Ot3!^L3fQFbCRJCVV869ezj2~as)7wqNKF%K7BlduZBL@!iKGH!{ErA zJ?8s6O*{L{PiAu0BLW|xw;X-R zufH?(~$TWa>MZTpHW_z0h)1B9YK-*1Rj3Y3|FaqMNDe*Spo+oa*?cT#*ZT zd`vfPr6mcA@mbpsW)wJk5l|yp<@hxA?$s|qP-SePd~^V`0S?r<`sQIY#}{Yo96S$6 z9i%nXWD-B$48UENk|7(c{`ScQ)xrq|_OSJ58d15X@trvj;@mlmSh7r?J*s32Xf3J< zZjnjKQUk$=^^clgON>AuHbFyl++w$HC$r|FeQ13auelkUg=?@llPqQ~gA~G$dDeJ8 zElw2R(bB*yiQh;9X61^o-F1T8zS4b7>vp=jQK(w>$Z6|BZ_ZCO$)+a2|Nd!81hj;Q z%M>aZ2RL41LX35SzWky{jHzzfgC0hXFbKi+&ordyjnn|U@8DW?dywZ9gw5&PJbNdc2w2{Ww?-;2KfG)pZ5eyy(;N4*?X$5(6q z(7wjB7GHr0}Zz;k{F%;455t zCRnI%H+FD%BEq?l$3d@a%Lf{3kuxbqe7>)C+k${7W?alkD=5l1&QTE-$FTrJifDL) z9&XOn4Q6BSLs6{GoH2Qqpme8vyOA4GMC-ZNv9pmkGUH(K0|MyR}o8$cdCMvSL zTg_5>yKk&-w6;%9BefV($EaBVYm~F0X*eIm%+?1y2_4C!869qq{R~JsGVv|tA}cc} zDZ2MRTA9nX<(9c|1V^x^vUz*i0;FdxElpw9Vgvwtc$OP9x0sj?PvW5=i^oRBnN7ht z2Y??}+`H7^KG?&8E({9N8J$D|zRtuHA&|`iv!;%$HuPsfdUAM*eLa^4(H50}E^mpt zMK2knP^d_+JBLJBT-Wi`({YS?w{qsE2i^Y>H(-~ca=*paYdda|q-7ORGQ)y5d>?kub}~O+9J&`#`{Rn@ z)t=L$iz%4K43B2%R~A?&SlF`e{M72gC{L#}{Nt$u+;lUn$^F3ajid`ps77z%l~Ybx z2k6+6NBIQ^2mXmow<4i?jUcz&G1zyogRiez%x@c7Y2=HJOJ0_Pw!~Sz54)emMNaG7 zuZUUEh?#P>cmQQlt>3}YZV@OAwWC;S!3)boK@mQk@})Cimq2+*|C(^kC}H{QMIg;m z@l2+vTEqB>T4g?P`C*T0Rq3ZX4);X1_LaDXxNri^)cVY>*j(S5$yx4Z@P|ia;Pi7#KN`UtEI!uujabXJTI@q%x`h zpv~FU99675J27lzPk+^zz^f;sI$*Wphhz~P*FQb*T(@$_Ln+C0lbH0k25aVWFgIoj z2_j6Hr08Oa@!q5?fFUAp>phV>aR0!J9|Xu5Rbg@5;wf;$}l-Yz?*Pn6iTd z-DlfwNPq2l9{WrQGVr;}5sGnMemFXI+E0)v|KC5>-xsm+k3ii`ds0m=dX6{XvnD!4 zdl0(@-Je6OBsgjMwI4wn8eP#V;^w*|0XjRKJ=nV>avBW#l=Jz}@aqR#FR})(#9J$6 z38ryg0h}7i9wM~HAcU5%pb%Ff&gnoX{jjlPWD83%C2_>=dOK|kyaqaugS(J8wsM$B z)|Fy4>9>IH+xoFfH?^hn#x~Wu&fRC8^eZZb2ieLk#!Bg#FdDMov>HCjyaxuyzWf#wO&Uh#BwF|{1#_sl6pBl8Th1A zQjat7enxL@CQjuff$C~uIoWR$)PNNz^(Hp)g9tZP$xIJ5n*5G2=s+@K4i?pJzXMHe zy0WJTRYkOhxSSz2-mFXv`HwHSDD|d1#4nI#O-&qAgruc`jT8Qw`|a1c(KGEJrf0rs zO)s{>^A9KSeid9oD=azlkEYAu4%r;^meMei9Da-v_#BNnOS1QQoRUO zRx`$z7m@S-T2*vT$suJSd0;jawpK^wy*Ws_ZoN`B{XI>W}d@8xp+oi zgRv1HJpt5OcV_$WMn}TOfWSC1ByTXTk5@I*i)$RGq@4Q(i!{yLTbK*T$j59e7Up$n z2}|O49E5O!l+R_qjOc^}i;-z_7WAiim-PFGR{n{WTe{!NP$Brt<{rSOAog4~9__SF zC@<{acdO|4*Raw1nml0|oZVp=mzy3JbM==8wK%H~Q-4TlbMHo`5t!d9N4|%fNoLgM z4YfFIh!ni+9$m)PC(Lw$uj(1Rc_GbL_U;STP1qWj*DjW!`)O^zI@q%~Qsj(S7)D)) zz+qf1Y*PJ}_hKl!;KPnyxM^&z04tV=@?rN1wG)Nx|5{d%0Zr zims(j^F(vloCy!+lh@wc=Ki=I8ZTdIc=nGFMVf!R6Z)-1$cMlS^r6iCwTtw!iV3Dhs>)^hv zvc}ODE3O9imTYXn7H_{c9llNiMEi;z&1<;(SSM{$*qtb0BX!CZGRd4z*DoslWp}#& zL>-)5O&~0_pzDHF(6nd?eIgR=K9Jn);3JK9s(FGfZ;~|BV=oSIXEgV8KCsA`?&`4q zo87@upS!!Qw17%sN;J85(@s%I7T`=or}RDY_x#B^9#Q=TI#Ji$s@qnqY_`K@>yS@a zDO%&WU}}2)*NFCl0oAK}Uo?KrGlrp}kU4(R03{`+N!{?hY%8n0zmoE~zY|$LcvP`M zfMAEtMcsZ^?`_fXv3J^=`VFmA*Dm;NYSB+la#(F#<_-sgPi)-pD2RUt*OdCSs!hbY zxlzvDq|AxCPh)VkR|0Ug245Zi_fKjdMdANp+tX0o?mX*vzWr83fS-r$#IP1{6k>10 zo8M(Lu6%wgk>gDqDv>9vG_mj1!C)=0OnIO{&)Ra9%mE^$iD*sE3T9@wjr8x1Zqs*y z)4RsE;=J|f6~^W4n8$;&3UF7RU@(|h2&)~=S$X+Cx-yIIqm>(+wA&g!Sm}G5frI#& ztsC_i;D^+pWu6Tt-Cc9k9r;WU3?1u>FgiQ@Ze*D6aVzoB`H9G^VghW;Q$29S(=UyLfXD)kNd9@bwDZDHv+!QLY)kDUqHdS9adNf48iO1YJl z-(VoKWP;%gCem%6#EDB??sc)@csGCNHyXKPc^>)a{?i=5iUr zXQ;k&D;9r#mkUukU_1()SoUrT0BDxqzPe=N8!EnWWR=slr?D`xN_g+Z(Mh}d@XBXb zi;cEF0$-n!ANR9lybjPby*LYnYIndH-@XJLx`1I?Q#-+)cAv%zbq&I z+po{xPffE2J(_NX;APG0)Y!U(ccsFQ421`6MYB*TIy%#)jqH?3+A7O=HjV5`(28G6 z$e&jR$V3^IpjmFHgxF#Pf<_Z=#qG7aYjcU1Ck-zwmZS#in&LZo5vi)Ha0C@;TsO-6SOh0daznlXD${!|6gcS=Ku_<99gFa)%jo!uNO zI8?eILtiB(=G~D|TI^i0#@THvEwg?8SF=t?*gG(dm#`>3%T(AA?w&I{D&maWKdZgJ zvT;sRQ?*kr+P}{WH5~a}%tK>SfA|^QydPWE=Gt!wnFqkIM znK)vyXdJ4gyF~J6Qu=4pr*PJyX}5dXk~+Kpgw@o^?_2O_iMLinak_DF=aTr8>jQLo zYMF(dAgw%il7i2Cx zQS2Jj!Jc-C1ANNTg@ofVTvpY==Fuv5jn_?q|-)eOpNAH&yVlr~N5 z&VphD5zU2XLx^4D5v&@wQ{)6lv{*{C?vnrajfu`JpypBfa_{m>sJceS!FQfpo@TLP zi{)v8*xG%39rJ;w0WbvmF9n<3E!_Og^lC%3qucq5b-C76IS0?P*pSI~Ugg=#l9IAZ zc|LZ5Tvk)`V9|8X4wv_tpnut938yn z6EdEBgrde)jx6lm?F@+EYybNP0Hi4vL*#th3;)ZmT=MV6<}AxZJ6KEWP7m0G!!qn# zfgVd)@lb}JSHLSZwR%b9zsoN^K`E9s6*nE4Yff7WgGCo_YI~r&+%HaQcXIR^c9NYt zUc9aJwDWgZi(qwxGM||^=6TY|!D zD1bPi_bXU~^yYB=wvI!q8*IIU+nU2Xofj>M*6utfA2tV2P3(F09&w>zYw1t;yKHK{ zw&1uE4VV})Wj_p!Y@GzJ^A3NzeUk_cv8wp}@d+e&x8UlmJj7k%D6 z_mcW8k`_{6f<7FS|t#q+KU}T z;nkR#!2eW_?ffI3I$<{GnEL1;)(Tp>F?!`jyu?r0({d*g6BhEuH8pItFzSC%TeCh; z;t#ihpON{2Y|L~}$%8z%l&(4{HOT(o5^SIwCC19Mtb}I^BQE=*>a6n7`V=|a#rWn| zs75@&cxgW^`vx67JMICq}N@6&B|JZ)YuH3db2Ho(!SK3)5(+r;R7o5azVq zA|{g{E1s`J35el^V0SF-UEUi& ze&0i|P;dD1qYDu~cdxPELZ+`^9}f15h+M*W>b2?^25A#s#;f#duZU(B8slxmicHAQ zHLNL}x+SZn={^($;8ALOYQf&d|#1TCQ*2m`i@L&1GV2p`We zxh^H#oLasA|LxKv?ey#j=rF{1te5%u108#y;b+Jf4S~$p@Lh@e9HBnZ(@M`;a-qnV zUjvd%2JR28IfI$+;N-^o#3BN-FyoZM^wHWxl~k((IkRc)IT{!O@lq#`W{10dD-M#& zdT8`rnfbhmAfl+oKc|j^%4-y46E7j*hxt(B`%++ISC8cBZ+s@cpVn&kPo9|TJjD1s zE#$s6@eDIIy!J(A{WL{zG@GZ*pYu<VWd3~Y0@&pIp0G8v4NaIw*|q%QN9l&5f|SMEshEMplj z$n13=9@D_$3UZ=|q=D|&?*3=(y3RZ}hl4JkAYnzzJgpqU`s9dSt@(JJ?Eyd>7(lmOhsyBolGgC}4t`$Fvie(;~&3;5GkAh*fFo0@uOqXSi z=J!EFo=zROo82(rzXobggNLEB`&Bp>9HD(rMJO9X&`T=A1#Lp_^>+|Y(g87QnuXC^ zRtXUmKuk#FVmv1a$d9`G{BSJT*6FvP!<@^WjE5V??57ODdlI*sr8yUdv=e(?$cV)J z95ZHQHsacLz{I3jmFa7X2%ml%7FYE;-CK>?n~@E=h@8zytP-HLl~jjE`RPH%7IzpG zj^#{fTh6{J@y-S;&a(;I6t>a#nB2z@hTrE_72!&frQd_R3}xQ)!2RijK5d6mISdBiqgWTwX%iD-jvJX^}aj_=P`POcKs%F|_4d02Cxh9$WR)-09KP>xgZIcu|T8^YA za^-~6Z%QQ=bU9XS-+5BhIiQkiE)}Y8lHeKMLP50l6@8aa~^%XL)oa5DR;D5#^nal4l1 z#zZxWBp*&c2GOd-CPJ-;bFAiC;3>A$|H56CWFXZOTnnJ*Qpdz% zo=~igU80b>0_gYfcRecQkfp8r+nhIt7Ic#Q_}DeGIbe$@kL$-8^oB} zpBX#X??`T zgO`Pk^rIJG9Yj)dyoju0yK4DFKu)`-kT~=B)A}Ip6 z$fjZEi2mm>`=@z?@*Azn7)Aqqh`kF5&`OvIZWgO-Kg`^&E`A9Q$R2>M08<{~QqwQH zFf^B1O|I-R(`&U%1aRYc+{Bu1)-OQa;mY zk!C<|#AvrgKUG?n#?~F6-}g;ist#e?Cs-=)B9Yy1ZR$x^el`8G@mGrKIL;8;u+m1D z?F1!Y(B)l2=1-%zzDL7GS$m%uOHk1HQ7{->Sok660xK7!z7rNI*BWt=GjGM+pr-OW z&(D4iTc2~!(wuh#u0rQ_hXwchCpa!j|JBzZEXRd%UWk(7xjc50I;nI@4eivX!yOAE_^*V~TQ7V6aAm>Id7B+=8?w9}kUlt|`a3b<4q-F{oPI;hYP9 z6meTGi(otEvh=5<2DJPp8(TQetO`O;Dpaz!kuK<|9upiUBr~Hn@1HkKZN#T<(KG#Z z7wP6@mUnam-^|T1l&kZO#lZ`Q9`3f672z*OTef{%k$gQ`EiG4-ztuj4;B2bY#N^!* zin+^5N+KCBA+@RiRFswQ!)GI>pWD{2HqYNR$*sio#SbNrw&6SWs6KlND@%bWuc#jL zwL6c3nh;OY3bi<1aSpAjxho;aO(djKvsFk)*QROpxdd}mC3--+-ia?Hom<#mBQ$>*6Hmw>Ec`YmW zR5-+IaK7aaqT85q2x}1cn6c!hb6?*q$4o$&Fo!X9RerMng4ok)hS>4JVejDiNYua) zL-XmRE-v`3!*^4Eb>)9Aev(4>X21t^dJ{w&3uOx{iPMR`z^OjKV_oMLDVQPR<_U*N<~!4XxPOaj7Z$OsgS~ zqN1W4Z`pkPX_jL4VE#$sB*#HgdBz{Kw|~WYCvo*dvf;sf^Acs71M66Vp0pJA%cyFU~xRd;EBM6K%JVhWrW7={Z%f#?Ii>yFEOo+6SMwOd~#LB%H{mi z{1dT;dXK-e?NAOy-N~s3Z=lfDJz5*wI2hcnrj?}X_+{fo&-Y&RyCaV`9$_8+*?w+q z$!2-(hU3N#@|A53!LBb5Q{syDs)peOgAob$w{Ha1%fX^G(=d#xg}u2^_HUXqmeE~t zxl4WQqPD-!yuIFI)~tA@T0h71=^yA$7M3~x&SRWt^^7t_-r3Q?mu~gN*=B7TE+&FHxc{a#XfnX{UP%SC6n)8+*8RJd+~s6g|76VTPtAT-`HER$ z?#pWQNyYdyG?1lf$WC9#;>=yzzrENPBkwfiyR~*3;e`D%@tD zJulzqZ@tTW2}v+Yuxf-erCTToj)O_jqUYT-%HN$`m$)_yw?+oRfwB#A+8$s(uJ_vX zs*=0JW%4<;&|Sa3x`o9s;zllujfXkxG_>+)wO{mW@be)0i5phoemP+P1WqWAdg8SB z%W#WDU3+VnS<(9~{|&hhj%av#Nx|Cs<2NmrA1em@6IC3mlKmXr{O2^Pcl9(>|GLq~ z(mx+1r6#^A)~p`gdfYLTh$@LyDZ*%J(E+gox+-U;?;FD8J*iIqSN!g4`>dL3>8a7* zQ^xJd+XnmT8X-`sl0HpAagPk!yp2~#QE4_3m zcHhl5Q(tUvDJ{&tgKt_2E&xs8->{=n&mXg>nHXz>m?1B<^o)(ZIHmKChX*=Ox_ThL zRouNIGt{fp>vsP)IeFEu(u6uqCwmKKZ-U@joNvdhmYn(LqUb`j85&CL+$?GK&|%`x zR15x){l|@dr?Je4k`BZ;|SpEUk1{kEvKyL;G?bccC|;W12Bh123a#JKF&rw3h}U zm(+lw&~ST^;<$mrzwNpu2SIfb4?=zxE}m@J>-2igFkvii;4|Fbm;?!SL#QTsU^re7B|0c6pZpLQhSd zW{arH5pbAET_fiC1KMAt(en0BuJv)Ny(rSt#nYF!-U52ht?T0(!$vo#J8?zE;Al)m z7m)KwvAE_n79`MKBC|NgCouHdeVdyGz6q=IY)gz^=2{&)R$CpC_psTspFQ@beWNi>nQMwSR* z0AHr>q?THAUm;owN~%F2HETd1##${T{Y2t^Hqdwt@dOmOFf6C&l*=Kt3G$ z^{5=at&Xx2r1*Fw&vW#sE~I+Y*ewCGh2@Q8UWw4T4l+!Ii;uHn!$w<+pWh$jsvNDP z9KLT>DUt4fb$)Mu)+#E0 zpsnai1`ysr2)-2QU;L<&X^l+&MqFVxOamJBx}>6f`p~q zmC&AA%LoBShthEKmt$BIuVsSqnY%Chc8o<+^zl&x?(Zyt*l4jDJGAnw$68!I#laA2 z_ra@N6z;({Z}HpGt-SjYp8K5O?pAk$wI`L|1zb3C7H-XL+ROVd ze?EMk8}94AuIpRu;&3u$AsK~#*8X8;?%ZYbZ~_9nMQ?f301)1S3uffM9lGUixD|I4 zab(@Kb7_#k46xLU!{E_|?7HK|mhF?ZXC?pXKRWW9*=5zDya4x7N$-huVsyzv?r2Rg7+BUyvYo{S;_EICT zI|)c@)WKNsJMxd#t|vo^=L;?2C<8*~xO(O#ZJ zGcgZ}-c}v6$cW`i4l_|pq7Ab)sxkqBRQcr$l#wh&wI%Gw5m8-aH1l-z{UE^svHd*^zr-vkN__t8 zsf*(^74-@>*Fy>$-E@tKGx%gQrf*6wAK%zE^z)i@HLuWXAkJKyAQ9NoR(CrA^9{_Z zpp5G4NzNCJ*u?YGt2)xaye9d^y+}2N_8-0vt3o0#9H(led>12GrNZNN1dbN+d|PCi z!vssayyR#5Im7=)GGJM(6?s=^!+8AidU{iFzcxstl(?%Axdy$s)1CW6=W3(N_B`X(QK@KzO@9_!O0C*{SAI zR+w>|OtKgJWiyB>?_$rK9;7PxPkkH$8>Ksbd z0UNHq$82I>4nuO#nd)Zu*f#+1u&3v=?a~A67T2_$rpiWHe zS1xE4?M0n9ghiTXXLH&^bl1nP59ZNZ5-;ANAYj+1m_-0+Xb+=xYqvl?6MV;>?5x*h z%5~>~nguR^1|;;UBe+EdCkHZ1t?0?Y%{m4qPx7UC1lq6hG*vQ)Usb=>@e6C|U*>MR zl{ia0t1}pS*-UXNPwM=4LKoekGh;+F>;r>TJm(nJ(~qejKK!iC?807qlhZ{!!lCuJ ziR7=T$$j6=HdRU|5sS`qxNM1xw(pvsT9%eB9$3$v{0g##<}Q8?x0wqH$43u4olf1a zQj>graT1d$`X5)yhr*GQ#IUUP48|@tL)6y0m~y(~dPSr;iqo()C_CG~;{EkzEVW*2 zD8F%6t!Ex>7xCgGNv2xr?2N+h;su%X%sbC4WE?_Quqe_SQ+FQyn}(1c1Lt&VN4i=i zE%c;wy9Z&AQcRIRlM!;a);z!NsFVZ`zP~9=J((J`d=}!x`J4GsfYuE3oo>3n@wLE&mf+w}4IL$$thA!-~2v%M>D+=RlXn3hc0aLEHDK={~#9sI9`Ll%1 z$eJ}6L5EW@A;5r)g=LFF6ig7}n4ZQbjYa0I>9mcDNHX;@~GAay85 zoCBE0ln0=EOtXb7OnppZsFlP)70;+e7rr+wT0GUW$7hPuY@8<-1D=*+&!+>OW-;Gj z&{y`-Ey$~ask7}xUWNaLh6=W=Cb%}j8vqUPLvNxX$Pm1S4zjU+pUp2Hp4hqXrJ2?f zC=n@4mQ__%dFHUi9hbIao$<|RS*AwQ0+71s_a$O$kGC=dEm9V-5;<{MeQ6Y0KD-{X zc9?#C^PADi>Ht`bqW7i{TkKpmDQuhAxjOV<|EJcpV5WJ;|91eH%{)Q^`nuB#&fYda z6VjxOhpcB3==r&niw0ZtV)yl}R5sWHFHQZaeUDVkw8vEfGqi!)c#GS@3$K5MR8V^v zQ#$Y4ec^Qh$u>84F3GfR6=%Pw&NJktT4wJf%y5rHc%w!2WryA)Kgx2n)jU`^5O_vG z$7_#mEr`p3fZ4D<`8W?gy~ytqpGa~>#6LGeHecr?GQLg?xc?f5u{GZ`;SZ=HA28hQ z6Jg*i9%6qAwmAtu1&Zj%yM=wq117Ke0Y4-IwW$DzC_x! z-X5E%NNcv*%Icjik%2;brmd{;TzA8J!XP+#?ffUak(`G(z{7bp%&`KNEb#)=6aU$* zwD61H#!^2(zEKBV>^}t|*i#B?Fj)Ik;a7$w>#r^Jh8Odc&OE{#eDI{5g^vy1FlC^i zLjd(Z!Q-H%$3JkGz9EHo{0SmM>+}+F_E*-J(_ASiD7R8GcWm$8{Ghn|XqJj4(~A5D zA03mUlx#fwi|Ea?&8~JFwfGe88NUB9Bk!xN&*k@>3WwwRo)ZN0#jHCeNAH6}X}mR9B5B>~!&<=gH>9ye-}qSYO*Y_^Zx?;Whr^0ewzNCa&tyHVc=5$g$iJaWVO@ z?VL#mOWLCX`C|Whv*@?aI&;<1;KMKg}GG^_^zqN(3Sg~ zmY9NlSnSp;Wy@us$Oe3D9*7ce`q;aUNy?{9ejUsrx%y8<*)?w3aYFVu zcdx4PWPK+5ST{FQW|iDhRWmY@Im6M%lJaP#%Ggh@!doL1JalpGOQF%Gp$aX9?C z6mU54TlkiX zkXWQ~XaDZ&lYl3}pDgg@`^qgF`N2-Zc2Cn3MP}Dh7IT7lD?VRXC76fnMN^&0JG9~Z zvkPxX95yGm-FsGv$z^Xk_s+t@4h>0M0o2U1OpgdpM(9tvDCWl0aJ7*D#wH#p2%JOa z$f>Fo=7lG(dksEG`qF;Ts2AsylV9|Re?lbE_Sh|wP&VRmHKdvTZaG~DFBrEdjEUoGX@}NWlkk8571pXfM~Y+T>x(>vBh}=kN2a?&81VP*%|$N?lH` zw}ccVSnKR}=`w_S#|NDPB@nj(Hf9uz_9y1Uc^ zr%u^zu^o}1)r#x8G2M7wJJ~r*NvfxDgVn^Gh08jhD3zvJFYyvvEnJ)u=-iV>XxQQg z2KN~6hTOTPJRCHk=3`C6zQYeRIRikvgsTj>Jg$iaczD;$j0(+JA3$6z{chAen=8=_$!Utk7UldSeAr;RZ#+m3$LZRM#VH^qc^0(NerYla zUTS$R%{3+m)}O*$9hn~L5JHRXoXVZyl&$4?wqXlh&CJOH4+!no@x|ibQ(ec_dE))3 z2`gB$Z7FVKZ=sr0>`NSYDNL;_2;=lO`A@1m1#gHtH!f+jxw4Q{%Q%T_bW(Snu#H3w zw8*p}Q~`2OCHcFES5Uih;jN!IDKIE`NMiY`NuLD-B$lF=EFGCTjl1Ts5PZF7SqWK} zU-1-HkQnOQWn25ApH?9& zTSQLvsp;?8dkkdiR1}xFma82k)E}q4>Ht89Tcnk%Z;5i(88)_RM^uMOv>~J@Vw61d zBJD+{m&yTbr8J!0V1SRs@8|`4^3fRMW+aCz^{4Wcw_v{~`5Tl@ZD2uhkdsT*wyHGt z9~*F^$X0q7M8@GElk^neL6oXdURats)j0?*j&SxrzDYf(?G%|YEE=_+6e)XxH%}{e!X+ub zxRsi(7ArNb{LCH489>CB_L34L$$^63Km_E7(HABHNi0~bho4(JqV76XsA}uU+b?zUyE^39C#FeMx6xaZ2fNLLeNw-mZwS7XkI}JdW>M zq5gIL8Ts&2uHc~rzTp>hdPmbc@~q`s<7l3%pSa;YcaW8=S7tEl$CX2<;lJf6*_d&U z(MFr8#oq9`={A{&xP!9~*Xt!k{j^ArN1luEQaUPj!K*>qOx`OsBq#%e(RC3Iv8(LD z^Gf}5^V&C~vD$JUIk|BlXToKMrGsp3H(!0AncLHIcoSN6zcczQ0UM(g2p6VGfFMk#1MIHNamw4vt>Gb`rxPxQ`IK5sm!~8|K`yoBQ<#yZJ5-D z3?bnOyRsY+++t7B$9z2$dkawLC}LIc_kvcEMOCXPzlN-i_c(FGZS%#5M*7!b8NZox z#^lzL2gK=$bQxYel^p%$_D<79z1l?D5^JY|o$LT|;pn&^>}Ung0|B>^1wp)Vjv3y% z6vOvP=qIoq*VvRJo(amyvf)ABYPgKic-0!ZTtq->IC-V64hR;{v?NqogSq1w3(nS0 zB`H^&p?+We`uYq!pBs|YOz?Ma76rR{6PW;~so&^IpMAswYY%(GIx879!PPp`m)1QV zUGYCdRPyzN0(OyXybxg4Q26$QR@eYYaK8f^htFu+rK~BHo8zC_9^F^qD>L-?NzFcn z_vpfxyC=VZ_=vepVbkj_xHOe?!>)btyt=2snPnBo55)kGMHa)k#qW)3mzGalQXSsP zF{$>THiZ}+E)?}3zAe7oDi78?-e51Hb)_ta%r^0E_{_Td-KToy#9x~h8mnQpbD0f@TojfECL-(!Q&#f{w zHL86-gy@@)js|YOlRCtR^6gGO;jrX??72*bK9hFECdQcIUi4e|)?8*qul!3UT#!6+yP}SN%tP zKH_Yn5w5n~RoSVt%ei(xeX%1lnM`&yQ@2-7pZA+d572%Pv1xKu<#|Yy;l=R+u1VXS z)JJ8#yiFIQTp~t|WSY}$ynI8G#gD!JXn>^jZI~9o6h})f`-8O^ZYH+Q z2LIOaTJh3E7&f|MRkH?$w4dZ4Lqxh}l42C4%`E5HGeZ1oH+5xsT_-z9SMO+O>3dzC za%{BuE<0l?ax81@*1Ex|_^=F<+yM|Wh5YY2#e^*({bj;2W9w}4ZPyPw=A-r7_lC0f zJ7Ddh2;Wub==)Zp;oBCjG;zfTsUQuzWUYyi^|CAgbp=zT_?^Jv5n@LJ8JXhp1HC#H zcg$XwV5m9fCvO3&(lOUGwa8ar?&9l{cFH?!W>1XO^p7I`+^8NkB)D(7=6Iy)fPpIe zKYozU=x*HtFe2}uk&5Vi>JBl$1WQ(_{x|{G-H5bYT%@c%vlg*-s(Yj8!0zk5}|+$D|s54+Q}2R)gkpwtGLzwxaKw@htB z`K=<3hM{Vbg6-1KIw#h#Te3!1Z!7Prp;)6pzZ5(Jdgrind2TdobF->VF_@&(%hV}9 z;ix&kSs_;!cxm(*Es?l>+TlPloe>PHG)`xy!Y24vXD!GJ3^Ofs>wonD<1>Yvl8W3} zpzcPFLKN;Mz3${9;6{ipE{nHS^8AHX*X)(`XvW`vBI9=mNM9)+w&sF-({hgZw+u$f!}5eG5^SzxhKig1lB6|R<}BoQ9(Z+GwhOUzt>FYb?PAXgD?pF z*2V(3*j~@|;HZXSbKrIO={s5GJ$}}KKI6!MPt3c`uFr%cCQ9E~QOaHajqYa@@h3do zRlv_#@Qh#8wMfGnElzpXJKM{ae$NC}8y@ zKa!z!GhjpEwP#ZIQk1Dto$nqk`=+IuqFQh1eOcL2sLFpYx)AG`X1c0Ezc2e*PL2bV zy-7VCl%|J{p1A(66FYOX?xhMI_8VcST^-qLcBMFB*(!9(w`6Q4>4OE|_UFdUa;Nl6C`lz}ZZXfg zCo!c}dCO_a-i=ac;rr<+71Rt;RpS-c5hK;tB|DWSZXHAgiSYM+9ayg~a77DG448Cq zCF&3qO)1isnq3N!);(E;R44}d^3+b>OpV?#aGue&Rx#`zgbR>X*$cHR0pg63_$#Ee zt`p&m71*8t32r^6+R!0;&!1=kTS(#}n-UNwoL^e{w9ei)>q56%lyJSYyY+4%g~Qxn z2gY@|@7rlV@sGKq!+)4&+TG&sL_o3 z7iqi=cjt)D{@gJ6K4USN(4IW9$#H_EX!%4*H11^5R4NZPODoM#r=!w(=dJ#fI8l!UBuT&Df4*m5V7CZPp((0 zd-_M{C_pt&k^XYiX0!6O;-N44PgJCv|HDVNy-Fh{aLg8eLnwu<`6r-Pd{9hA?A5A8 zWdW1M|F}x|^9!U;=~Jkn=*p#|gPn(Mr;UHpJ#hX}_HD>?v@?$539XoRd3y|-EiUTL z*SaflhwIS-pvTbqDdyiH()P~k`^9=C;nnLMq63`E@$R~DT;aecgvguqOntQudJGGf z-;K7?+Bz9}zN_MimSN$<@$QxYBx&3j*Y_j`)xsbS;CSjag4LjUdk3t)RlTPS-Xmp7 z-L?#nbg|v&5s(i4xhd7aGzrm=?WCR``TL;Vr_vz)+e|`lxgeYOD_x?Yj=ZAIn5EO2}|W z!;%WTzbnU9^8Zu8&jL~zHymLt&qEi8-YC!bm-_U^C_I~w>cq>Rc8G%FVY5q5nmXsk zbSG3+{QzPNfR!Yd;_^6`TQ>)or2vAruGsyk3TO?65*|Cle4aMq)YhZGJ@~++_H!DP zdB;#jFJc%&MP<6O&{NdbUy8@KHS#2nB^7yH%2L|c;fQM zk;Re1NqxiTq_rik*rrYOnD4Dg#bM*dSSr%R(yQbt#H58!d!`YWYg!aIHLyBS-u1oW z#{>_ze3qr>N&gYalQdS+5G+*l%dze&wKt)Ev<8JN^~ zx8S{Y62T*9v>^tivG-yg93M%Mqc*8T8v>D)C4Iy8g>c*852~_8gux3rEnMaj$7%4c zfnzw0CwR44EW$kG0^17#>aZGNnIw!~Ipj$Nae8RKKz%WTo_v`QXA%kO5b4}Jtq+CV zoiXEWXu1tK{q|^+wtSHEdIjHY1Phcc{7U2tA^&Q#k>@rNWR7VQv5oM&j80LsU<_*45BTNRb#s9`eg%@yDkW{ z*%w@E3ULTz?H@kr8gS>iQ2D&8q(TF>J@MQkH_tC3cutIc#L6YUe_Ins<+z3k?kN+t z4vYooAs76hs@A%-$d|h!uHt#5h1ltHO?@s2JvxcMsA1spk4Vdy7Y*a~`{$3oF=S&v zjJ>sj^N$_7l5bTNPfD5rJ6AnsteRmvh@=iwR@o@gWOe^p&OD8> zWDWk`qN-wCb-a~JS?uGge1ZL}L=_K-POi(}Z9dAk5#MFPf$gV%ZiKG;pmiY4!mig! zCs=b6TcIt7d0FDISK^qa3Y(a7=56&1%%;#LZ-#?0Hl5waJtSnUB-r*!8 z@G(F?tDCSJ7+#Y8C=H1;b(1>sKRP-lG5hN6T&654#82ge8Hl_ddUpc04;*cW-3QtC zw@&VZx>$1>OpNnEJ~{3N=?_K?F!jo+>n1#ene+elthQH9b0gYIkfycl9L#xv@q%rhm;9>w`ISUOJ zU8In!;`@CnrAyeMPM(@WW>HJN6!=ejgV5=Aupy#t#F%#YIz61b%=!4~m0FjJWgzgh zQIy5z#nn63`5tOI8byXeOnylBK4H%jnCHlFsJQg$00gPae0_UwhxU8|09ME0mp+97Ua#o zZ&eix$m{z!duO?Oywn$#u#V-hSp7vc6hM84P91&UPfFGxU zPTP{{XW%#v?Vw+NS08+HAD_xo76p012~qFlPb43t8=nQEi_D7}%;>6=z(Uclgd8Lx z7NPcGFSbJ#CK@h^%Oh-l4{m3=4)iWpx&%xOMQme^`{l|cW zn&#zwX3%<+hoh`uQ)kW3%4$^47prExNSmO4_J^^KEpMV%oE*}@On4(5@8 zBs00vrgjt-lxT9bZ33WNWFw@gcV3mw&vZ7yx9|@Q&#-76XYe0#)*`1exeHHj4Zs*uU7}Y zm7g*y9%xkNEna*);^`Nk?hLHCmTM$%d~&%3Q0()dQ)Q9o5*5f1vZuauasYAR6qU^j z{r;_WBCfR~k9IG4K?iVmLcf)|!R5TF5-gMMVE#*J1+CXm8bj-lXMK}hHuI27rEqp! zwOkbYIJ46^oh)?_vNL(b;_EkSeLSpC+UAaa()v~#Bmi^N#gvwQBmOezTJ_zWY~}kg zguC_}&_121Iz%AjaZXA}9J`X`?kWzhPa+V(TjMt7{Zk%{3U$-_z_p`Gyw}tZ@BK-z6|>KpC>%4kn^j}5$O%=ecd7vR>l`TajPCAuR8L#j z3%A?l*M+W7k*~%c=3HZH3ZC{p$D&~57wF`U>f1>}pzI5?8t{6YUEGSvFV{$$R*l8* z0UDUMW0QbM7gxOkH)T)^{W@Sln?t0E{7Bb$D=#f9Mi|Fs^BsJWo{$ z^0x~`?e0pIIpU*cmFtakzXBsy@#5Kdj$FgEyeXt>|u81I%`s*^5M^}bGuvp3j;cU{TA@OaU_ANOnuoQSc`P*x6oKq8pu+`Px z^|f5sJ{2U#{Y=+!pVink4wJH}67l$zgMcG3zeP7ciL??w9jD}Mf^dFRC zGPORm@+Rp~PDk->-(^I9E7c~&%0`twn3?rH?9q}l*4vYtlZ(S#^&s@XTSl96sQQ!5 zXgAHIio%MXRg7Mlb-sZWpD4s~N9B{IVUfsthd5;YkA5{|b+yh(2YRt*!0zdz5X%7R zFdOr3xd&0M@`W6!pK9xmnd?__@?%*E22x{mF2o(l9l$bHdotW$=?{U_6loMtH9ti1 znD4TFwHMxHXh=Ij1i$Uu5MjTKO)P1EGIwgIs*uDa=3v9>M9EJ+SjDO4KR4tRR7ost z5mkk&-e&KIoLx$=(F1p}Xin@xj}V;cl*f!+eGb)_6Y}y?Sp_kB;m-|Cz)NFobXUHpPF$0J9Uro+`+mE7sS(DW^2(GSIK53_E3c?B)(-|--WTBV*hITI%ABpgly^^H z(u8sAb9_iLb%w15=s-M9uRc>hsT-frhulQ&<3+}RO6$BXgAvtC&n9sfE#sD_w-8WI zT%16^{QBm?I64al7eE#j{gJXpTqqd`h!w8*Z#FDNbCceYUIef)>sSFF)^iT(vgktL1Q3DZ78L z*30SQODp(5}&}dBTn6YkfcXzLXy*Q!`R{^O}(>!q+E|2NW zKg(MFxIK#9nG13)z6^sp z)W4b@V2gbGaA?wgUe@c+jSnPIAjL|(d9g>LeamB{^Oyfj)x^)r`1n4%CjmtjeUMk@ zIFa@C9+zAW<2SFp@5<(I{N5-iZ9EBh`Un#HjT3hInlPaOx*621eIDY7b?|>$!K%i~ zm&mS2xOk{ZIg(FiYHdrc3TSvR%cc^sW6*1!uj;cscSl<85y_DG!4TEGif2(lcgrTk zl}QU=Ce>@n;~iEFTjfs{f)=*sD`R3x8}kAdx680mv@?Z7t=+fUT~2r!3>7&-ZSdJq zu2wqrnvl33Bx&`-muy98SgAP|c|?(Fkz6r!aFIIp`=yUY7FE^l>647$;6o%*3%sCn z^;3B@a9L)_Utg!*n=DWi?L{K3S^wwo!xTcVaZ(-KJ7!am%L9J@5g%+F2$VCH7OZRs zdR)R9Q;JmS)oc4zUq3) z{e4j&n*CFsxQC;jNi&_hIP3fD41ss5h-z4Qvy+V>$F}Fmf^xJJU#Mooh15y(@Yf7f z0E9SVGFhm^4#oAHEePa8*HyVQ{@gGc+J0K)IX)^TJw@%AL$)mqy-Lk2=CCf+dBc9^ zmI0WbUaUr1Rn$ya{MN0~2}zs{YvKm;NaE2HPr$gv>;=9~bN`;w>u2bT=@ z-UV4X|Ks`t9iVY~3JlVdeED|22=GcBQCSFyjpjF$KRuIcw#{|dG*sIg@#7M>>!qg7 zpHPU!vdMPuAhVL38Ca3X*_2y43#y0$YrMW`NBW^;pnv1{GIEC_i1=)~le;nH`%Y)v z7uai`VIemkIiu3Mz7EUS>h@Y_10Ny0^Okw!9XTGqwab_?tD?paBDyD0Q|cpH?x zkK4v>4@dV>pGz_7eQ=_hrUxwH9cTT4LI%Cx-pVvjrMk=fX&)jvYiA3D#!!+7=N*fR zIPbS?IF&KPviDZJtdA!P31u!O70ax)Var_iXwyD#j_vF~pf0kxwc0)a@Om&%9fauk zPLrZU%oos_8<<@*?J-A4HyA!h-ZfAQ5 z8A`?lzN49$lOq>2WE5p@2?suW3H{D-E8Dz$q42%7x9RV7{ukQRAv_tk8!p&aYU5bj z#Fk197K`BsBD~tU*pAGn&3QRKAFOg>O#{4I!bEh>!o}2=@pGf8lA!b$_Cfxr5Ho%#%Q4G@gD^i@olCWwP|3oK)=iOdqw%9Qibva!)jWfw zf#Ryvh{VCr%bE&V;6^DdhbAg$kv}O(7#>0K6DS>@KppGjXZg0R@YA6gsp3tI+TU=B zI9-6XtnDVvUmsv{OpX-6LIW>MT;zNrouS_0=pvh{XDjs%J~{f^f4-Sh-a?@>aDz0* z2&p(E*t*pcv&Ax=2V%9#2y(x3?ux-7qvHUL?1J0RVEl`R}GS(GCjZWvMRzt?iD zyIr}{8c4lZjQNX;2kg$D4^~u3GJrDhnXaqw|G~@l&$h)C#hP9D%O}9}mJQr*JrI;N z$E~WxU8Pp=>RHwGoGMRj-)G)f#P-|)>q{lY+3)2@P#3D~-8u^cimwJFpBR# zR@d69!{22W?c*+%Iix~jmNFsj-CGP_X+zwz#kfAB9Gnfm-0FS4XDakKMjkJh&-O8H z^~jZbH`epi@3NsTRDrkUM6%BcIZo0?7tQ3}3(|&-aM~%cV#(t#hx>W`I;=b%=mn~` zNyh2a0_L8f;yRjgM~(|j{RJa_7w^zFp5J-hz4O~>hdw%~Y*^=7CwFkIOa!-8b2cBG z_~*vx)C8Uc8K9Lyz8ZG9RuB7o(XTBe)@{A^3Os#TDkga#l3(|2?faPXqIn|~!Gdg6 zE%MpZet>j8z`4$oq$dmvx_BJyK&Hy^~prvE)@?ENh{qnM!m*u_=h4;#lmRE_;RLCp67Qyfo#h)0^O%1kxlD%1X|(w~IJ0@oN*hy~>1jmB>Rfhp zo?l*4Bz;l18{ECnnK+tFs#DCtP%A!uY z8xBI?++pKbaYW`?%(3#Kn@K^OSRCPzLRHd)zH zPzA{uM+oBbq+6b*5JbVK0-bGMSI6Usn3Kzvh{sbTd%L06P4ujhp|Odsf!v41xY0W$ zH2Fn_KusGyKdFb2Ewn}d5HzbVO-hnh&!Rg-yeloTMtiyxoHIm%D0L)%(;ckVKAZP& z%J|C71HAZCZ0+blF%S=Ho>hgwcIx1?7*^ zJrWD)`rg`6oQjRmSbggA`oKeDD%bqoW{#_BjVT%BGhNqX^H?0lM-mf>=LO)$Fp^hY z9%Om^8ow$H%z4MsX}j-{KvGC0VO9=hmh7BSh1O+_=8jjnvk!nGv>30+7r6xdl4{dD zS6-B&m^{NJPo08G;!34nf}Mv4J~8v_F35iDMt}58*$YCy-Tjh%xls2W>Ngbd{Zy;D zvRgLTV9QucHdGY;`pHm-Zn|R(AgR6BNP}KwFkyt_Y51NiLM*N)2>&DX@Dh!(?(XkH2Gu%7OS-8AsbncjA*2UDbHm zpEi(C(F6T)3bOS1r(8Djmd%|~ryRD2`qDwMl6dme+HS;Z1tymFJ9cv?K9S1)$eU+g zsa7=?b;8i|t1V(!^AZ~HLP<|E6Nk1=zv9<)oSjd8gBr@8^sNfBrsJDNS9-@1`=;fz zko&YM<^-bVQ@!SO8~i3n9fSH*Ab5DY!Kc|WpZB(rkD`hte^)zm)@Hkv*i+#9lzAP1 z$=7N@C|$ilO3VNFL;S}(2lFHY0=QHIjKcg?**z1mNmBW!TVS)6>_weYJr}_gYnK)2 zvDN7d^}wY+L@cPg;V?Iz0rvb5VCwoYlEslx29%fw>7D#y`2L`o@v7Tx>WBHJ6Lp15 z=Gq~2JqbwkJFM~nO(gsp67wm25yTfefDwi#n3*QxX1}>WRdPPKKrRFS(VDj^jw{XN zX}!o~$bXYoz-da$K9y_WI@xo}gq*v_fc}uknhGQ1s!2=cz}f|0Cb7`W5;w1n@;TZ# zAs#RL%~jov8%6I;QGveQRAU(N+JzCrA0!cK517VfLqsa}h&in}^=P zS6zui6LvUXD-W7oGIJ0$T#4i_9v$B?j=d=zgEqrtMAGsd^e^GHyL=V$BAqo zD%<7xP(~)DXmlx8&v#^%i1`E{6*K6o*LaSaDBxDQyp7uC zLTS*f7Re=7t@U-@7p*-s-Rmg)mJ{+bGR6T{F8x&0M9iotXi;4UXGBP=P^pYGeR<1i za?Eq5%SQb9Us08*g1Y&TM_Bg^Ov z{9~}iOS?k?&0n?raS@w9r|(IYTbDl~Tf2da-|T*_*GrpIBOM{?&8_#KaQC=AT1Bb+NWZL%WuOESNxioYzH zCshyU3Wpi!Eq#PH;R)_nyo8|qJX0#O-a626=fZsQe0WIxVD8xnl$&?gtuTk?<50JS zVo{8_90nG&=^&%Y*fkG0{ky;^AY<<*eVt*a^f{=es|4!Gb};kq>z-wsiL$Y7+NTNQ zor|9QJFYdgAklO7H@`bu`1N+=jECm0eoQUQc5W$*?k|P6OtCo`c!K1@gs;N49#n6Z+TpgCjPxWlevKd`N%BaE7 zScvx4!@t2hmqyzXMY9VTuH{YlHGj1Bc18tZaf9~0Y++(dZ7;87ktzx4#`hoc%<5y~ z{6ZE~XEJ8U7H;?T!SQ{Q4nKvZjHyKJ#XE&K=Q|F|d@<%gOdgQE;IK7vA#qFNv+Yi#X7C?Wu+BRVN>O_yf;N$OyTd3%C56v+wt3BBO0zQ~~C^1pY#xrs(Q*W2lG z)p^&doUX@m**o>g6zR(;Gy2PV0cWR>UB;8S)ME<52wUl{;A|@;Ge+;^D+d7}Gx)J3 zReeVM{!kOZ7FCQ9QgiD!s0DT@5!GVI94|P#F_)3GHfS3>MuQuGo>stf$m^%hxrA_?S9gAqEf6V7F_F1 z4()DIkTZ#NwY}KFHPK8Ig&^o!eosxyIP)9JIhBftgp@5G8A})Oy<^+;Z|riEPjx=w ze!(83aQmBQXa7|R?y)jL3fareUNFL?*yCuQvXS#FyCoBVS~bG!jcw<(03j>_7Arch zU$tq!!v&n!tMq2C(F#O1C*g`yBu{#qj;c^js8ybCNgX@c3il9?Kh<8@Cd{!snuQnd zSgq&xsx4Pmx%WJeW_uqK(-`*lmCk!z9J}fDB57Q-tD<#5TT{5jE{68QsjWY&feA?B zIoSzdgX$yn7@`8CFixMbImmXxy2=oknIWhMUT6XQ>sz}0;g&zbefl)D;#0V9`U2UW z|6T7u#(b`zr>%U&oFEqN)B|zOy~`i)vRoiT2+u9x7pOhHv-yj-5sDY8`!uHCs8m;b zkbN^dVh+y_1A}xMu)DXQa$W=WKPPj9k1sG&@AIL@Gogu^MDkd5ji#3){D2s5oW_i7 zVK+}$P^C-T(zjp-vQMZ!%&&b`6!{BL#aD0ze8KA>{==dk2jP#}84Sl7^0PqY+^KSB zhkN}P6l}&}R51a#VGDVRRzGjSaF9Ijp8~^vVz;0b-}VfE=MTZg=C17Xy~Oz$y^7$Z z;vvCV@PDJLMj>VfdXoTI#_PJxtB7rK;kCVc)tDXCaY7qGQ_(jzQd z-a}DCb~WiFFPZ<*T|b-qpa``7vI00s9zK$^MC`2PMYo6CuQ}~pE${76Ij>IUs;m!4 zOMe!VD{fP&*Y9$mjEqW$JDNT=-DG{VN|m(HckU`O?DDLSG@WX%&y&$=l$pH8QT-#* z#AEZocLAH0%(B6c-pQtPiazYDtpu9ZZypd-egW@xOWChl03g|;@3yas+kDz!F85B#x)%4>`IwC{fQFpF{w}Dp zhVqkwZsh8kYLEM7IBdI0BaFcMdZ z4nS=wb(KoS%6x~q$70fm<*3 zp%F31k-*FEVGRuP!>fdRKDv2LL`2$2{9SW7aC{6epWIq}W(%F@;NKOq3^2O%n!Svcgn` zH!%5{hhA*bxSyhshmHd{4E;OMHs#dW3&E)ct+cX~Z=AqX751yJ7{S(r z7#q!zB6>maKR4bz@m?v5vS&D+Ets)wkna^#u%ZW>`0YkU&NT{K1e|ODY!Did9|y?y z_Bnc-9uPQI!hLv*a!m+rAMGM%-Jat>+^%n=(G2nwa#_JwcaIy5ST%eP;WS`rc~sVT z!XPBfm_(N$@kwJNZL1``D8Tv0%s;<4l)K=q7r9P5RyB2pUeu^YsghOnG}^W%D6g`y zB&t9VWYdC|KOA`O;uxzo0SRAx5rTUQROM&LU3loM_Dr)8?kcdv6<>R@Zo%&y?J+T> z=7~}9my=eXFO~Z@iRmVwz6))|h`Xdc2nWq((?PYtZri_4Z2qPK><{ao4ZkyyD2JCk zC9wzngoiOkehw;_z5v3GE@iv8+935OYD_ZGU)&RRe+~S(!5HJ0r01G-V46WM(+yH0 zh;b|UMR~wwe}ClJ49|P^e-xefKb!6Qhx_TS(n(vpwZ*F4norG|5lQUP+G5q-JP$?f z3NeD15n>0mX=|_6NURvOi5*+eZ@z!P{lopkeZ8*xJm2r*Xfs-ovg^l|&iln<66f+> zSc&5On_3Q!sE#v?xPkR6k%aEf5or5n=&Wk;k;XRX2y0E+*3i&ZlCQJ_&rb|7xyLw( zdT=m4n2p9%rdGUBI1z`+IqJhRwa_M3ULnT8v-VwW7n|GhhNhFu$|2*no&@}vj9|p= zIi2dSLRvzO1BhSt;=>af$_y^L9R5b&(Xwc!JLK0u7x_kV<|jA7RqGJjVqA8~zma~t zKfQIqert|Cao(>}i}F#<2(H7Lf9!L!>9ny_5}u>PUfcJO=riuAqs!#vfe)g=(EacV z@^x&i|3ZlDhvT{JtrmoYQs|#5dy4oQu7141!&Z#ACgOgDiH%o;h;V^q){blY^bvd4 zp6SEwC#WKS)6iYN)vdOk($6%0B{=#9SksK~m~#r~eK}AQPgd9BbQtfmziI93i|J`U zEH`cxn-$5PZ*-nhXEYTKtlxaN;^>FoF%R>-By3U70Ej)~wIWNvXo1TS;d}C=1)pPKvJR8q-%6o|~j7o+^AN0_7sB zIST$0AV&&ulQKwh@6l(H7vG!MF|QH$*+AfPGy4hPLJo*O}QHsnP9UTxO$< zrI??m3@vf#eJyu?t@_fJAZBT%~q>v&P= z>)lMfS06BKB(qlsBy&F4`(^O67XO8>^krT@bZi7FmOg7!j)mt*_MMMe#8C<=q{c0h z=^Bgo@Ryv`sc)~lvhHT}jk^XfHjs>FvDHM&XJYR+xWtsb^YUW&3O#=7^-9GPjUWaw&^>=W(R}VF1ea<1AF&PHZBQ;H;C~h0n-5vIg_L# zOid1(@9hbq*U@Z5GLdpa5*Y*B8SgB1jx-EhMTWE9je!TLP2~;}mTV!Sf}wtMpUs{B z6-2(+Z)ZITTzU{Fr26fA>;~wTi?e@4KbASfFyTdM5iExG=AOZtxGi=SE}`vm%c;>Y zI@qCY)#dNCIMWGvS~?q5by0bUvKy# ze|zafS!L-a_QC0tyW4C{64Begp*=#*iB&jyqlfr9)%cmwXo*#^#$xtxXkAg|*11V* zePwstgvoCPSM_h4M0%)4<(?+;LRA~GwXe*KhlD=vvVmD?{9GSlN}R}3oJK^k!?#HR z@2k@-eoo02-Qz-P++SIr&MPSxt>P)We3W@HE9(GpqZ$hc6&2(+s6Y34Ld7Qn6$AB^ z1wXZ;fBX%45@uJJ04t$Qu*|I|>;65GhF8PM*W7|mtuUS>{jb+|Gh5FcPDUvhWH#JkAI z8qS>{A@bP9wid}*@{&=z%nLnq6k548^u=DCwZxxF8kPg+Ma8fkr&CDQsC~zx10f7+J$r^H6|FG ziWYNCqVrR6*l=LRGU18-Kf6VoG%t3Bw=VOBPtCm5ot!P|F+c4+^{k6=ej1{csg)%$ z@MHmydO{_UIkl2Aj-t)&&6{ed^C);*uA51XgK2v2Rji;oKvh8p6II)&@ zkuA>6fjl^*r{Y;V2kQOt<#@JyHHBH|#*$CHledIl$;NmwZOv~w9ew}Dxt~`#iz*XT zqYW=Q_Md(>2cDPJFh_JRAemrtsTLW_5uf!4zmZ7)Lyht^J2XRW|BpL)q3$fk?X`m@ zzNkOHKJFb!G6yQ+R(|`1jg7j-cjy3BZ?{^u@*(ex!-eG9RPF{PCj;5@JpKFzfw#3DHO!!c-7$8K`~_a|+%Kb{yDPqjPZSMnx^O?=D^am##&hIWp$g zh>)r+J-vhkqZ_UR1lC(vEyBj0mNWbl&Ksnp?+|q{Qw`-q!1GqpvwW@=lIh+_37zi- z?cACff!4XG^%j5C(H*T#OWwgm$3eaM1zv=0h60ak&$U8zgIp%3eeAtdEul&wB&J4wQ%1p|M<_LaEvF|A$wwiT_UBAgs?GW|i_g0-C8Gf-WUqgE zu)m2!C)gbj%^7}JdE8%5)uD;+{F>;tZIAbkGY1kgv<;9B05V1KDOec@<(7yS2@^!> zt8=CN;j&0tPZeS>)wzUkwat>QTc?(yuT&T8MMt3;W?~FwFo2G#c%QZ-%mL~xl#vjI zinvt3KpZF`WnFhS{;+c$&va*a*(`c{sd%~5TXtByX7jrlZo*Seb%cvPa6Va3O>4OcrY|*2N>?MH4&?9Fa?<6JWMf`K7((=!^>!<-0eSw zwT?Sm{%8#F8KTZE(&tNH3Z;oUw6T>Sp}oNRuFo z+caqSyW5$;1S`Ee@Pu43C$T3g@27(u<_1vvR2eBwW9Wou<(&Z!MZ@PCV@RI~dXpFC zrx>-PVIQXo@H@nuwNo==;HSJ*ZLL*jfSdm+2D`;|^d-mO&?Tz3Zl<_HhXkPte8n|K zd?u+$Qy0^ZxiKSGE`Fk{Li3jtyb-KCXGAv8e_KW-CP~ObE5J>z>EoPH1Pi!F@F_5| zOC=rz*=tK-UnZ}IsyE*wJw(cX%2dm4(_191%=t}K57U$x!pdEF-Ge7kAEuaS05UV( zPk(Sj^aoRpfGeK{%DD{;{dJ9WAa3KM6I1*B*NAi8nY2E9> z;waXz?+yiFNz8qq$Hm17nqK-?Zu_rUYav2G{IkSn*^B`ZyAxmQRREyWL)~tRuBLu% z(DufVE&{HBO7zC}fxw3JvE2XsXOUm4rc5EHnStC%C5cW8 z(rqi7LwPycvY@e-x!BlOX+J=C!+*wxv}miAa!n$Q(tDWtN?-+E-d%>KyMkAfA+fW~ zV*>R8u#M8v`rCG;ic!c`IQ)&VUB|#BVZfTZB7;Yxgr^vTjVWpO>K<`i14eAcF~0!# z`WhZWZ|?l8zZC^%^w`w?I+Q{dl2Sl@EB%$SgKwI)iW@3<0Ta$X97gIIvjYE<}!IA-6iAJ+mf_+y}Lhfqep9jtVd493%Bd`$Qs2fm|ZG$Lf4 ztx8KQm3{;q^?u~BB3q)}#G*p~+4CmxhV8EL#>k?dE-leL3LA5j{2UkOI5uD2>kI2> z?MNq1t=Kfq#PVOGTKRWv_6SY1kXv^9X=TE z#Tn>DQwQ`h7{%-g3}(u2MRX1OgwJu**d2%OPXtm#o;NLQg&dIPMrRl=`xIe5-=13s z9~lu@?Z0%7f$S8+M>_Z3U1-T(qi0|QG~H!f-dCn)|1=lzZa1Mb4^tLV|IqC4*;v;f z=tu%(C;sQuwS{{{RPXB)O-vz_65x$8euZ)9mp*T}EMNb`h?<_on@YbW-|}F<^>7DK z+=`AbQqnuS^+A&0G04gk|A%;{pkS5vUEKKHMYk;qj!CzXI9YbnNGi85oKZ+X)%=9R zEZfBlH1!z~u~;iUjq|eGbH6IptZX{jQixoiY1=3vn#x-F++O~r2f?d;?RM!mId|q9 z|Mekj2$a=p)}C{el&3vD8-XlIRAvrI38}_v3sZPuW zC**3|N@=-{+4$1kev&ML8W>hsE5)P&DiWi~Wt0NZ#Gm%Biob9|@ohn4P}@PJ+-pfH(JNohp+O;oyLv&NcI6W_j1#+T+?n+= zc{!K{!2bnRL^hVDf~JE5XK^cH5Lr(7OnCeaDRr*} zamg2Ew%XIIj7u|bpZA=VpFDt?KPGmaw+e95%)gKU*7#1i7`pJwG8Nc=FyMsG1pdB@ zApS6cWwi<1S72us;^J5EDAGBndH-*odcoez)aN=x&9EV&co*OYUiV{?4qt|CKa&^)K?{BpwcdTCa+ zy?HTvz-t8J1zjtmaJu2#Vf8!I4ok*LW#8+TOV9Flp1OB6d%q(eK~SvvlBYXPRl$6# zFJuTDbF;7K(c)&Nx#yd3=d?nz{pI5OYW!(H5UFEV`Dgzs{hZqZ@2TJVs>b(pgP;v^x;?1?> z6|TeX9jCJJVrf|(ak5xH3!+9~_eBsM1I4~KA@k7Vn;WBD!4>z9`^y5-SWjK5>9Qikz_#E(vc}#$f*kN0F$bvKKBHy{yXKk8!;&Iv#WB>#LH+sDObAr}UFu2;vGGBRiKr=2G-FSRO6> zz1A-(aag5wyD*wVG(IF{d~^GGV~Ekw&c&=U9dhg2Oa@FZC4Jh?f2Gs~_gS8k-I>4tNV8v{? zeUCq|CcP*XHKp8b7FfBoxZx6?0h(#-cS!`P%IZ`d4>=pf>3DRps+x-%K)@ZkNdyAH z8e1~$t6^JgZ^Z4TO4!OF1eMRG#|h%WCvvmy6O@0`IX17-E6F=E!!hU^I*roiH-fta z)HpB*F5_vHJKZS6*j7i-{Vld$^j3znqNa0@?i_LBfu`Wh>BVPLOwg)0V}N$N!mD~= zV^vq(u$%n`lE6f$NV=>tCWpEj`#V1IJXeRn~@bro_1G}1ekMdJl4 zp!&uwDT6!QhAx)s3mDDS^~&l0XH;&ZN08Z| zxxUGg0@N*6m}-7l;iGm=^mL&m1mSDzZ0ViQDCyi05N*Dn$Lk>pCon)M6z?~iNy;f| zq*!ClYp_^{5`cj3=k)0=LhSEFUj}X$#o2c(V$x?4)twwj2B;N$e_7}pBJf%|v2&}j zAZ<%Fk&|})-96#i3Q?L8M$V)W(d3GT#RQI+i{5={ia`!+%Cf3BKhEXX4zV#N!1kYE zt@ObqCjhsbMhgQDFL8p@VQR0(nhV*IDLx%RQ9D@-*4B$e+^Di?E|BLszvz)MjsM09 z#`puaXUP927!n|deA?OeR-TDa9_xVd_lbhK%uKwyXxeC9%=l~;VfSO3rOtJ7_62W& z*_>wcedCzHC9;>-89P}s4RLiPy4Zt>G6A32YVTMSo$;K)03p4nvV`nz+p@}kcXXSJ zhzKZjla-AlWBH1=inPFX4@)NhUeZvkD^SseS6B92na*?I+}(mlj7OQ1%Z^d=4;viQ zs&EXaAJxN(MJ&1B_8VBQ#bASM1#N8t{=0>?rT%2}+w8qf+1$zBIX6%K_PWMPx`%DJ z^W9f$kG0RDYkU&4c~iihp75kk@L)+=P}~+)yirw$oO_GOQe{y2y}7Tso4MIs&Cc%0 z*qTNyP0%lHwtU`)T7MF$m!A8R-#c=dI8T#?j$-`U>r$2!#jRa?gzM1FS$S-T$vfoc zcSsE0-NKDYN;`V1ZFNob>8CUdb@L>jdf?T_s`5%}`)IpN<`WpM)+4kjLwJtY5*B2~ ziK`d7ms>i?&Rj3s$M|A>?P>>XV0cf$DKdM#Xm|)P4zAA|Q_>>2*arXX-(u2^jIPh= za+wNuSTW`pJQ_F1cOcctznfSrOyt#mrsHr9pQqmROUJgfNOK8Ona#R}_5*XRutV`K zRs(T*zqr--%Kd!U)YQ0BzCNz-mVswJ=USk z$&*)QP+z?IE)#-eooy^k3-)@{^;?|L)MLa=BbNcmVX8C?T3(G_;!z6>i7>Y$GoEi; zWlm*=gg>ltDCpiYGmuH{phdLz06vP<;(ycMRHh3KO70z#ZLV5?{=H_3D|wxvGoSh6 z<0n67R=bHIYb$hqZb3q_qxDin&yqV{uj8FCtkiRR9b3@%+fe(6fr%^WYR4GuZ_Ja{ zuN5fmH?iQ<&HQ*GLuiTBa`uv-CL6fzEN{z_TvHhj;O%8P&^v$vNcx@rhDUGIjvsrg zYm7}SE5_N1vJ(C+>NY5>H7f6FZ;u=MEf8G0z#RjR*HV_~4SJUY`HxZ25HmHQ4HcFG zy#Mh#V@WB(rs^Ya4E9Z-n9!(tjLOw-bWqN=8A5n>J5Nj5u&$c%7oJ$R?u}nNp0JpJ zDsIVnoH~+tN7Rxej+jhTCfK(*1Du1Col%Fm1)j>uyH`gYoBfh=csDwux}l{mrx~ra9L0NMeY( z3Raqj4;HB}%`5r*4nS_T8wMrLnI=1LT?{EODe#Z1@d$CL^rVKCTAiK>v@ z$hToCFPjPmp0xhznrH~ljOh7cJdVF!AfPsE1=yqrt}q!Fm7*sQkM->$nN*{8T7sx% zGc6gZXm7})oMic3T+?c)=)}{}o!Q1F@{0x**Wl`iU#{nxcd^CA-0=?CfVO^YQvwQ+ z^whK$<$LI4spGU-bq+OKdF@2cy}9TB-r-X9H{1@g+Fk zu`OAU=>!!xUD9qc(p?ta63_N;Vai+9EHjgcIq142DGR~lwQ)@ASTvlgJU5!tve|wZ zy|XH!S*BH7<~G-!JL6qRvpdvNzqwo-hRWBLI9)jyV9)#qnc;C%zG_>f6L6h3-xB|y z_w!i-KC!O!naK>$(TBEX2&_wYldR8CC^j~hY-0Pp_Rr;K@vA>>YzA!LqGt?=Eej_o3iH&&>ck?KwL*Doa(5`GOo0olFTZD&5bHC&~(0Yg2V? z7Oh2CKZ$_|Y;JMozay8QmGbk`7-9yYgCAp6{u`j4JxhiufikS%i_YSv8mp0Q`JSlF zx$&VT(#D6}+1l1nRyCU*4ce<0t9`2in+Bzv57fB*Fp;U*bE-=Hq29sMzFHT#1v|kx zZ0E_%>oVCz2OwLi?uWMaJ_#X@4v!v`0zeCUkg3P=^o}4p9eHyd#TdT2ffYmr=aSTk z;SOzFomZxHvx0gpwHJw#AQ;Ix+3f1!Uz2{)j%#Lhfaz;XR!R_XRK76d#Bgma46nw9 zip_5mKZ?8|O=mT3FN>^*^2F&6=-jNk2Uc$>t*PlTHomES^tj_6)<1%Ad3oc@`ZZ_% z7c9MYV$I=_t(oq?uf3PQlpVdl{g^w7)v%PIFG*xz+bl0CDCp5i>i+%r8lRXtrHyY? zWEyDeQ-1~v`qj6i-OBU(XItOq%`*OH>Yx5pnM3tXpVQYuK+85W8FC83v~#NOfz!xh z2~s_c%`4J#+_{_I!b#k0;1k!l)Sc+K41A|%X4SYMB;T;buhFNZq{n9ch_ETC0Rk-> zj3@rR#(MwnwG)>TEK|07BO^er?i2opSq->PD?e|h3nIr+H4!j%-HDtHKyBA7RVp3% zY;`W}1%f}E*!$Qz+9&c_W>as8!a1jB5%DA^c12X*3f8_jHHY!mvl~nbBy5?yl1AQQ z%=;331I4u2F~n4}t1xzw{*t-s*k`-P4&cemTu8NSLiMf0GM4F2_ij8 z;WB;-2Rr=t#$eNsaB2J(wi^h zTf@rwAkuqVZEJ%d7m^>p4d!#xn02m+GfD&01x(vPEldfvC2f72VHfovir7F$CWOV^ z-Q*B*pFVoL*y2%2rb*6tX3XSBR$Q)AP3$60x7VfZQ;QwgKZ7V=iI)rh|(+su=rj?l}^;9>=%ZSxd?)#rx7qZQ%I z=`+n*vhac=_xBX5rXW-@hz1CaO{ft6q8h;iop9mD9FmxV;pc4glcrQ&a<-ZiLwxT$ z%uvqu6fSe#vvagmf-anBH0|?Ke?Xl^bi}SHKNuuI@yeT{s8@MZk0=`}9K|vk>M%ik z?8t?aL`|NWGH;{H@cO8ki61Oboel5v^8WMe;5kE$4`SvbIIC&dSl=!4nihWW%c;+k z4QA$cho4tA(LGccRdiu$iBAOAi@~qK3{Woyy5mZK_JPb8g{IBycy4GiQ$NvaP3E9F zf9N>%IVZQ2jie7aXnZVMl)Nm4pKN>)e?*=)%e*y|9}`(AP~4 z)zmh*!j0vQnhzR0_IE0NmL)u+VSilT-VZ4DsMONMPA?h?91BOt%x53%-N{Wry! zo>496JC2`lFk|_xn|n&-T=X$b<|A88wH2txvdxR*9WyT^x~!ZIn4dD=`2H)Mf1|i< zl^%6FRn3OBPX7|&-1M;YVwiSr#CSg1ugSbECD=XFr8Ng?*)$Y-+pIz}&lr)Vh3KcR zNO()C-eOi#L(YckJ052%-rum#E%j{05yO3fOo9L1uo+9H73-6yjMw5%z2kwV+ z=x!`ss?V8(Mj@W)GtDlwl1)p+a#dB8CB@^LwKt30Xo+sj5|9JH-IYU$!FUWs5uK;L zx5*DjKi+lyf%=xp?`2*6##!Z!+09QKTq%5j4L(e?ZI;P119IVhK}eLPVLgjtCsXLR z9M-0jHg(SMs2$!emkXAs+vhY61P2)N4nH3^4|+jj&Z~lSa2=V7)jfLEy=>b5-2o0T@3^f)obOHf2R?3TLw9fOU3Oi%?aP0JA4M=$3}qKdjp2AY!FDF zVTsL=o&Gkt3(-`eq^R%hcE_uRcUr7Ecff?^>&QySABKi0Mbl3q)+ed&ANg)o^|G~XZrR8>yXuT_-;hp4#d=x4ofR&i2d0`i{PE@@tm07pfsc%EbvHU^m$KlowmS0p(X-I4`lkKeGAUW-9b=B74NaO^ zGz;i-)1BEBrden8<1xSk@)C#dGLRR-?#ha6pL><4mX?r^Cm9OKGfpHQgNKpwL?F^6U{qk_4_po4}KG8qv`@GI{az&poiqdx*uOLH#X&0+h9w)SjZMu&|!2nr=aULH3@z{-Qyjprs zzm0GEu>=Btun*R`a%Yo1+-$4a3h1^AnDE4l7H!HOXS`o5#>O(%*PI1RmW=%X3Q{9S z^75a2hTG&prpm(g4_C&v{v3wXYD_?^Fe>QvZbm_0w?Rz{ESKvi&K4tR2Q^-?y}ieN|GxXM{wg@^}K@PtSO4o|j!A zbdDb^^!?fMXZ+UeoZZ)GkRK@;k;WZMLhDR552ulcA?{P$iOztU6j> zW^fCyzm}WPCcXRS(|PtnJ&cCCdt`Ba^bOWNEGDO)Ex*PrPd+3`O!H+# z@j4p&HQF1)*PdIEXd751TfuUe7|}7l9Y71!QQhQ8u7(}kSsyRICtwWHpr(%^o(|B z)%iRVmf|Qj{7;}t5@Fj7cl>MvZW2_aB{VCBmpH!KwmnIm zEm2iB&iI`4PS@>ui4mtA$l2lW*E1$#1GTCIgx$VVjF7;Rjuh~?{rGW6Z&|$D zp>a>xOL7-`mW9}I*ILS#>m{l0Gg_JcKcx|nvhfBc`Z$9to=@P0cps;vtuvR{&pL1o zU#hrts`2wn%T0q&=%pD}iqwMZ5`KF9z44Gu9mAFQt$!Hr-E>zQ`=3N2?^2F(r2>jk zz{f(Go6dxwx8R84&9Ev?HJRY?LQ**pw>9kk`6Y+E0S56Wx|f9k z{uAp`4Ug#m&&!C5|D9seG|eaf{l0Q0?n4>J|4AFFd>}&^Br`GAt2mF*F}(gTR70X# zndJamDESzwYODfK6$hp2*nhnp|NQcg@23l&sOQOH^)Rb%&*tGKp$sZ-<8Jw^6@Mw$ zmr7y0cR+v6#;?zd-@h8DEGEx&ly}uNYdLGFM`^cd)-Y>vB@NT1P0%wu)i_bK<}4+E z2+@4li;tHNn!KZ~`Uu+?@p>Es^sCCDda-_I&6a0%ZSYGiY>F;8k3ap6C3j_ioGYA)msVjYXco1wjLFP<%|w|)`E$C4#}++mPoGCNEIYwoJ&L%an$LDrx&>V6V>9*M z$?EXgRrY>BL>5k{QdOs;MA@7Gf2X3f(*zpUs1bVNyeOL?lWo#PsI@L!P@d!_%QlwB`&mRTl>7o_~$74IL=UQwd};I2Rx#d;oJ-tH_*jY;6QCvS%B((8yd z|BM!CG<|yJeerMqZc8`u?=@AzWjy!`wj`fn*1PFb^ZX4d2!xw!Uw=ow*waWeCVHs+1dJEpTpykz5O?!WDh=&1J-b5T$RDo#cdeYerG!cvYBCdOVwxqqU)xFxy!+=s zlPUP2F4w`E1Y({n;h+$bI0Z1YiZK|?8>t`NojpJT%`$X zYv*K>XOLqQ8jDG|zRlL^l>6N6>*bFI+!N^7a!ColRTnS`JxyeH+1^q&0DauA^M)II z7w|#NY7TXo@h>7i*Q|KdL4EYt^7H5V62^%jTheps=AdCK()%=4IQF+N4+=&yZkvW$ z;cpie0Rqse_w?ygfzy^25yu=8tD=E2JQZPJWjapvo8CmNd&b<_a!4>= z=edfdnMo*~-PThPRX)RjBdp*ukQrQdU}JL$(kkCCIBp2~R_yLl@`>W=`k}+|Pa7k7 zeTYLU=PSR0cx2vGXB`z;St&8JY#ge1XkR0}Z;34ld>#zZUzRDYY1Tzlzmqz?Z}%%b z9GdOY@i`KVnpq7Oks@}0|7?;K0L6T0?@Ef%j30NXPY%dDXCsKg<<9=Y1jWY*Vk~t$ zfBHXq5N4a_&&(=hGCx_Dx>Lu1U=;R;0p8w6-j)G!_jI|S92;x;67h6a^|;5!&7|Vz z3?bcOcFUZgW0*2n{$R0xWpkl_b$^sVfD-Vu4mn-1g?;18*i9;on0>b=t9TykL$#oi$1L1?|Db6cKfdBa0osV?I-I)23nZuzXzFnOwT`tqcm zUz$$sVy4kNIXXYgXfe@cN3h(*4%h)LP*oLTDM7c;r4)DpQ>P1P+exfR4R95&{1{UuJv67@i()3MxS%W}T>2lDoPb|-W&@Blch zd#o>Gpxj8U=rMG7AueU)G`-53tPyO9F~m%VdtQ7dT{dg6OkI?fDrj=Ss0}R*fZY-P zMVh8{ff!^ICeD~pqXcTsNxmR zLK>B?`JiBM^vxoyKqTd@OJUXP$Xhd~lMCg2=Pz>|-D8=7Nf{f=oh_k`&qv!TT>}GG z?wG9tNLZdL(Rz2U!T$}pGV#AYtg`@eTXkrFA=~=zA`Qk0fD?xYgK@rnbM=Ed1`XJ( z!b2}8Z(ox|!Z&RhZAa7I?r%kE1qnLz`%W&RoAuxBDwrIhLl$%HhX>7lTy_|+**}e$ ziMYiz$_PiQA$_9t?~WGdi{Do~Z}+Ha2LvQOO^ykx{GDDLMpl?mbs2j#U z8db~^u($BIN> z&2dpr3ey1NV1!0<{f)2PP@RVQEoMd9R|v;rUhu+hlT*pYf&>4{U#{3iesr-3EHGdi zVry`3(_Ep)?F+()b*gQHEURqw=eg6L(Yl&GXjbXq?)mgZ#BHOGMT6R3Y`=pD1|u|m zNhZ$%X#5|uUO#(6fHjL$h(1~Msc@?C`PDhN;K6X1GV4-9a&Ocb10$%};Ja0lHP&_} zOeR@A;QK&jgCp-`yvWR$_J~3l`0sFqP}ctU^>ORgQ_g;%n*jmmhnemTJV2`eqsnkFgZ2NGj90t@HwI7xVrql^l|@ z?UDCjw|rhQxlLAdqIxGt4mXt=!Tm%_>$p~P)pDoSTgeYNKZukN9mcgYOA)4}K~ z$Bhmxb)X@Wb_wkey%Hk_Sw}_(LkX}3pI>I73f6~+|5c!8Gkfx7A66e%C_ftevr&CI zG!hvZ5Hq4<$m$;Se2zfSV7o=)N}zMBDCi`gfgwPcC4+R1sW-2~@bT*G`oq-Az^~Ia zpn)&U9F>yk41HQM_?;O8%^Z*IjJ>J%Mcok1ufy8#Gpj;`gv!x%BNs508z#lrrsDiQ zU}ACNBNa}ebaKV)J#1ee#QrMN>Cc`7#nbInEHifzmgWMr_LaleK?wKZk^ciGrLk%r zL8?PGdvu?>ZAXyB2=)J21dT?EXL`knxZJ+VY8 z&l7;z@UeRVxB`K!ss-xLDFH71ErZ}O{bi>U)N=tr2(-zurMBTb&Q;)bT@4gr)7&b1 zn$$2JH`kRNOE5COG=(+>n!0!^=;K;4+Gku8`~g_NOMekb=eHVpB?(3fvmkF3(EP*( z(C1^#InjCBIjBP#Shw0Ssw^y%^E_&vIUwP^z=!;xf9cyD)f;dbG7h46eU%ZA(tJ}s zJ%a5=c-!nwmJ9do=l5y-JuNljvqr&;p0Y(XvZg0b2Iwr*vT7zqM?u#1F*E?b7EpJX zj%7JmnMD`5S<)!xoM%ngTYuXOm6$%orM~zK%Z*(TxyjX z*0=rG-o{j|WU@^S-Xul@g~_QY^X;X@+r;*g!Ha(ewN^Dveiu4b%vIWsx%>PA`z=3E z+`)M@Wk`|Bjj3Q&tzdU+5>Qg8GVOn()xN`>g!x*y8`50Hy=dxl=vrD^gn> z(GJ=oE3vy`Z$X&vIXg|p4=)%H!ClxND^8B2}x6r|uaq?q@VF;+86dw^+!s zv#t7Yg!-m=5rYmQ#j z+WY_J*h`9F=6xw@4PE_vZFywE)mvD> z-yrY!crJkCF4p$RWj0S&X}axoC@dA}K-@08yPjAw5Lzc)-G0An??t^@8goo)6RXp0 z)z@CXbJY+jhsO@97=VFHWWv%V=u*&BvrPY;cy~3p3j`3I;3W>+*?bi5&hdWa>?ie# zawNThpAIzhx|bIZs87ljWDr0|H0g1r5;y{;*AC98=&V5Z7t^pbbc~scSQkryMzoU_ zR};TAEo;$LlQVUmp&qz<8d96K?P$gJzNk7CnJ=Wt373EU_gacXbwy()g?);;g_bvK zj{@`S=;iBB$Y+aTuO5l8kbpb7qmSSOYU``6Vy?b@T>C|%KCjpS{pUvG0vNz@tIHr& zfiKq4Agl5sa-MX#l$xfZbvHH7o00wt=_X$pPBOVWNO3i%r+^ZY;|>sYhw8uJLBdiX z$dNWB$CR$cVoM^V?BRKqbgBArFd9ImEjdCpdCYi(0SI^B01XnGs%@sy&rt&gyj-V7 zDTQ{Pe4kq#@&}8NWD*uvNizlKCyT67HVb_Zh+#pLmK zi4|~hvAbm0)IAA5)N5xAkZ|jUZV#e0Cr}#05b#?knmV zlD)CN3-A`w_1Y`$AoU9ofp@8%MaX&Ecjqa-aR6Xq)v(mOrLzeb_?0vA;ErpcPMPzz|4apa5y8tw)hl_q57to67B z`A+S*w6)AVaUJ??c9y;xRKZqRyGHcvl2pC%y}3i0=pR~#N(BVF(N4y*Hv_08Y^keF z3NFMw2s5wf-6(5#3nz{8sFu5L+SYVo=TO4GKF!qhX8pMPA0Unsg_1;Ycy;?1#vV0Z z>Ll8SiVFYvu5QVoHsAd&rQgZu@3jW#nQ%&X50H|dA7?G&;EY6KoBB%82^u!V2kVC+ ziKB0h>Ic?6GGKJ`bFz=dR`$T1M3Zo5>+{V|28|{$4fe&oD}g`LYJAK50WW_I7}d4= z^M_7^&K~w(We zbTclyWW;;)TVn#0-FsBA^WHgcnRPi?cZ^McRZZ4`a)(g9`ZgEv(Hp7?c$ z&bcw5OyO`#utsr4`^C~rYL-PJ?>6|=v3}El-%{KAUAlp$jokGsBD&kq+CiYklpS5u zy4E`Y7W|Jp5X2r)&N&?uRU1zkm09(Ikom&=i|rjPr24T-ZM-+9Uou z@*TdzHZvC(l8_2V!r^X0+OiMP)K%xt9?&0Hv<+EL0{22Y;&amLfbH#_%v0ceHbFj}k_2>Sz@jaZNwcr?DJQE5x196H zWs@qGu67{%pH<6;ZBiA(8@i-Pc0n=5fF?6Fb-EFw*;&ivj@3zZ1{HtXvS}|P6F-52 z7t;;=JdpwMR(^8POar>MwX?GqZL({N(&o-rZS%78RB77$fE~FHSgRmusAyarVGgm`vvj*(}L83$>rF$5^ z(onxQ_*q5kS#+&tTcmlwWjrFiDL5zgGeNj-vtgyxKn$wBMMt7SUX2ycG}I;O@t_xC zG`I~v#GJ4ME^tjNx}0Blq5q>LKPAPv8B^z>*s-p#mD5`KW;Uw~)*@4~qN)S*n+mNv zx3ESV?SHkwc{S>E#6H%#FGrR(KU$%Gq|Ys>EKTfSa5dL^Gb#saF2-$M4d}(((5~7# zmn*jw#N);x8WTzCHQz3D5p;rwp03V6Vg)P`g}Bs@4oXLMdGMV>@MJF0uc4`LybqzqLtRiX zy$n+_Z+j^T#?SwM6rFWkQ~mqKeI6S@q(oXt86_?K&^g8!BL$SMfpo)HP>|6vQb2NS zqhX9jq`O9rkW{*JfWQ6zKYyLqIiGW``@XLCwK-MyO-7rxVly3eV=-rw8peos+8Xq= zoa8d7R#y!R%MCtzswDk&QJ6eKT|C9_677C@|M{`XbX1zQ2q4h4-;RqQ8u~1fDs0wY z%!JRn-%UEXNrtSYFZH2qz5=Po9t;L+zHST4QUTq1=DPE`9~N{Z53I76+yX4}aQ2St z`~1DNCx@aRe3VCICmF5KNWYBRm8sSuHC%(+S;K^~nOZ~Zk9amPKZ1c`)#&-cwy6({ z&YkYN8U?48K8iC&tAYb?#ULj?f$+bZnDdTRn+vh{GkY~I*I|dugjb>jv5ce+K7}z; zf#k#>EBUFnT#Qt?maOxV6c%eeJoD;lvo{~3RTChQ1X|~$d5zkink$89q7D4JfdN$i zD??5mRG`9gi*>+mrx)C5Mz4&k<^cCkbRh;^K)323uF2i9e-otCf)n z*bA8qOZHyB($1?Ar}gMd@3O*qKOZ1uO$h&!iQ|>U6G(U{CfaI9xl$us^*G?$+Hl&Tk0e5%&qD6!W`jzfWPVa{6L~ zLJ%H*6d4O``#bi}n;C(L#xvP!7$||sDnCoq2%h$FH}L3E$t@AJrY6@ z{>3@g@%ZbP$uhBuZJ3}A8rOYAXpjwRy24#-NaWPK0wKB}8zqh+!hWA$Y`(L$M-tJd z{YL)HhL#MY!`0mBSu+)>OABVXFR%pj-B~6;o?*sXQ5NO>AUy`#Bmt<0)kc^B#?d~s z;_=ofJ*a5=uHa@xd1*Tgl*}aRQ)hv4oVedqi8#s6*Gl9`jRP>CoSVH&xAKWzYNrA0 z6IU%UW`Vz+;=5tj!-2J;4Vk4!MgqYU^yaI=NBXOz4V<^aypm(h0MOE+-T6uS&+Rca zDskDqJk9AR_$I~=;7^zPvjoQKd}?g>{K%lKfVHl(OYy`+aQdm*GD?xMz^43FeT7^PS_# z770sd*PN!|T_>a>)KZLrSrtYB(=rkhJ6Qz4jWmjm`o)|by}EQ*Ix2}YPV0XpHhfDZ z)ph0k4Uoly%edzfl|?|y{s-001nrkKHT zJe+Uam|qAiH^e;qdSn?27Lho#`nn^pM^DU{V)^T> z00(;?$UM9plaxNkgEq+fRCOf&E>ZLf0QkP12633&d6HFU*9X*o9{N#@+cDJ})$Ix_ zt8L!-5a1>=vD#nQwEe3EsUx#D{j#)r&KR2T?;XEbE$~DU&~oc7z@o1n?d@cS^nN}Rs1~}8-Z5) z!ge!RFmZ7m__^k+ZX+xQP_}^hIwFR$B()jDjOk8Nt8VZDUnlow0&JZXh*Pm3zo%*W zS^@PU)P05%ZwygsXPl3sKq%`mS^9_<>B!CL&3HwzdYnR-`oY;s<%M6N%#V;Uv$kTJCMkInzz3Cp%nfwAXPp zRSH|ZWt{n@5&SJbTVjl*t8FfH?q*Q&KDN+Kjhb5E$seO)ho3JwwO-wDjP3EoKSX^{ zjpc~F){CBl@e%_-@k8Qipi|y`$_1$C8!DBTo@7yU#tRkn`D5_(taA{>Ey)1);GCNq zu^Oo@BmLD-DPcgMC|RXgo9r!R%qzEv8@WTakEYvK;zD`Rlt#N6gCUugK&7Qyiv6J% zDbJq?!^lbod%A5Bx_@N21jRn{J`L3-wo^N$wVywbGTDgNDhYltcJ(O!99FKlc@>H} z&t?ch!}}AJioPNouA^U01~S-)l$!Dwk+8ie(g1p18s6yS_Nt`p6JGOWl9Au5(J%M| zo7C4fo=nKo+u`^fqT+8N2Sx0$CMdP%9}rDABAG8N?1hyEB2{_46zLF`q0bkJjX#Sx zvplEwUq$y1z~`Gld^Cl=$;6?r6Ve(V$PyvA1=aNrHzwy7Ko`I2Th zg(~U9!vL>mLsq0V24Ze0*%3;J<6-=cnxZJ%z3_n*RM7KTWm(z}-GsXtwtV`&-SaJbvA zY){Rq0#%XTE5`gLh3JY@8j!|w?ohS(9VBLk0ivnQZxHUQr*_C4r8s2YIKc$IhZ3wL zIW1*|YkOq%Ap;^0wGVG9IzsqdS0r779qti0E(SP0hch*wu?Pg=YcMwxlgc$`T&hYc zKU2*^*TJ7h2R0`#v&n=urjKIyDhWH}MG;tIF@OxkCrL-gW%EA6G-JDqnQDY8%yz0W zptNnq%~7{wb4#EpCUV#3zj^A?d{rG5Rqi2@(Q337!9W&n8Cme=YrEZp&~u+y`FNYl zR%uWZrsQ}3d(U*O$F`}anJ65L`!{+#u}ijUoEwmcavW#4u5_dW!4!^Nh?R1A2Xn2_ zPOYw(f2If(#F08-1kv^B?A}~UWZc{d!r*u)s=Tbr#ijMGfSLTeSlYt@fU0g%Mb`B- zaHqg`3d9%w-D@D{E5R6sO)ZPyKQ}++1Evl^#xr%i`~mZ4fBeo3ji^&VOyfnc|1{d% z=QwkWCQW8z2b!9AWbU&Fn$~z~GY!zb{Zln;D(mF$%;^+hY%S*Qx4_fLfs|Ij2a0Af z`JS;Es_OZe`}A$2Z1Z(|>|AmVlineKa!wHa;8w$&9He09pOX0gusb;*qatx*qvFe@ z*&8bTqh%b<(pT3M*98`MemLW0BCE@43ipK=DQ2YRC+3thc#yX$;NH|$Nz@O99KzZ* z=oX&Q7XTO@nn}s!&-^<^l%nU9AH&uJqLTQf%5(b7E0FHH&f@na)>Y<(= zPmYFc$q1&iiTRqL$9E0({Awp;f16_UQ(31?6)lVZxS6`+Zd_&Oy445=DEU@_BvXz9 zo7k;q8PNBP9nhPq+W5}$OfY`mhs|nP`nQ|yx#1-&H|z&YHpHp8!2S1kVz)O&gw4sde?y`pd7yBoc^4=+gE|K!d(;Z|A5~*F^j_@TxoIZSV?}c*>g-K5jXr;m zM2GO5)JcY(b3t{+zj3q2-|($hit&Cb6_YBpg&KnPwzg~!n)oi(GI^i-S41r_p9}WL zK(9b{LC&4ln|Wz$E$6>&_ZSyfhyh>2$r@p?laqL_D#I=TqqH6LpTbxJ&9`=Hi7Q%= zP@%TynS~6)3l>~UHP+HvWLd^Hc%w4gESzwlP3uhw!5uWg3j+6KPrWLqfRa0yfYl>) zU4!N?qPVuyNTA&FZPd^naC_FQZw(d4a%f&(H$1%E%xXbaB{KkQmEoh2m-+ZO$eZd_ z&&m(?Ld;w5Oj$GaOCPVt-P3DLcdO4WKN_xLIJ?FnFsCc#r(=X815pU1&!m}X{V;k~ z>mLn>xxAzhb0wXP8a<9B_qri~I;hyywSCd7qpq0Y(Mv+sLyRN)zz2ys20km&GL+Db zp{cFo;va+bwz)$d1$f)~D7Z$ioQLIJ+MSyF?36?Y`#xWfcf&Ja4uW|n^~c?^x528i zG4JyS4R@F=7G`P1s|-~6-3Kdq=tM=N2C+1G31CCS~JZXZ(JF3kpV z(B0D~aaTpKM&5!nzq5@a!ZR2QcMio;=u}(bZqNG0)9s5@&08`PmCHp2z0kg?rg-5RVO~yW+R0Oyb5Hv>v|`?m)h$}N-cs{!IewGr zy1J>{3tj(28kloiRn!GG*{(H(9FKo!T&a=a4vAxUy<&=9D@ATUuKBo|8Ijb=1<%$w zqCIWo=NhSfFneo~%ZCdY?{&R7wXBnFt1t~KE{}^BHdmdTfq(6!tFg|v!+bhAeWr7& z%kgHFk7}3QnS@5<$Fq?WNpi+*t}GV6U<)(>Uc(MaU$wF_Iqv0-)#RsckVpBIyz*Ko6^r2(0A!IHg7$MRp;1wmn zs?A$1%9MM@^8}GHQKTwVZa{Ki=8d&{ooV}&3pn$&fx#(e5BJ40D;Sv7jQDD7%X`$q zX>=9feacN+AN|Qb4n?PgdA zy#Unm5La>@akaSRD9RETRg!)tD1SGiV7@>cx7hd^E&5E_unWMGpGUu-aa~Y0-Ys%OYTDRR!X+GVsup^;-gTys&?Qhn3D4WpE6M-45>DQ*X z^R66Vo^fR9J}BaK${_$B*|~0=AKJZ+lP*TTdeRj;WN78_)}*9za7-tMF^Vg@Fu-g2 zUx7d$Hk~oo>q*@}rX$gcqtnxx%|xdm3x-vvz;+f@{Sk_Qj4A10O4jeUK!w>;DK7%s zA~3R*+b@rhm0v>%5wSsGULO)jtaZ(DF0DukGRCjZIj7e_3=rgWXwhhpe)wwfpLn<5 z(_B>_7Y4|c^6SXe-%WieCd_K;=VhR3fGIsgNhQU|L|zuu6sfs&1EJvbx+oQoI=agQ zgroa?h8I#z?ZEft%^X~rTOPdC7Fy7EiWUZ1{uj%l%1^OvIs0Wfyqn!*rKn;F!E}zr zmCx;1G|yyNk(bFYYYnxTH&=SGxZxDwD+SqGhB@hLZ|WB&RaK2gejVfBmb6FQMMfni zB?O-nxA!o>qPE@L9@Sju4U~1bVJ`QzF zx<`V>e!OTa$8ddiIBWgHbjL|q_gak~6FaTb+kfvQ*MAE+?6Q}UvECUB z*rn}*y2FkG-7LBw-#~^L4bw+~+a)ePf zHi;ZdUZYBazqhV+&wZ|7i-F6>+EeMJX$O4=ll9k0%LK0uh-E^zK`<^#ewM^V;EMpw z2UG49;N05#bq^K^DLb*N4OJJ9IFW@xUvzty2**-s4$qC#hGqkE-FC8DAnIq))b}IV z_uy??RJFe&FW(!&=!RnqPiAsIC^Pk4tMg)OE{A5#1c0lVyp@5xifzX^RR_ zk=N!FY6oW+qICvWG-OCpXyT+%h#&#+zVgBWse#w7u!$kS~FHe zzoMHPdEVeuY08L}^Lmk4op*i$ZI&kSVfp!J0B{pqO&1SkPGWF;nO`_4?!0CPS0%M{ z_}#8{{h8S5@p^dFcBwogqS}PBHzx7TCuio`+6KPeNURW~&{xu?SALky%C|wf6AMhm zTCp)4&F_)f&j&bxYbCwYXH< z6cXoR;y^T?ItRcM=4Sm?(YtHGjCrRV+B-5o_F|VH5c12kpTNjZ1r?~HP@nH*M2!NC z><^~zbWX(%H>1y5GsQ!(0Wr6OJ993gweACP1;v`bX)cdVz7=VP&JvA!{Di?j-?DzT zJS$^E-K5Lmj?!%P46xLDT2u*e1@e>(%9Svz^Q&7HMn!%TvVZ_T9{+_@wG*CcB5Q>m zAIz7kPX*{gEsZeiQvo65Ek_)OVAe1G?LY-y=4T;d6> z7hP4q3vGSWmPdkF|5`|PXdTS^6wnsjrL*m>oq$81=a*97DL-ts);wa6RrCsABXO8t zZvK`7=JA`3NU66G4Ede;^#`tO1lFl9tu0A`_S(>nC0>j*lAP4lDX@Nm4YEltC;f9*X2LuU?M^=!J$YF)SIj<$RFYt zc*@SeNy#)M8=;q!Trl+H&7|A0DmJ9Tk5pZuRK`F1NY;5x{cu$!Gg0=(rM~*qn2N*H z?i%P=d-JyUp=6}P>RJF?$8N>p@Fd@_I7&jL!D)6wQ%CxgS6J%?y<2^S2YtW zUhL0t#;y*wa6P^2?)yOC*Mz#bpiCZ$^=nu{|HOl`d~)_2X*NX>X9K^s;j4^1n0uor zgG&hIz>z%%6r50qR7Gy@7Sy=c|0yD>BDS3PswVWu^vYU5qWPgsEcHHS7Tda*pWdA5%)H(^5 z{x8cngUUUa$xRRiJ-aRu&U~pkkobV02O^{`u&e+#aLKIJ0e|}zJ-Z>S3Do69h1TKP z9DVjy-gO%lR@eW%vwU)aR*k;l`E_;mg`)u34Ss;^flYOS{gD*wNoE0CEDJMDf%lFH zcKk6(2I~Ql*4A65iX56vfw!&25rH?Qq3%%a2fuRn1Smj6jH&bZ6_%1u>6S`BJ&gIm z_(e3X+M^G2|1GM|##b2&Q_>&5c&C-2CE!t~WPbm8sjlxTp_+z(myrlA3quBX33kAG z%wF<>YkZPE@c#PTU{{39ZKp88>_N^+_=3Tu%S@#HjrVhdP&8gt?xTy{@QBI zDANwJoHQoIM0BT(d$ndUT%?36MI{PMgqkchxrruVfN8i!t%86L2{)ZXDLE7kVToJv z8=fFD^M8Jn1?wf1-Ee=bPWKXVwh46zZW}$ReQRoJzB?VL{Wy7E*rA z0Ijt7QGI(6)cG^0%mDw>uZ+OQS8?@CxyUoY1;XsyU`TsG5viz_!M&~L7iI`3qACDT zJ}3>R;uO1h8?pkPE66Nb%ev(Cus)`^nYy*JaqzD04a1Tz~ojtZ*Lw+=RpB%E!kNoiAI#$WPrtH1WXa49ymE*ddX-SUym;JJ?if1-&{K*`F3iE^=D^XxgWfT zM+ldX-xr4SG@rX*X~j?V#0=Sf53JK{ zd$|5&PX(^Gi9o&IqF*u3QV85@O5(Sr0BCXLb|#LA=Hm)BL*0+s2J=C}1ANf)?QyU87Rkc&xu-R(^D3v6xW0OL)W3i#nkK<(C6+GWhj(Zy8*j^1ef zy!+hAi#M)#;nb|g-b$=X@m$pU;G`aitNS>nv{})04$;4_rdEGe)b;m{C`FruM4|74 zdGwG?3Dk;k<6Psb5dH+LhoDPpG~6x2MI(`>3D4RxFeZuboM5tnex#tnpn{9-AsySM zf{Uwe6~TDM7T8qlW2o-Bv!%6FKg6NVZJ2F{apyl)N#rkLPrF{#zMa?|unB!5fJo|t zt{gIndU%akYBRRDo^@G$ta2^=Z1vcD6+NGE9U;SQi{_fk&wmkpc@3|2h0=Ru=l@mTS>$Aw=`()x6XQN=U zs|c=WQ|;X}mTy1zj0WAztNy3JfvH3sX%UX=MRPj>+9)7q=<4#akNWn@;jh+u^;Jd2 z2gF*95^PU0NDF~Q? zF3Lj(yPK-zE$Qhb4hy57gclQeMMc&ysMn?`kS@^UWG;0Yd>?2%cCFxP`|e0e z;8lh9nq=L?h4n$8?b-ccl7(V+w!W;PMTXCV+jz1kz0c-*POiH)B&}zCJ^CGkWp!~J zpbeYJGZq^9cVcS9>1^-U)?C0=&_lhc_sGF^7Ox?kqbM4s_w^+b6_NSP;Gg^N5Qj*_ z+a$>wonwwb5i{*|R&}OpK83ngMVrQn%8%Q;UFFty6H?orBt+>aIsQ&n*0XhLbQBA< zW$XWA1q1Wc$km3t_kHN)^I*DYDLdo9HyApiuRiZHZStY2em)Nw&c7%x?NWkngzQgB2QwBq}eZ$+qU$A^t0#T?UgjsyDS;7ewc!FrGu z&ZeFxRT6uv#ly?B&~{@i{s7#=uFcK`V0I{QdMpIg2w`6a{;bm%I~MGG1=qmi(@b z`&M5IV+nE6!A+CU%fTWYk7>Q0*lq}{{>mel1_Vw*4vt>(ZVhTPdu6hXJ=b2ab{)x) z>A)dJugHQuoM_8Ak zL!9T~HsL0C^5U(#Yt{DB0wM)jj?RXYY5v>ut_bzpZ{WM@iP@Z8`GWJfveEM)Bp-L;J z_A;a`f8Jo0p)GLWWh!7MGbRrnr*WgTU({B8*IC!iGFGOdq;8}6>F#1vGGpo32oU$i z82zWJHsPOqse*E2uA<{$49Qi0TK)OMHol8eZYHo=qwxEW4cuo0*Z=|t(M>JWM1v|UElraGd+ukv?m8wV9$s5;bD#@ zCbz3xwUypt!ifcE;n08}^ycPipri?6mW|Df4h-Su<4aC{2n1_J&C94;PqiyQT;$Y3 zyxBO%Ie_i4Om7Kii%6cGU z7;mHrg+hc52I=Gt>i`Xa!nAXHc1v`>WaWyC*jR66|>0Z z>+@iU;KirSTsY3w*5Nja`N!JygJg|r+99T z#^-fT9lB9Id5_|d;N?vN0!qaNxmoVMQ})J+bJEWGbC@E_sa5)`x=T;CDh1D{k8>|3 znmqhjYNi5lZr-WK-D|IT30^_)x$LwD8`dpH1e}~ zk(rLp4opIm!fa=od+(t=h8?y2=cV zHwFz3zLpj{AFwp^AZ-ZPlB~lJpu_$R`VY~a?0s3gd3b#iAzU zvAej~ZLsGe;Nm5PdX4@q75m!=hu*||4=@R0r(!DfY}EXH00J5Z_Z`r$8yW8ElphTH zuqwIO%@H$>8dz}Lg!%30A`v`3__`ig(^xHDK@}HfV&^;d%PH6}PE3H#6YR=>`aspQ zSWYr49871H;Vk*ayC@@kj>d-cMsM)c`gEfT@AL-u3_^1t?F5EF6@0Y%e0}ClkhcKa z!TjD-88Wi_s9hYK@&il5eo++16&!Fw(t*~K!r9wP34!8+&qnux#N}WRMAU#y{%6BN z=@Wf%!)NIsyT66DYYJ;bY8<12Gk2?I8G3F0x97K(nfZ3}bP9~sqoYEmO5K|~bi6P3 zuCl*;nfV8JLci2qvTB;H!M#Cd3ap$HXUV+J4ul#9%Tr#g%ZofOPKWfDN8j>pPX25J zPeOaY)VfN0nY`c-{_L>(YxvmK&Eu`+RvZUZzl*oSF6hpNXxOcYzbV|%Q=R9JTi2Bz0~&|6Rm)_ zozzoHnw-!HqjN9U_xy4B?+LsQZQu*ElrLmq>L(rPL?O??qHH%XROE-#JKpZWD6-ryewwfLJ$ z7uXhPJ7;P&F+7+4d31FWKPq;0vRPMhVYtpa_vm)@qy0-iuJK*)bEQ}g*8h6P)3+AK z0F-8p9NZ{{>gd&nlBA5e9*A^Z;87a|_)*y{0B;sz8pWYy%$2sQb+dD)uf$BPmNa_J z2lU4-^JEblKhEyNyd`tp-2)a0C-Z5Y)Vr3WoxUYQv{PbNhzL~LfEWqfC*e33^Y@%Hg&AOfYHlx2z`i_9Wzi=<7hL!*Qa6~iaJ7ht4;z0AN;WuB}y&{#? z1DYsu2JN=9s#fL`^nv8Txh?J)%yBd25wgRAIdIt!HtE`~g1)Ijg!@RDn3bj33l!H= zTl=tgq!UiGu8}oPN8AFC+9YN6t#Ej1eBEnZHGu*f9}PPMw!q{HexpC8quWmXa}copE`1nEB@r-?;ZO+Ga}$& zZKs*c-ut4Q$Yl$wd{ciX4s`HjOZ5D#UF`+-bB6=y}n6Zw;_+tPbPtGJnDgXhwsbc_w1e=spQr;+>} zcXevo{&s$k(ioW*8;vYRx4Mmxt5zmWyDt}N;nGroDEjGUeuEfT65{5#kYnMVnFI18 zS=oCH#4hK%ZF_?oA~UhFrgNqojGJTkT6^RDeY&T%hpK>}23(G7T$41SN?mZFXRSu+ zU*1&H2GnYgiq({L)Ho+;@5R^M1~d&u#1(D5d+6Y*le#gOvprwySDarKQBYM)d!Yk! z>5nCnm~biG_7RY1O$CcY+Qd-QDDsw5%aU&}9q{PAlHO#kI8=y{3E&WbZa~S7s6O00 zEfKo3a3(hUrVfxsDKOUgUAYcr(gLKEju2Q@hi{PW@;cdhMKq}qRtIT5L+0nb-@U~U z73I?S|K2fNJ%O}xl$_hSZ*nDWom2Yn&G>Z5iH(gKObC!{a)Kc0Q`&?U=}Xt)MX7#* z##s+#2nfHwfAFwJya^jr$ZRKmHh-hXk!e(k*q-NXl1&nX|+=Y$y zmSe{P`(xrP#7$rknpNOGp|9QaF;Lm@ha}f?>3{%+BQdDiIS;oa)mIF<$JQy2gmyP= z)O2#GHxr-xT7x0|Uz|%04 z!sJAqWjvL1w((9^{D=8WdROAR2Jz|NY7@X>l|8b?-;9W<&r)yTS}{W~bFZ0WIvEGQ z&knn=kfO7^lFfRD;;?rUhg&svPSA~ncKXiSJWSx#4;+Qz&qG<35m%?TI*>1yL z^T6cP*tE4x*M`0Gn9DcfU@ejM9=c8XV!G@laiFTM#J@S>y~qYp5D)08{;Ci z#$6k0{ZQk;{lv1K51T`>!lSBSRcwj;VrJ@VN5kwTl^mgS7(qMGs?WRbw6Lq0H#3rh zOp&I1dTt`N2)prUVtRVqB3;)xWnutIv-zfn(_zl?%Xx$=ZV_*M+WW}ipk`uBt!g)} z1zFUywox1x-OlXIlq+sviuQL#VXyS_Vz3k|Zbr3JOy!bhqnhcRyUpBvarBNngZ3-A zA+AnWzP$Wyt1U{((nSFhUmoqCP@%dA=e(b;F|A5Y=%K1c89Fq&KzNU3)ga5>$$GK6 zE~ilSDFxuUoniBze+Pc1R`bQ_gYod7a_uMSiNEYQ1lA5QtvAn`6hlJthF%W4Db!gTXuzrYFx2@k8^4hjSvN-GLq#n` z$dcd=(*}Olg$1+m2Q)2ep;aDOF{Y4A$Ig^pGZt~#(UozrQZz`XMkb95Di$Euxb7=1 z{~RH)8){{<&02h4vFd7-_4OP4srYLrQuo7*vAPA^`G1WQvK4s~Cs!G=O`mD$lh+hTI7y(b@hH6nJylIhLSit-)-jMRuzcxz?|b3uG3&Ot70*NKBM6vFKwQo(EPHcHeu2GhQ&PC; z*7dq*(Ts2xs9?X#7Mo>Fmry{Xx7NH6Ip+qnOd`w*tw3Cwy&qUq^M8I@T0|Etrx4Dd z3D&LolWMLT{HaYOG_%cSL*o8JLl?-*g=u4hsvW4(S6;{kCeYF1(`6_`E}UXuX7)HP zEcv0DQ!%Md;QN3+;-pIHHh%OG>%gVl#LS?G_Dn8)=){9Vzmng{-utbDC4@VEL>&|d zst<0X#lM|n;0zO@ESLTa(l<$-*#C>q)7_sj89KC#F75c;D4*)26;QH1U(YfU-8Bhi z$U1XCvlmB*y_u+0k-+-;x>;mfglRVf?0fDA^hFnxloOaD#fI5vxMzEFXhLt|_xfzJC< ztN*6rZ5lmu3U!x&mGr#>ojoqUT8Z{tHq2p*=mUAO?D#ojU}`;Dt2Cl_$otfl)rpZ8 z?F4XI@1$(}3H=ZQ#@onI>uGSNs!!du(D)Mj`v|$Rah|6YoIQDJzB%(z5u(UC(>3Yc zE#xKm2CHlBZtsY}mFc`;ev`~+#9wvOm&8V2oby_|t(5n5s% zi?77HEbJaZR(teU{|}&(V=;6|I5(URV@x@@3;t<<>aALT+``3`DP) zjZCJQ%F=hz>f0npY0fdl`>TV&x`%>VPK?duCM?(tQr}*hN(z>eri*$w_NL8t3-=vI z;X5y6X7{Eg%2M~rk}AGy1BKaKJ$(4Jeqaou&VRCNsGt(Psdl@xDP}J7eEUx+r>N^* zYB*rm7|V{~P_1)7JCJU<6q;e{(8EAW#Y6el$9;8d)0_f1d)j%OzfEQyf3vmVO-l-) z+Kap|F8YodksX&-rls{V0Fn%&8L{bCuwS-#zo|ilS@K6;svamTd#KgNrz4Rg)jpmD z=Tk2Cpg!CHem!ZZpI-}|{KT63L`CPyz=?I}cKQ!%Q|I#GWY%I6%wG7E_Qb?gw88hD zS-96U7fe7xnFcTlUa7{W=Ydt&v(8J#z?_a=Xc5g_wpn5C$LX*SHTV2b+k6DJsBYVH zv6NG8_m~J%bg6{06d0F>=~w-dFOm|$>qH?-ndb%gcax`!rKP1>T#9A1q15mxsUSAe zZo&X!eRd6gV0je9Ta`3b{l?4Db)4ghKzxE+)JX%LFJfN+p(t~y#6%UY*uu^-1gImti|s!T<`VH;tkkA^$}J+ zSUL+!_JdiI+pmkUtQ8;R)eGOuTzkW4ga4P6<}v;=UJ*_RbPI4b=q2-|)@Z~>|1SXA&9jyKObPc4RXe(mMtY}fV+PG5428PDxtAB6?E8C>(vCaXsy z93Ph!G3*XRn*5m_YO?GS37$_>g(GOp#=Gb=|G9i}^!JXZ9q$2ZD){f68Ddy^8B}c< zt;0.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

$t~k47fe9FT-07(4=ucXA$^epNnfRsVaFUd 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

lZPBlWo&hN&U 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 literal 0 HcmV?d00001 diff --git a/1. Hierarchical Invariants/main_demo.m b/1. Hierarchical Invariants/main_demo.m new file mode 100644 index 0000000..b458587 --- /dev/null +++ b/1. Hierarchical Invariants/main_demo.m @@ -0,0 +1,47 @@ +close all; +clear all; +clc; +addpath(genpath(pwd)); +dbstop if error +warning('off'); +%% parameters +param = struct(); +param.type_feat = 10; % type of feature as following: +% '1.ZM';'2.PZM';'3.OFMM';'4.CHFM';'5.PJFM';'6.JFM'; % Classical Jacobi polynomial based moments +% '7.RHFM';'8.EFM';'9.PCET';'10.PCT';'11.PST'; % Classical Harmonic function based moments +% '12.BFM'; % Classical Eigenfunction based moments +% '13.FJFM'; % Fractional-order Jacobi polynomial based moments +% '14.GRHFM';'15.GPCET';'16.GPCT';'17.GPST' % Fractional-order Harmonic function based moments +% param.XNM = [0,0;0,1;1,0;0,2;1,1;2,0]; % K = 2 all the n and m for the moments +% param.XNM = [0,0;0,1;1,0;0,2;1,1;2,0;3,0;2,1;1,2;0,3]; % K = 3 all the n and m for the moments +param.XNM = [0,0;0,1;1,0;0,2;1,1;2,0;3,0;2,1;1,2;0,3;4,0;3,1;2,2;1,3;0,4]; % K = 4 all the n and m for the moments +param.alpha = 1; % parameter for fractional-order moments +param.p = 2; param.q = 2; % parameters for JFM and FJFM +param.scales = 8; % the scale +param.numofscale = size(param.scales,2); % number of scales +%% load input +img = imread('text.jpg'); +img = imresize(img,[512,512],'bicubic'); +%% proposed techique +[ord,featcell] = HI(img,param); +%% visualization +K=max(max(param.XNM)); +h=figure; set(h,'position',[0 200 3000 800]); +L=size(find(ord==K),2); +idx = 1; +ha = tight_subplot(K+1,L,[0 0],[0 0],[0 0]); +for x = 0:K + for y=1:size(find(ord==x),2) + axes(ha(x*L+y)); + imshow(featcell{idx},[]); + idx=idx+1; + end + for z=y+1:L + axes(ha(x*L+z)); + imshow(ones(size(featcell{idx})),[]); + end +end + + + + diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/Krawtchouk_moments.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/Krawtchouk_moments.m new file mode 100644 index 0000000..d78df81 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/Krawtchouk_moments.m @@ -0,0 +1,83 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +K = 80; +P = [0.5,0.5;0.42,0.58;0.58,0.42]; +NP = size(P,1); +NB = 75; +BF = cell(NP,2); +SZI = [100,100]; +for i=1:NP + [BF_x,BF_y]=KM_BF(SZI,K,P(i,1),P(i,2)); + BF{i,1}=BF_x; BF{i,2}=BF_y; +end +%% Texture Images +location = fullfile(pwd,'KTH_TIPS'); +Imds = imageDatastore(location,'IncludeSubFolders',true,'FileExtensions','.png','LabelSource','foldernames'); +rng(100) +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.8); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Texture Featuring with KM +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_km(x,K,BF,NP,NB),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_km(x,K,BF,NP,NB),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Texture Classification with PCA Model +model = PCAModel(trainfeatures,30,trainImds.Labels); +predlabels = PCAClassifier(testfeatures,model); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['KM, accuracy = ',num2str(Accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); +%% Texture Classification under Orientation and Flipping Changes +testImds.ReadFcn = @customreader_imgeo; +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +Ttest = tall(testImds); +testfeatures = cellfun(@(x)feature_extraction_km(x,K,BF,NP,NB),Ttest,'Uni',0); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +predlabels = PCAClassifier(testfeatures,model); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['KM, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/convolutional_neural_network.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/convolutional_neural_network.m new file mode 100644 index 0000000..5c73dec --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/convolutional_neural_network.m @@ -0,0 +1,144 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Texture Images +location = fullfile(pwd,'KTH_TIPS'); +Imds = imageDatastore(location,'IncludeSubFolders',true,'FileExtensions','.png','LabelSource','foldernames'); +rng(100) +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.8); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Texture Featuring with CNN +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +imgsize = 224; +trainImds.ReadFcn = @(x)repmat(imresize(imread(x),'OutputSize',[imgsize,imgsize]),[1,1,3]); +testImds.ReadFcn = @(x)repmat(imresize(imread(x),'OutputSize',[imgsize,imgsize]),[1,1,3]); +reset(trainImds); +reset(testImds); +%% --------simple CNN imgsize = 224 +layers = [ + imageInputLayer([imgsize,imgsize,3]) + convolution2dLayer(7,16) + batchNormalizationLayer + reluLayer + convolution2dLayer(3,20) + batchNormalizationLayer + reluLayer + maxPooling2dLayer(4) + fullyConnectedLayer(10) + softmaxLayer + classificationLayer]; +%% --------alexnet imgsize = 227 +% inputnet = alexnet; +% layersTransfer = inputnet.Layers(1:end-3); +% numClasses = numel(categories(trainImds.Labels)); +% layers = [ +% layersTransfer +% fullyConnectedLayer(numClasses) +% softmaxLayer +% classificationLayer]; +%% --------vgg16 imgsize = 224 +% inputnet = vgg16; +% layersTransfer = inputnet.Layers(1:end-3); +% numClasses = numel(categories(trainImds.Labels)); +% layers = [ +% layersTransfer +% fullyConnectedLayer(numClasses) +% softmaxLayer +% classificationLayer]; +%% -------- +analyzeNetwork(layers); +options = trainingOptions('sgdm',... + 'InitialLearnRate',0.0001, ... + 'MaxEpochs',20, ... + 'MiniBatchSize',100,... + 'Shuffle','every-epoch',... + 'Plots', 'training-progress',... + 'Verbose',false,... + 'ExecutionEnvironment','gpu'); +t = tic; +net = trainNetwork(trainImds,layers,options); +Time = toc(t); +%% Texture Classification with CNN Model +predlabels = classify(net,testImds,'ExecutionEnvironment','gpu'); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['CNN, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); +%% Texture Classification under Orientation and Flipping Changes +testImds.ReadFcn = @(x)customreader_imgeo_cnn(x,imgsize); +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +predlabels = classify(net,testImds,'ExecutionEnvironment','gpu'); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['CNN, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); +%% Texture Re-Featuring and Re-Classification with CNN + Augmenter +augmenter = imageDataAugmenter('RandXReflection',1,'RandYReflection',1,'RandRotation',[0,360]); +augimds = augmentedImageDatastore([imgsize imgsize 3],trainImds,'DataAugmentation',augmenter); +t = tic; +net = trainNetwork(augimds,layers,options); +Time = toc(t); +predlabels = classify(net,testImds,'ExecutionEnvironment','gpu'); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['CNN, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); +%% Texture Classification under Orientation and Flipping Changes +testImds.ReadFcn = @(x)customreader_imgeo_cnn(x,imgsize); +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +predlabels = classify(net,testImds,'ExecutionEnvironment','gpu'); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['CNN, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/discrete_cosine_transform.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/discrete_cosine_transform.m new file mode 100644 index 0000000..fba1de1 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/discrete_cosine_transform.m @@ -0,0 +1,74 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +NB = 90; +%% Texture Images +location = fullfile(pwd,'KTH_TIPS'); +Imds = imageDatastore(location,'IncludeSubFolders',true,'FileExtensions','.png','LabelSource','foldernames'); +rng(100) +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.8); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Texture Featuring with DCT +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_dct(x,NB),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_dct(x,NB),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Texture Classification with PCA Model +model = PCAModel(trainfeatures,30,trainImds.Labels); +predlabels = PCAClassifier(testfeatures,model); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DCT, accuracy = ',num2str(Accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); +%% Texture Classification under Orientation and Flipping Changes +testImds.ReadFcn = @customreader_imgeo; +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +Ttest = tall(testImds); +testfeatures = cellfun(@(x)feature_extraction_dct(x,NB),Ttest,'Uni',0); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +predlabels = PCAClassifier(testfeatures,model); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DCT, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/discrete_wavelet_transform.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/discrete_wavelet_transform.m new file mode 100644 index 0000000..15bbab0 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/discrete_wavelet_transform.m @@ -0,0 +1,75 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +NB = 45; +NF = 4*NB; +%% Texture Images +location = fullfile(pwd,'KTH_TIPS'); +Imds = imageDatastore(location,'IncludeSubFolders',true,'FileExtensions','.png','LabelSource','foldernames'); +rng(100) +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.8); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Texture Featuring with DWT +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_dwt(x,NB,NF),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_dwt(x,NB,NF),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Texture Classification with PCA Model +model = PCAModel(trainfeatures,30,trainImds.Labels); +predlabels = PCAClassifier(testfeatures,model); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DWT, accuracy = ',num2str(Accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); +%% Texture Classification under Orientation and Flipping Changes +testImds.ReadFcn = @customreader_imgeo; +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +Ttest = tall(testImds); +testfeatures = cellfun(@(x)feature_extraction_dwt(x,NB,NF),Ttest,'Uni',0); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +predlabels = PCAClassifier(testfeatures,model); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DWT, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/DIR.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/DIR.m new file mode 100644 index 0000000..9a59f4c --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/DIR.m @@ -0,0 +1,49 @@ +function [featcell,time] = DIR(img,param) +%% input +if size(img,3) ~= 1 + img = rgb2gray(img); +end +img = double(img); +timestamp = tic; +%% get basis function data +bfdatacell = cell(1,param.numofscale); +for ns = 1:1:param.numofscale + sizeofbf = param.scales(ns); + if mod(sizeofbf,2) == 1 + sizeofbf = sizeofbf - 1; + end + if param.type_feat == 1 || param.type_feat == 2 + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.ZNM,param.alpha, param.p, param.q); + elseif param.type_feat == 11 || param.type_feat == 17 + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.SNM,param.alpha, param.p, param.q); + else + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.NM,param.alpha, param.p, param.q); + end +end +%% naive feature generation +% raggioU = ceil((sizeofbf-1)/2); +% raggioL = floor((sizeofbf-1)/2); +% featcell = cell(1,param.numofscale); +% for ns = 1:1:param.numofscale +% featcell{ns} = abs(bf_filter(img, bfdatacell{ns})); +% featcell{ns} = featcell{ns}((1+raggioU):(end-raggioL),(1+raggioU):(end-raggioL),:); +% end +%% fast feature generation by FFT (Convolution Theorem) +featcell = cell(1,param.numofscale); +fft_img = fft2(img); +nof = size(bfdatacell{1},3); +fft_img_cell = single(zeros([size(img), nof])); +for i = 1:1:nof + fft_img_cell(:,:,i) = fft_img; +end +featcell{param.numofscale} = abs(bf_filter_fft(img, fft_img_cell, bfdatacell{param.numofscale})); +unisize = size (featcell{param.numofscale}); +for ns = 1:1:param.numofscale-1 + temp = abs(bf_filter_fft(img, fft_img_cell, bfdatacell{ns})); + rr = (size(temp)-unisize)/2; + featcell{ns} = temp ((1+rr(1)):(end-rr(1)),(1+rr(2)):(end-rr(2)),:); +end +%% output +clc; +time = toc(timestamp); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/HI.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/HI.m new file mode 100644 index 0000000..dbcb699 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/HI.m @@ -0,0 +1,32 @@ +function [ord,featcell] = HI(img,param) +K = max(max(param.XNM)); +idx = 1; +featcell = cell(1,1); +ord = zeros(1,1); +for x = 0:K + if x == 0 + param.NM = param.XNM(1,:); + [feat,~] = DIR(img,param); + featcell(1)=feat; + ord(1)=x; + else + param.NM = param.XNM(idx:idx+x,:); + inputfeat=img; + [feat,~] = DIR(inputfeat,param); + for z=1:size(feat{1},3) + featcell = [featcell, {feat{1}(:,:,z)}]; + ord =[ord, x]; + end + for y = idx-x:idx-1 + param.NM = param.XNM(idx:idx+x,:); + inputfeat=featcell{y}; + [feat,~] = DIR(inputfeat,param); + for z=1:size(feat{1},3) + featcell = [featcell, {feat{1}(:,:,z)}]; + ord =[ord, x]; + end + end + end + idx=idx+x+1; +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/KM_BF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/KM_BF.m new file mode 100644 index 0000000..cb61b3c --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/KM_BF.m @@ -0,0 +1,52 @@ +function [BF_x,BF_y] = KM_BF(SZI,K,P_x,P_y) +N = SZI(1); +x = 0:1:N-1; +BF_x=zeros(K+1,N); +W=zeros(1,N); +W(1,1)=(1-P_x)^N; %xy=0 +for i=1:N-1 %xy=0:1:N-2 + xy=i-1; + W(i+1)=((N-xy)/(xy+1))*(P_x/(1-P_x))*W(i); +end +if K>=2 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); + for n=3:1:K+1 + order=n-1; + A = (N*P_x+(order-1)*(1-2*P_x)-x)/sqrt(P_x*(1-P_x)*order*(N-n+2)); + B = sqrt((order-1)*(N-order+2)/(order*(N-order+1))); + BF_x(n,:)=A.*BF_x(n-1,:)-B.*BF_x(n-2,:); + end +elseif K==1 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); +elseif K==0 + BF_x(1,:)=sqrt(W); +end + +M = SZI(2); +y = 0:1:M-1; +BF_y=zeros(K+1,M); +W=zeros(1,M); +W(1,1)=(1-P_y)^M; %xy=0 +for i=1:M-1 %xy=0:1:M-2 + xy=i-1; + W(i+1)=((M-xy)/(xy+1))*(P_y/(1-P_y))*W(i); +end +if K>=2 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); + for n=3:1:K+1 + order=n-1; + A = (M*P_y+(order-1)*(1-2*P_y)-y)/sqrt(P_y*(1-P_y)*order*(M-n+2)); + B = sqrt((order-1)*(M-order+2)/(order*(M-order+1))); + BF_y(n,:)=A.*BF_y(n-1,:)-B.*BF_y(n-2,:); + end +elseif K==1 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); +elseif K==0 + BF_y(1,:)=sqrt(W); +end +% X=BF_y*double(img)*BF_x'; +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/KM_D.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/KM_D.m new file mode 100644 index 0000000..c0f7b03 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/KM_D.m @@ -0,0 +1,52 @@ +function [X] = KM_D(I,K,P_x,P_y) +N = size(I,1); +x = 0:1:N-1; +BF_x=zeros(K+1,N); +W=zeros(1,N); +W(1,1)=(1-P_x)^N; %xy=0 +for i=1:N-1 %xy=0:1:N-2 + xy=i-1; + W(i+1)=((N-xy)/(xy+1))*(P_x/(1-P_x))*W(i); +end +if K>=2 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); + for n=3:1:K+1 + order=n-1; + A = (N*P_x+(order-1)*(1-2*P_x)-x)/sqrt(P_x*(1-P_x)*order*(N-n+2)); + B = sqrt((order-1)*(N-order+2)/(order*(N-order+1))); + BF_x(n,:)=A.*BF_x(n-1,:)-B.*BF_x(n-2,:); + end +elseif K==1 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); +elseif K==0 + BF_x(1,:)=sqrt(W); +end + +M = size(I,2); +y = 0:1:M-1; +BF_y=zeros(K+1,M); +W=zeros(1,M); +W(1,1)=(1-P_y)^M; %xy=0 +for i=1:M-1 %xy=0:1:M-2 + xy=i-1; + W(i+1)=((M-xy)/(xy+1))*(P_y/(1-P_y))*W(i); +end +if K>=2 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); + for n=3:1:K+1 + order=n-1; + A = (M*P_y+(order-1)*(1-2*P_y)-y)/sqrt(P_y*(1-P_y)*order*(M-n+2)); + B = sqrt((order-1)*(M-order+2)/(order*(M-order+1))); + BF_y(n,:)=A.*BF_y(n-1,:)-B.*BF_y(n-2,:); + end +elseif K==1 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); +elseif K==0 + BF_y(1,:)=sqrt(W); +end +X=BF_y*double(I)*BF_x'; +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getBF.m new file mode 100644 index 0000000..e8c5291 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getBF.m @@ -0,0 +1,161 @@ +function [BF]=getBF(MODE,SZ,NM,alpha,p,q) +[rho,theta]=ro(SZ,SZ); +pz=rho>1; cnt=sum(pz(:));rho(pz)= 0.5; +L=size(NM,1); +BF=zeros(SZ,SZ,L); +%% ZM +if MODE==1 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getZM_RBF(order,repetition,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PZM +elseif MODE==2 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPZM_RBF(order,repetition,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% OFMM +elseif MODE==3 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getOFMM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% CHFM +elseif MODE==4 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getCHFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PJFM +elseif MODE==5 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPJFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% JFM +elseif MODE==6 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getJFM_RBF(order,rho,p,q); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% RHFM +elseif MODE==7 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getRHFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% EFM +elseif MODE==8 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getEFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PCET +elseif MODE==9 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPCET_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PCT +elseif MODE==10 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPCT_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PST +elseif MODE==11 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPST_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% BFM +elseif MODE==12 + v=1; + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getBFM_RBF(order,rho,v); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% FJFM +elseif MODE==13 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getFJFM_RBF(order,rho,p,q,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GRHFM +elseif MODE==14 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGRHFM_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPCET +elseif MODE==15 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPCET_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPCT +elseif MODE==16 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPCT_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPST +elseif MODE==17 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPST_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +end + diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getBFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getBFM_RBF.m new file mode 100644 index 0000000..7e78f83 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getBFM_RBF.m @@ -0,0 +1,17 @@ +%% REF +% Xiao B, Ma J, Wang X. Image analysis by Bessel¨CFourier moments. Pattern Recognition, 2010, 43(8): 2620-2629. +function [output] = getBFM_RBF(order,rho,v) +Roots=zeros(1,max(order)+2); +syms x; +Roots(1,1)=vpasolve(besselj(v, x) == 0, x); +for i=2:1:max(order)+2 + ST=Roots(1,i-1)+3; + Roots(1,i)=vpasolve(besselj(v, x) == 0, ST); +end +% obtain the order and repetition +n = order; +% compute the radial polynomial +rho=rho*Roots(n+2); +output=besselj(v,rho); +output=output*sqrt((1/(pi*(besselj(v+1,Roots(order+2)))^2))); +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getCHFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getCHFM_RBF.m new file mode 100644 index 0000000..cf6a8bc --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getCHFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +%¡¡Ping Z, Wu R, Sheng Y. Image description with Chebyshev¨CFourier moments. Journal of the Optical Society of America A, 2002, 19(9): 1748-1754. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getCHFM_RBF(order,rho) +% obtain the order +n = order; +p = 2; q = 1.5; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getEFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getEFM_RBF.m new file mode 100644 index 0000000..e60c98f --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getEFM_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hu H, Zhang Y, Shao C, et al. Orthogonal moments based on exponent functions: Exponent-Fourier moments. Pattern Recognition, 2014, 47(8): 2596-2606. +function [output] = getEFM_RBF(order,rho) +% compute the radial polynomial +output=sqrt(rho.^(-1)).*exp(1j*2*pi*order.*rho); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getFJFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getFJFM_RBF.m new file mode 100644 index 0000000..a9d3022 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getFJFM_RBF.m @@ -0,0 +1,38 @@ +%% REF +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getFJFM_RBF(order,rho,p,q,alpha) +% obtain the order +n = order; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getGPCET_RBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getGPCET_RBF.m new file mode 100644 index 0000000..b2dd435 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getGPCET_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPCET_RBF(order,rho,alpha) +% compute the radial polynomial +output=sqrt(alpha*rho.^(alpha-2)).*exp(1j*2*pi*order.*(rho.^alpha)); +end % end getRadialPoly method diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getGPCT_RBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getGPCT_RBF.m new file mode 100644 index 0000000..27b2420 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getGPCT_RBF.m @@ -0,0 +1,10 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPCT_RBF(order,rho,alpha) +% compute the radial polynomial +if order==0 + output=sqrt(alpha*rho.^(alpha-2)); +else + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*cos(pi*order.*rho.^alpha); +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getGPST_RBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getGPST_RBF.m new file mode 100644 index 0000000..ef8c6d0 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getGPST_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPST_RBF(order,rho,alpha) +% compute the radial polynomial +output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*sin(pi*order.*rho.^alpha); +end % end getRadialPoly method diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getGRHFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getGRHFM_RBF.m new file mode 100644 index 0000000..f40ccf5 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getGRHFM_RBF.m @@ -0,0 +1,12 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGRHFM_RBF(order,rho,alpha) +% compute the radial polynomial +if order==0 + output=sqrt(alpha*rho.^(alpha-2)); +elseif mod(order,2)==1 + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*sin(pi*(order+1).*rho.^alpha); +else + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*cos(pi*order.*rho.^alpha); +end +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getJFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getJFM_RBF.m new file mode 100644 index 0000000..b7103d3 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getJFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +% Ping Z, Ren H, Zou J, et al. Generic orthogonal moments: Jacobi¨CFourier moments for invariant image description. Pattern Recognition, 2007, 40(4): 1245-1254. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getJFM_RBF(order,rho,p,q) +% obtain the order +n = order; +alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getOFMM_RBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getOFMM_RBF.m new file mode 100644 index 0000000..4c2fe59 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getOFMM_RBF.m @@ -0,0 +1,41 @@ +%% REF +% Sheng Y, Shen L. Orthogonal Fourier-Mellin moments for invariant pattern recognition. Journal of the Optical Society of America A, 1994, 11(6): 1748-1757. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getOFMM_RBF(order,rho) +% obtain the order +n = order; +p = 2; q = 2; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; + +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPCET_RBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPCET_RBF.m new file mode 100644 index 0000000..7700dd6 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPCET_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPCET_RBF(order,rho) +% compute the radial polynomial +output=exp(1j*2*pi*order.*rho.^2); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPCT_RBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPCT_RBF.m new file mode 100644 index 0000000..b67c9c3 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPCT_RBF.m @@ -0,0 +1,10 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPCT_RBF(order,rho) +% compute the radial polynomial +if order==0 + output=rho.^0; +else + output=sqrt(2).*cos(pi*order.*rho.^2); +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPJFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPJFM_RBF.m new file mode 100644 index 0000000..4b87097 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPJFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +%¡¡Amu G, Hasi S, Yang X, et al. Image analysis by pseudo-Jacobi (p=4, q=3)¨CFourier moments. Applied Optics, 2004, 43(10): 2093-2101. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getPJFM_RBF(order,rho) +% obtain the order +n = order; +p = 4; q = 3; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPST_RBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPST_RBF.m new file mode 100644 index 0000000..e71350c --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPST_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPST_RBF(order,rho) +% compute the radial polynomial +output=sqrt(2).*sin(pi*order.*rho.^2); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPZM_RBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPZM_RBF.m new file mode 100644 index 0000000..68e7305 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getPZM_RBF.m @@ -0,0 +1,44 @@ +%% REF +% Teh C H, Chin R T. On image analysis by the methods of moments. IEEE Transactions on Pattern Analysis and Machine Intelligence, 1988, 10(4): 496-513. +% Al-Rawi M S. Fast computation of pseudo Zernike moments. Journal of Real-Time Image Processing, 2010, 5(1): 3-10. +function [output] = getPZM_RBF(order,repetition,rho) +N=size(rho,1); M=size(rho,2); +repetition=abs(repetition); +rho=rho(:); +output = zeros(order+1, length(rho) ); +if rho==0 + if repetition==0 + output( (0:order)+1,:)= 1; + else + output( (0:order)+1,:) = 0; + end + output=reshape(output,N,M); + return; +end +q=repetition; p = order; +output(q +1,:) = rho.^q; +if q==p + output=output(end,:); + output=reshape(output,N,M); + return; +end +if q == p-1 + Rpp=rho.^p; + output(p +1,:)=(2*p+1)*Rpp - 2*p*rho.^q; + output=output(end,:); + output=reshape(output,N,M); + return; +end +p=q+1; +Rpp=rho.^p; +output(p +1,:)=(2*p+1)*Rpp - 2*p*rho.^q; +q2=q+2; +for p = q2:order + L1 = ((2*p+1)*2*p)/((p+q +1.0)*(p-q)); + L2 = -2*p + L1*((p+q)*(p-q-1))/(2.0*p-1); + L3 = (2*p-1)*(p-1)- L1*(p+q-1)*(p-q-2)/2.0 + 2*(p-1)*L2; + output(p +1,:) = (L1*rho+L2)'.*output(p-1 +1,:) + L3*output(p-2 +1,:); +end +output=output(end,:); +output=reshape(output,N,M); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getRHFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getRHFM_RBF.m new file mode 100644 index 0000000..2a59186 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getRHFM_RBF.m @@ -0,0 +1,12 @@ +%% REF +% Ren H, Ping Z, Bo W, et al. Multidistortion-invariant image recognition with radial harmonic Fourier moments. Journal of the Optical Society of America A, 2003, 20(4): 631-637. +function [output] = getRHFM_RBF(order,rho) +% compute the radial polynomial +if order==0 + output=sqrt(rho.^(-1)); +elseif mod(order,2)==1 + output=sqrt(rho.^(-1)).*sqrt(2).*sin(pi*(order+1).*rho); +else + output=sqrt(rho.^(-1)).*sqrt(2).*cos(pi*order.*rho); +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getZM_RBF.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getZM_RBF.m new file mode 100644 index 0000000..e9e5f7f --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/getZM_RBF.m @@ -0,0 +1,48 @@ +%% REF +% Teague M R. Image analysis via the general theory of moments. Journal of the Optical Society of America, 1980, 70(8): 920-930. +% Chong C W, Raveendran P, Mukundan R. A comparative analysis of algorithms for fast computation of Zernike moments. Pattern Recognition, 2003, 36(3): 731-742. +function [output] = getZM_RBF(order,repetition,rho) +rr = rho.^2; +for p=0:1:order+1 + q = p-4; + while q>= 0 + H3mn(p+1,q+1) = -(4*(q + 2)*(q + 1))/((p+q+2)*(p-q)); + H2mn(p+1,q+1) = H3mn(p+1,q+1)*(p+q+4)*(p-q-2)/(4*(q+3))+(q+2); + H1mn(p+1,q+1) = (q+4)*(q+3)/2-H2mn(p+1,q+1)*(q+4)+H3mn(p+1,q+1)*(p+q+6)*(p-q-4)/8; + q = q-2; + end +end + +for p=0:1:order+1 + q = p; + Rn = rho.^p; + if p>1 + Rnm2 = rho.^(p-2); + end + while q>= 0 + if q == p + Rnm = Rn; + Rnmp4 = Rn; + elseif q == p-2 + Rnnm2 = p.*Rn-(p-1).*Rnm2; + Rnm = Rnnm2; + Rnmp2 = Rnnm2; + else + H3 = H3mn(p+1,q+1); + H2 = H2mn(p+1,q+1); + H1 = H1mn(p+1,q+1); + Rnm = H1.*Rnmp4+(H2+H3./rr).*Rnmp2; + Rnmp4 = Rnmp2; + Rnmp2 = Rnm; + end + if p == order && q == abs(repetition) + output = Rnm; + break; + end + q = q-2; + end + if p == order && q == abs(repetition) + break; + end +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/ro.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/ro.m new file mode 100644 index 0000000..17021fc --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/MOMENT/ro.m @@ -0,0 +1,36 @@ +function [r,o] = ro(n,m) +r = zeros(n,m); +o = zeros(n,m); +R = max((n-1)/2,(m-1)/2); +for x = 1:n + for y = 1:m + xx = x-1; + yy = y-1; + if (xx<=(n-1)/2) && (yy>=(m-1)/2) + p = yy-(m-1)/2; + q = (n-1)/2-xx; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = asin(q/sqrt(p^2+q^2)); + elseif (xx<=(n-1)/2) && (yy<(m-1)/2) + p = (m-1)/2-yy; + q = (n-1)/2-xx; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = pi-asin(q/sqrt(p^2+q^2)); + elseif (xx>(n-1)/2) && (yy<=(m-1)/2) + p = (m-1)/2-yy; + q = xx-(n-1)/2; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = pi+asin(q/sqrt(p^2+q^2)); + elseif (xx>(n-1)/2) && (yy>(m-1)/2) + p = yy-(m-1)/2; + q = xx-(n-1)/2; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = 2*pi-asin(q/sqrt(p^2+q^2)); + end + if r(x,y)==0 + o(x,y) = 0; + elseif r(x,y)>1 + r(x,y) = 10000; + end + end +end diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/PCAClassifier.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/PCAClassifier.m new file mode 100644 index 0000000..0450061 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/PCAClassifier.m @@ -0,0 +1,50 @@ +function labels =PCAClassifier(features,model) +% This function is only to support wavelet image scattering examples in +% Wavelet Toolbox. It may change or be removed in a future release. +% model is a structure array with fields, M, mu, v, and Labels +% features is the matrix of test data which is Ns-by-L, Ns is the number of +% scattering paths and L is the number of test examples. Each column of +% features is a test example. + +% Copyright 2018 MathWorks + +labelIdx = determineClass(features,model); +labels = model.Labels(labelIdx); +% Returns as column vector to agree with imageDatastore Labels +labels = labels(:); + + +%-------------------------------------------------------------------------- +function labelIdx = determineClass(features,model) +% Determine number of classes +Nclasses = numel(model.Labels); +% Initialize error matrix +errMatrix = Inf(Nclasses,size(features,2)); +for nc = 1:Nclasses + % class centroid + mu = model.mu{nc}; + u = model.U{nc}; + % 1-by-L + errMatrix(nc,:) = projectionError(features,mu,u); +end +% Determine minimum along class dimension +[~,labelIdx] = min(errMatrix,[],1); + + +%-------------------------------------------------------------------------- +function totalerr = projectionError(features,mu,u) + % + Npc = size(u,2); + L = size(features,2); + % Subtract class mean: Ns-by-L minus Ns-by-1 + s = features-mu; + % 1-by-L + normSqX = sum(abs(s).^2,1)'; + err = Inf(Npc+1,L); + err(1,:) = normSqX; + err(2:end,:) = -abs(u'*s).^2; + % 1-by-L + totalerr = sqrt(sum(err,1)); +end +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/PCAModel.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/PCAModel.m new file mode 100644 index 0000000..e62c4dd --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/PCAModel.m @@ -0,0 +1,47 @@ +function model = PCAModel(features,M,Labels) +% This function is only to support wavelet image scattering examples in +% Wavelet Toolbox. It may change or be removed in a future release. +% model = helperPCAModel(features,M,Labels) + +% Copyright 2018 MathWorks + +% Initialize structure array to hold the affine model +model = struct('Dim',[],'mu',[],'U',[],'Labels',categorical([]),'s',[]); +model.Dim = M; +% Obtain the number of classes +LabelCategories = categories(Labels); +Nclasses = numel(categories(Labels)); +for kk = 1:Nclasses + Class = LabelCategories{kk}; + % Find indices corresponding to each class + idxClass = Labels == Class; + % Extract feature vectors for each class + tmpFeatures = features(:,idxClass); + % Determine the mean for each class + model.mu{kk} = mean(tmpFeatures,2); + [model.U{kk},model.S{kk}] = scatPCA(tmpFeatures); + if size(model.U{kk},2) > M + model.U{kk} = model.U{kk}(:,1:M); + model.S{kk} = model.S{kk}(1:M); + + end + model.Labels(kk) = Class; +end + +function [u,s,v] = scatPCA(x,M) + % Calculate the principal components of x along the second dimension. + + if nargin > 1 && M > 0 + % If M is non-zero, calculate the first M principal components. + [u,s,v] = svds(x-sig_mean(x),M); + s = abs(diag(s)/sqrt(size(x,2)-1)).^2; + else + % Otherwise, calculate all the principal components. + % Each row is an observation, i.e. the number of scattering paths + % Each column is a class observation + [u,d] = eig(cov(x')); + [s,ind] = sort(diag(d),'descend'); + u = u(:,ind); + end +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/bf_filter.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/bf_filter.m new file mode 100644 index 0000000..4567b20 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/bf_filter.m @@ -0,0 +1,17 @@ +function y = bf_filter(x,bfdata) +% filtering bank +% y = bf_filter(x,bfdata) +% +% x is a 2d matrix +% bfdata is the filter bank, it is a structure with the following elements: +% .number number of filters, +% .bf a 3d matrix with the filters, +% .factor factor of the filters. +% + + len = size(bfdata,3); + y = zeros(cat(2,size(x),len)); + for index = 1:len, + y(:,:,index) = imfilter(x, conj(bfdata(:,:,index))); + end +end diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/bf_filter_fft.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/bf_filter_fft.m new file mode 100644 index 0000000..67dc4a3 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/bf_filter_fft.m @@ -0,0 +1,13 @@ +function y = bf_filter_fft(x,fft_x,bfdata) + + len = size(bfdata,3); + bf = flip(flip(conj(bfdata),1),2); + pbf = single(zeros([size(x),len])); + pbf(1:size(bf,1),1:size(bf,2),:) = bf; + y = ifft2(fft2(pbf).*fft_x); + y = y(size(bf,1):end,size(bf,2):end,:); + +end + + + diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/bf_filter_fft_scale.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/bf_filter_fft_scale.m new file mode 100644 index 0000000..c0a662b --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/bf_filter_fft_scale.m @@ -0,0 +1,6 @@ +function y = bf_filter_fft_scale(fft_x,fft_pbf_cell,bfdata) + + y = ifft2(single(fft_pbf_cell).*single(fft_x)); + y = y(size(bfdata,1):end,size(bfdata,2):end,:); + +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/customreader_imgeo.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/customreader_imgeo.m new file mode 100644 index 0000000..ea3bf17 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/customreader_imgeo.m @@ -0,0 +1,15 @@ +function data = customreader_imgeo(filename) +onState = warning('off', 'backtrace'); +c = onCleanup(@() warning(onState)); +data = imread(filename); +RA = [0,90,180,270]; +i = randi([1,6],1,1); +if i<=4 + data = imrotate(data,RA(i),'bicubic','crop'); +elseif i == 5 + data = flip(data,1); +else + data = flip(data,2); +end +data = imresize(data,[100,100]); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/customreader_imgeo_cnn.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/customreader_imgeo_cnn.m new file mode 100644 index 0000000..f7251ef --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/customreader_imgeo_cnn.m @@ -0,0 +1,15 @@ +function data = customreader_imgeo_cnn(filename,imgsize) +onState = warning('off', 'backtrace'); +c = onCleanup(@() warning(onState)); +data = imread(filename); +RA = [0,90,180,270]; +i = randi([1,6],1,1); +if i<=4 + data = imrotate(data,RA(i),'bicubic','crop'); +elseif i == 5 + data = flip(data,1); +else + data = flip(data,2); +end +data = repmat(imresize(data,[imgsize,imgsize]),[1,1,3]); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_dct.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_dct.m new file mode 100644 index 0000000..8e76827 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_dct.m @@ -0,0 +1,9 @@ +function [F] =feature_extraction_dct(I,NB) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[100,100]); +X = dct2(I); +F = ring_integral(size(X,1)-1,NB,abs(X)); +F = F'; +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_dwt.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_dwt.m new file mode 100644 index 0000000..8af02c3 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_dwt.m @@ -0,0 +1,28 @@ +function [F] =feature_extraction_dwt(I,NB,NF) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[100,100]); + +F = zeros(1,NF); +[LoD,HiD] = wfilters('haar','d'); +[cA,cH,cV,cD] = dwt2(I,LoD,HiD,'mode','symh'); + +X = dct2(cA); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(1:NB) = Y; + +X = dct2(cH); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(NB+1:2*NB) = Y; + +X = dct2(cV); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(2*NB+1:3*NB) = Y; + +X = dct2(cD); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(3*NB+1:4*NB) = Y; + +F = F'; +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_hi.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_hi.m new file mode 100644 index 0000000..218d313 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_hi.m @@ -0,0 +1,15 @@ +function [F] =feature_extraction_hi(I,param) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[param.imgnorsize,param.imgnorsize]); +I = imgaussfilt(I); +I = padarray(I,[param.imgpadsize,param.imgpadsize],0,'both'); +[ord,featcell] = HI(I,param); +F=zeros(size(ord,2),1); +for i = 1:size(ord,2) + X = featcell{i}; + Y = mean(mean(X)); + F(i,1) = Y; +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_km.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_km.m new file mode 100644 index 0000000..7146c1c --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_km.m @@ -0,0 +1,16 @@ +function [F] =feature_extraction_km(I,K,BF,NP,NB) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[100,100]); +F=zeros(NP,NB); +for i=1:NP + %% Moments + M = BF{i,2}*double(I)*BF{i,1}'; + %% Ring Integral + [IM] = ring_integral(K,NB,abs(M)); + F(i,:) = IM; +end +F = reshape(F',1,[]); +F = F'; +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_scattering.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_scattering.m new file mode 100644 index 0000000..7f4c08d --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/feature_extraction_scattering.m @@ -0,0 +1,12 @@ +function features = feature_extraction_scattering(sf,x) +% This function is only to support examples in the Wavelet Toolbox. +% It may change or be removed in a future release. + +% Copyright 2018 MathWorks +if size(x,3) > 1 + x = rgb2gray(x); +end +x = imresize(x,[100 100]); +smat = featureMatrix(sf,x); +features = mean(mean(smat,2),3); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/multiclass_metrics_common.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/multiclass_metrics_common.m new file mode 100644 index 0000000..179c58a --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/multiclass_metrics_common.m @@ -0,0 +1,93 @@ +function metrics = multiclass_metrics_common(confmat) + +%%***********************************************************************% +%* Multiclass metrics *% +%* Finds the multiclss metrics provided a confusion matrix. *% +%* *% +%* Code author: Preetham Manjunatha *% +%* Github link: https://github.com/preethamam %* +%* Date: 11/24/2021 *% +%************************************************************************% +% +%************************************************************************% +% +% Usage: metrics = multiclass_metrics_common(confmat) +% Inputs: confmat - confusion matrix -- N x N matrix +% +% Outputs: metrics - metrics.Precision = Precision; +% metrics.Recall = Recall; +% metrics.Accuracy = Accuracy; +% metrics.Specificity = Specificity; +% metrics.F1score = F1score; + +% Array initialization +N = size(confmat,1); + +Precision = zeros(1,N); +Recall = zeros(1,N); +Specificity = zeros(1,N); +Accuracy = zeros(1,N); +F1score = zeros(1,N); + + +if size(confmat,1) > 2 + + for i = 1:size(confmat,1) + + TP = confmat(i,i); + FN = sum(confmat(i,:))-confmat(i,i); + FP = sum(confmat(:,i))-confmat(i,i); + TN = sum(confmat(:))-TP -FP-FN; + + Precision(:,i) = TP / (TP+FP); % positive predictive value (PPV) + Recall(:,i) = TP / (TP+FN); % true positive rate (TPR), sensitivity + if ((TN / (TN+FP)) > 1) + Specificity(:,i) = 1; + elseif ((TN / (TN+FP)) < 0) + Specificity(:,i) = 0; + else + Specificity(:,i) = TN / (TN+FP); % (SPC) or true negative rate + end + Accuracy(:,i) = (TP)/(TP+TN+FP+FN); % Accuracy + F1score(:,i) = (2*TP) /(2*TP + FP + FN); + end + + % Remove junks + stats = [Precision', Recall', F1score', Accuracy', Specificity']; + stats(any(isinf(stats),2),:) = 0; + stats(any(isnan(stats),2),:) = 0; + + % Compute averages + Accuracy = sum(stats(:,4)); + Precision = mean(stats(:,1)); + Recall = mean(stats(:,2)); + Specificity = mean(Specificity); + F1score = mean(stats(:,3)); +else + TP = confmat(1, 1); + FP = confmat(2, 1); + FN = confmat(1, 2); + TN = confmat(2,2); + + Precision = TP / (TP+FP); % positive predictive value (PPV) + Recall = TP / (TP+FN); % true positive rate (TPR), sensitivity + if ((TN / (TN+FP)) > 1) + Specificity = 1; + elseif ((TN / (TN+FP)) < 0) + Specificity = 0; + else + Specificity = TN / (TN+FP); % (SPC) or true negative rate + end + Accuracy = (TP+TN)/(TP+TN+FP+FN); % Accuracy + F1score = 2*TP /(2*TP + FP + FN); + +end + +% Output +metrics.Precision = Precision; +metrics.Recall = Recall; +metrics.Accuracy = Accuracy; +metrics.Specificity = Specificity; +metrics.F1score = F1score; + + diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/multiclass_metrics_special.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/multiclass_metrics_special.m new file mode 100644 index 0000000..2a92807 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/multiclass_metrics_special.m @@ -0,0 +1,161 @@ +function [Result,ReferenceResult] = multiclass_metrics_special(confMatrix) + +%%***********************************************************************% +%* Multiclass metrics *% +%* Finds the multiclss metrics provided a confusion matrix. *% +%* *% +%* Code author: Preetham Manjunatha *% +%* Github link: https://github.com/preethamam %* +%* Date: 11/24/2021 *% +%************************************************************************% +% +%************************************************************************% +% %confusion matrix for multiple class start +% %Inputs-1.Actual Class Labels,2.Predict Class Labels and 3.Display if need +% %Outputs +% +% %1.Result-Struct Over all output Which has follwing +% %2.RefereceResult indidual output Which has follwing +% %%%%%%%%1.acuuracy +% %%%%%%%%2.error +% %%%%%%%%3.Recall (Recall or True positive rate) +% %%%%%%%%4.Specificity +% %%%%%%%%5.Precision +% %%%%%%%%6.FPR-False positive rate +% %%%%%%%%7.F_score +% %%%%%%%%8.MCC-Matthews correlation coefficient +% %%%%%%%%9.kappa-Cohen's kappa +% +% %%Original Developer Mr.Abbas Manthiri S +% %%Date 25-12-2016 +% %%Mail Id: abbasmanthiribe@gmail.com +% %%http://www.dataschool.io/simple-guide-to-confusion-matrix-terminology/ +% %%https://en.wikipedia.org/wiki/Confusion_matrix +% +% %%Modified by Preetham Manjunatha +% %%Date 02-03-2020 +% %%Note: Fixed Abbas written code where the NaN and Inf values were +% not considered while performaing the class average. +% +% % clc +% % clear all +% % close all +% % %%Multiclass or two class +% % [Result,RefereceResult] = multiclass_metrics(confMatrix) + + % Size of confusion matrix + [row,col]=size(confMatrix); + if row~=col + error('Confusion matrix dimention is wrong') + end + + % Number of classes + n_class=row; + + % Find TP, FN, FP and TN + switch n_class + case 2 + TP=confMatrix(1,1); + FN=confMatrix(1,2); + FP=confMatrix(2,1); + TN=confMatrix(2,2); + + otherwise + TP=zeros(1,n_class); + FN=zeros(1,n_class); + FP=zeros(1,n_class); + TN=zeros(1,n_class); + for i=1:n_class + TP(i)=confMatrix(i,i); + FN(i)=sum(confMatrix(i,:))-confMatrix(i,i); + FP(i)=sum(confMatrix(:,i))-confMatrix(i,i); + TN(i)=sum(confMatrix(:))-TP(i)-FP(i)-FN(i); + end + + end + + %% Calulations + %1.P-Positive + %2.N-Negative + %3.acuuracy + %4.error + %5.Recall (Recall or True positive rate) + %6.Specificity + %7.Precision + %8.FPR-False positive rate + %9.F_score + %10.MCC-Matthews correlation coefficient + %11.kappa-Cohen's kappa + P=TP+FN; + N=FP+TN; + switch n_class + case 2 + accuracy=(TP+TN)/(P+N); + Error=1-accuracy; + Result.Accuracy=(accuracy); + Result.Error=(Error); + otherwise + accuracy=(TP)./(P+N); + Error=(FP)./(P+N); + Result.Accuracy=sum(accuracy); + Result.Error=sum(Error); + end + + ReferenceResult.AccuracyOfSingle=(TP ./ P)'; + ReferenceResult.ErrorOfSingle=1-ReferenceResult.AccuracyOfSingle; + Recall=TP./P; + Specificity=TN./N; + Precision=TP./(TP+FP); + FPR=1-Specificity; + beta=1; + F1_score=( (1+(beta^2))*(Recall.*Precision) ) ./ ( (beta^2)*(Precision+Recall) ); + MCC=[( TP.*TN - FP.*FN ) ./ ( ( (TP+FP).*P.*N.*(TN+FN) ).^(0.5) );... + ( FP.*FN - TP.*TN ) ./ ( ( (TP+FP).*P.*N.*(TN+FN) ).^(0.5) )] ; + MCC=max(MCC); + + %Kappa Calculation BY 2x2 Matrix Shape + pox=sum(accuracy); + Px=sum(P);TPx=sum(TP);FPx=sum(FP);TNx=sum(TN);FNx=sum(FN);Nx=sum(N); + pex=( (Px.*(TPx+FPx))+(Nx.*(FNx+TNx)) ) ./ ( (TPx+TNx+FPx+FNx).^2 ); + kappa_overall=([( pox-pex ) ./ ( 1-pex );( pex-pox ) ./ ( 1-pox )]); + kappa_overall=max(kappa_overall); + + %Kappa Calculation BY n_class x n_class Matrix Shape + po=accuracy; + pe=( (P.*(TP+FP))+(N.*(FN+TN)) ) ./ ( (TP+TN+FP+FN).^2 ); + kappa=([( po-pe ) ./ ( 1-pe );( pe-po ) ./ ( 1-po )]); + kappa=max(kappa); + + + %% + %Output Struct for individual Classes + % RefereceResult.Class=class_ref; + ReferenceResult.AccuracyInTotal=accuracy'; + ReferenceResult.ErrorInTotal=Error'; + ReferenceResult.Recall=Recall'; + ReferenceResult.Specificity=Specificity'; + ReferenceResult.Precision=Precision'; + ReferenceResult.FalsePositiveRate=FPR'; + ReferenceResult.F1_score=F1_score'; + ReferenceResult.MatthewsCorrelationCoefficient=MCC'; + ReferenceResult.Kappa=kappa'; + ReferenceResult.TruePositive=TP'; + ReferenceResult.FalsePositive=FP'; + ReferenceResult.FalseNegative=FN'; + ReferenceResult.TrueNegative=TN'; + + % Remove NANs and INFs + stats = [Precision', Recall', F1_score', MCC']; + stats(any(isinf(stats),2),:) = 0; + stats(any(isnan(stats),2),:) = 0; + + %Output Struct for over all class lists + Result.Recall=mean(stats(:,2)); + Result.Specificity=mean(Specificity); + Result.Precision=mean(stats(:,1)); + Result.FalsePositiveRate=mean(FPR); + Result.F1_score=mean(stats(:,3)); + Result.MatthewsCorrelationCoefficient=mean(stats(:,4)); + Result.Kappa=kappa_overall; + +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/ring_integral.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/ring_integral.m new file mode 100644 index 0000000..da57ab6 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/ring_integral.m @@ -0,0 +1,17 @@ +function [IM] =ring_integral(K,NB,M) +[Y,X]=meshgrid(1:K+1,1:K+1); +Rad = sqrt(X.^2+Y.^2); +LB=(max(Rad(:))-min(Rad(:)))/NB; +IM=zeros(1,NB); +M=M.*(Rad.^2); +for i=1:NB + minRad=(i-1)*LB; maxRad=(i)*LB; + PZ=(Rad>minRad)&(Rad<=maxRad); + temp=M(PZ); + IM(i)=sum(temp)/sum(PZ(:)); +% IM(i)=sum(temp); +end +% minRad=(60-1)*LB; maxRad=(80)*LB; +% PZ=(Rad>minRad)&(Rad<=maxRad); +% figure;imshow(PZ); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/tight_subplot.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/tight_subplot.m new file mode 100644 index 0000000..55f3a8d --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/function/tight_subplot.m @@ -0,0 +1,62 @@ +function ha = tight_subplot(Nh, Nw, gap, marg_h, marg_w) + +% tight_subplot creates "subplot" axes with adjustable gaps and margins +% +% ha = tight_subplot(Nh, Nw, gap, marg_h, marg_w) +% +% in: Nh number of axes in hight (vertical direction) +% Nw number of axes in width (horizontaldirection) +% gap gaps between the axes in normalized units (0...1) +% or [gap_h gap_w] for different gaps in height and width +% marg_h margins in height in normalized units (0...1) +% or [lower upper] for different lower and upper margins +% marg_w margins in width in normalized units (0...1) +% or [left right] for different left and right margins +% +% out: ha array of handles of the axes objects +% starting from upper left corner, going row-wise as in +% going row-wise as in +% +% Example: ha = tight_subplot(3,2,[.01 .03],[.1 .01],[.01 .01]) +% for ii = 1:6; axes(ha(ii)); plot(randn(10,ii)); end +% set(ha(1:4),'XTickLabel',''); set(ha,'YTickLabel','') + +% Pekka Kumpulainen 20.6.2010 @tut.fi +% Tampere University of Technology / Automation Science and Engineering + + +if nargin<3; gap = .02; end +if nargin<4 || isempty(marg_h); marg_h = .05; end +if nargin<5; marg_w = .05; end + +if numel(gap)==1; + gap = [gap gap]; +end +if numel(marg_w)==1; + marg_w = [marg_w marg_w]; +end +if numel(marg_h)==1; + marg_h = [marg_h marg_h]; +end + +axh = (1-sum(marg_h)-(Nh-1)*gap(1))/Nh; +axw = (1-sum(marg_w)-(Nw-1)*gap(2))/Nw; + +py = 1-marg_h(2)-axh; + +ha = zeros(Nh*Nw,1); +ii = 0; +for ih = 1:Nh + px = marg_w(1); + + for ix = 1:Nw + ii = ii+1; + ha(ii) = axes('Units','normalized', ... + 'Position',[px py axw axh], ... + 'XTickLabel','', ... + 'YTickLabel',''); + px = px+axw+gap(2); + end + py = py-axh-gap(1); +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/hierarchical_invariants.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/hierarchical_invariants.m new file mode 100644 index 0000000..7419c63 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/hierarchical_invariants.m @@ -0,0 +1,93 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% parameters +param = struct(); +param.type_feat = 10; % type of feature as following: +% '1.ZM';'2.PZM';'3.OFMM';'4.CHFM';'5.PJFM';'6.JFM'; % Classical Jacobi polynomial based moments +% '7.RHFM';'8.EFM';'9.PCET';'10.PCT';'11.PST'; % Classical Harmonic function based moments +% '12.BFM'; % Classical Eigenfunction based moments +% '13.FJFM'; % Fractional-order Jacobi polynomial based moments +% '14.GRHFM';'15.GPCET';'16.GPCT';'17.GPST' % Fractional-order Harmonic function based moments +param.XNM = [0,0;... + 0,1;1,0;... + 0,2;1,1;2,0;... + 3,0;2,1;1,2;0,3;... + 4,0;3,1;2,2;1,3;0,4;... + 5,0;4,1;3,2;2,3;1,4;0,5;... + 6,0;5,1;4,2;3,3;2,4;1,5;0,6]; % K = 6 all the n and m for the moments +param.alpha = 1; % parameter for fractional-order moments +param.p = 2; param.q = 2; % parameters for JFM and FJFM +param.scales = 10; % the scale +param.numofscale = size(param.scales,2); % number of scales +param.imgnorsize = 100; % image normaling size +param.imgpadsize = 12; % image pading size +%% Texture Images +location = fullfile(pwd,'KTH_TIPS'); +Imds = imageDatastore(location,'IncludeSubFolders',true,'FileExtensions','.png','LabelSource','foldernames'); +rng(100) +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.8); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Texture Featuring with Hierarchical Invariants +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_hi(x,param),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_hi(x,param),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Texture Classification with PCA Model +model = PCAModel(trainfeatures,30,trainImds.Labels); +predlabels = PCAClassifier(testfeatures,model); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Hierarchical Invariants, accuracy = ',num2str(Accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); +%% Texture Classification under Orientation and Flipping Changes +testImds.ReadFcn = @customreader_imgeo; +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +Ttest = tall(testImds); +testfeatures = cellfun(@(x)feature_extraction_hi(x,param),Ttest,'Uni',0); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +predlabels = PCAClassifier(testfeatures,model); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Hierarchical Invariants, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); diff --git a/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/scattering_network.m b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/scattering_network.m new file mode 100644 index 0000000..a410d77 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.1 Texture Classification/scattering_network.m @@ -0,0 +1,75 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +sf = waveletScattering2('ImageSize',[100 100],'InvarianceScale',80, ... + 'NumRotations',[8 8]); +%% Texture Images +location = fullfile(pwd,'KTH_TIPS'); +Imds = imageDatastore(location,'IncludeSubFolders',true,'FileExtensions','.png','LabelSource','foldernames'); +rng(100) +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.8); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Texture Featuring with Wavelet Scattering +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_scattering(sf,x),Ttrain,'UniformOutput',false); +testfeatures = cellfun(@(x)feature_extraction_scattering(sf,x),Ttest,'UniformOutput',false); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Texture Classification with PCA Model +model = PCAModel(trainfeatures,30,trainImds.Labels); +predlabels = PCAClassifier(testfeatures,model); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Wavelet Scattering, accuracy = ',num2str(Accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); +%% Texture Classification under Orientation and Flipping Changes +testImds.ReadFcn = @customreader_imgeo; +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +Ttest = tall(testImds); +testfeatures = cellfun(@(x)feature_extraction_scattering(sf,x),Ttest,'UniformOutput',false); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +predlabels = PCAClassifier(testfeatures,model); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Wavelet Scattering, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/Krawtchouk_moments.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/Krawtchouk_moments.m new file mode 100644 index 0000000..07044cb --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/Krawtchouk_moments.m @@ -0,0 +1,83 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +K = 80; +P = [0.5,0.5;0.42,0.58;0.58,0.42]; +NP = size(P,1); +NB = 75; +BF = cell(NP,2); +SZI = [100,100]; +for i=1:NP + [BF_x,BF_y]=KM_BF(SZI,K,P(i,1),P(i,2)); + BF{i,1}=BF_x; BF{i,2}=BF_y; +end +%% Digit Images +location = fullfile(pwd,'DigitDataset'); +Imds = imageDatastore(location,'IncludeSubfolders',true, 'LabelSource','foldernames'); +rng(10); +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.8); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Digit Featuring with KM +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_km(x,K,BF,NP,NB),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_km(x,K,BF,NP,NB),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Digit Classification with PCA Model +model = PCAModel(trainfeatures,30,trainImds.Labels); +predlabels = PCAClassifier(testfeatures,model); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['KM, accuracy = ',num2str(Accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); +%% Digit Classification under Arbitrary Rotation and Translation Changes +testImds.ReadFcn = @customreader_imgeo; +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +Ttest = tall(testImds); +testfeatures = cellfun(@(x)feature_extraction_km(x,K,BF,NP,NB),Ttest,'Uni',0); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +predlabels = PCAClassifier(testfeatures,model); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['KM, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/convolutional_neural_network.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/convolutional_neural_network.m new file mode 100644 index 0000000..28dd0fa --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/convolutional_neural_network.m @@ -0,0 +1,145 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Digit Images +location = fullfile(pwd,'DigitDataset'); +Imds = imageDatastore(location,'IncludeSubfolders',true, 'LabelSource','foldernames'); +rng(10); +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.8); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Digit Featuring with CNN +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +imgsize = 224; +trainImds.ReadFcn = @(x)repmat(imresize(imread(x),'OutputSize',[imgsize,imgsize]),[1,1,3]); +testImds.ReadFcn = @(x)repmat(imresize(imread(x),'OutputSize',[imgsize,imgsize]),[1,1,3]); +reset(trainImds); +reset(testImds); +%% --------simple CNN imgsize = 224 +layers = [ + imageInputLayer([imgsize,imgsize,3]) + convolution2dLayer(7,16) + batchNormalizationLayer + reluLayer + convolution2dLayer(3,20) + batchNormalizationLayer + reluLayer + maxPooling2dLayer(4) + fullyConnectedLayer(10) + softmaxLayer + classificationLayer]; +%% --------alexnet imgsize = 227 +% inputnet = alexnet; +% layersTransfer = inputnet.Layers(1:end-3); +% numClasses = numel(categories(trainImds.Labels)); +% layers = [ +% layersTransfer +% fullyConnectedLayer(numClasses) +% softmaxLayer +% classificationLayer]; +%% --------vgg16 imgsize = 224 +% inputnet = vgg16; +% layersTransfer = inputnet.Layers(1:end-3); +% numClasses = numel(categories(trainImds.Labels)); +% layers = [ +% layersTransfer +% fullyConnectedLayer(numClasses) +% softmaxLayer +% classificationLayer]; +%% -------- +analyzeNetwork(layers); +options = trainingOptions('sgdm',... + 'InitialLearnRate',0.0001, ... + 'MaxEpochs',20, ... + 'MiniBatchSize',100,... + 'Shuffle','every-epoch',... + 'Plots', 'training-progress',... + 'Verbose',false,... + 'ExecutionEnvironment','gpu'); +t = tic; +net = trainNetwork(trainImds,layers,options); +Time = toc(t); +%% Digit Classification with CNN Model +predlabels = classify(net,testImds,'ExecutionEnvironment','gpu'); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['CNN, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); +%% Digit Classification under Arbitrary Rotation and Translation Changes +testImds.ReadFcn = @(x)customreader_imgeo_cnn(x,imgsize); +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +predlabels = classify(net,testImds,'ExecutionEnvironment','gpu'); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['CNN, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); +%% Digit Re-Featuring and Re-Classification with CNN + Augmenter +augmenter = imageDataAugmenter('RandRotation',[-180 180],'RandXTranslation', [-2 2], ... + 'RandYTranslation',[-2 2]); +augimds = augmentedImageDatastore([imgsize,imgsize,3],trainImds,'DataAugmentation',augmenter); +t = tic; +net = trainNetwork(augimds,layers,options); +Time = toc(t); +predlabels = classify(net,testImds,'ExecutionEnvironment','gpu'); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['CNN, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); +%% Digit Classification under Arbitrary Rotation and Translation Changes +testImds.ReadFcn = @(x)customreader_imgeo_cnn(x,imgsize); +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +predlabels = classify(net,testImds,'ExecutionEnvironment','gpu'); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['CNN, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/discrete_cosine_transform.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/discrete_cosine_transform.m new file mode 100644 index 0000000..e2d0951 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/discrete_cosine_transform.m @@ -0,0 +1,74 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +NB = 90; +%% Digit Images +location = fullfile(pwd,'DigitDataset'); +Imds = imageDatastore(location,'IncludeSubfolders',true, 'LabelSource','foldernames'); +rng(10); +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.8); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Digit Featuring with DCT +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_dct(x,NB),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_dct(x,NB),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Digit Classification with PCA Model +model = PCAModel(trainfeatures,30,trainImds.Labels); +predlabels = PCAClassifier(testfeatures,model); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DCT, accuracy = ',num2str(Accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); +%% Digit Classification under Arbitrary Rotation and Translation Changes +testImds.ReadFcn = @customreader_imgeo; +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +Ttest = tall(testImds); +testfeatures = cellfun(@(x)feature_extraction_dct(x,NB),Ttest,'Uni',0); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +predlabels = PCAClassifier(testfeatures,model); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DCT, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/discrete_wavelet_transform.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/discrete_wavelet_transform.m new file mode 100644 index 0000000..0447bed --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/discrete_wavelet_transform.m @@ -0,0 +1,75 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +NB = 45; +NF = 4*NB; +%% Digit Images +location = fullfile(pwd,'DigitDataset'); +Imds = imageDatastore(location,'IncludeSubfolders',true, 'LabelSource','foldernames'); +rng(10); +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.8); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Digit Featuring with DWT +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_dwt(x,NB,NF),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_dwt(x,NB,NF),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Digit Classification with PCA Model +model = PCAModel(trainfeatures,30,trainImds.Labels); +predlabels = PCAClassifier(testfeatures,model); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DWT, accuracy = ',num2str(Accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); +%% Digit Classification under Arbitrary Rotation and Translation Changes +testImds.ReadFcn = @customreader_imgeo; +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +Ttest = tall(testImds); +testfeatures = cellfun(@(x)feature_extraction_dwt(x,NB,NF),Ttest,'Uni',0); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +predlabels = PCAClassifier(testfeatures,model); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DWT, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/DIR.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/DIR.m new file mode 100644 index 0000000..9a59f4c --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/DIR.m @@ -0,0 +1,49 @@ +function [featcell,time] = DIR(img,param) +%% input +if size(img,3) ~= 1 + img = rgb2gray(img); +end +img = double(img); +timestamp = tic; +%% get basis function data +bfdatacell = cell(1,param.numofscale); +for ns = 1:1:param.numofscale + sizeofbf = param.scales(ns); + if mod(sizeofbf,2) == 1 + sizeofbf = sizeofbf - 1; + end + if param.type_feat == 1 || param.type_feat == 2 + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.ZNM,param.alpha, param.p, param.q); + elseif param.type_feat == 11 || param.type_feat == 17 + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.SNM,param.alpha, param.p, param.q); + else + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.NM,param.alpha, param.p, param.q); + end +end +%% naive feature generation +% raggioU = ceil((sizeofbf-1)/2); +% raggioL = floor((sizeofbf-1)/2); +% featcell = cell(1,param.numofscale); +% for ns = 1:1:param.numofscale +% featcell{ns} = abs(bf_filter(img, bfdatacell{ns})); +% featcell{ns} = featcell{ns}((1+raggioU):(end-raggioL),(1+raggioU):(end-raggioL),:); +% end +%% fast feature generation by FFT (Convolution Theorem) +featcell = cell(1,param.numofscale); +fft_img = fft2(img); +nof = size(bfdatacell{1},3); +fft_img_cell = single(zeros([size(img), nof])); +for i = 1:1:nof + fft_img_cell(:,:,i) = fft_img; +end +featcell{param.numofscale} = abs(bf_filter_fft(img, fft_img_cell, bfdatacell{param.numofscale})); +unisize = size (featcell{param.numofscale}); +for ns = 1:1:param.numofscale-1 + temp = abs(bf_filter_fft(img, fft_img_cell, bfdatacell{ns})); + rr = (size(temp)-unisize)/2; + featcell{ns} = temp ((1+rr(1)):(end-rr(1)),(1+rr(2)):(end-rr(2)),:); +end +%% output +clc; +time = toc(timestamp); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/HI.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/HI.m new file mode 100644 index 0000000..dbcb699 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/HI.m @@ -0,0 +1,32 @@ +function [ord,featcell] = HI(img,param) +K = max(max(param.XNM)); +idx = 1; +featcell = cell(1,1); +ord = zeros(1,1); +for x = 0:K + if x == 0 + param.NM = param.XNM(1,:); + [feat,~] = DIR(img,param); + featcell(1)=feat; + ord(1)=x; + else + param.NM = param.XNM(idx:idx+x,:); + inputfeat=img; + [feat,~] = DIR(inputfeat,param); + for z=1:size(feat{1},3) + featcell = [featcell, {feat{1}(:,:,z)}]; + ord =[ord, x]; + end + for y = idx-x:idx-1 + param.NM = param.XNM(idx:idx+x,:); + inputfeat=featcell{y}; + [feat,~] = DIR(inputfeat,param); + for z=1:size(feat{1},3) + featcell = [featcell, {feat{1}(:,:,z)}]; + ord =[ord, x]; + end + end + end + idx=idx+x+1; +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/KM_BF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/KM_BF.m new file mode 100644 index 0000000..cb61b3c --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/KM_BF.m @@ -0,0 +1,52 @@ +function [BF_x,BF_y] = KM_BF(SZI,K,P_x,P_y) +N = SZI(1); +x = 0:1:N-1; +BF_x=zeros(K+1,N); +W=zeros(1,N); +W(1,1)=(1-P_x)^N; %xy=0 +for i=1:N-1 %xy=0:1:N-2 + xy=i-1; + W(i+1)=((N-xy)/(xy+1))*(P_x/(1-P_x))*W(i); +end +if K>=2 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); + for n=3:1:K+1 + order=n-1; + A = (N*P_x+(order-1)*(1-2*P_x)-x)/sqrt(P_x*(1-P_x)*order*(N-n+2)); + B = sqrt((order-1)*(N-order+2)/(order*(N-order+1))); + BF_x(n,:)=A.*BF_x(n-1,:)-B.*BF_x(n-2,:); + end +elseif K==1 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); +elseif K==0 + BF_x(1,:)=sqrt(W); +end + +M = SZI(2); +y = 0:1:M-1; +BF_y=zeros(K+1,M); +W=zeros(1,M); +W(1,1)=(1-P_y)^M; %xy=0 +for i=1:M-1 %xy=0:1:M-2 + xy=i-1; + W(i+1)=((M-xy)/(xy+1))*(P_y/(1-P_y))*W(i); +end +if K>=2 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); + for n=3:1:K+1 + order=n-1; + A = (M*P_y+(order-1)*(1-2*P_y)-y)/sqrt(P_y*(1-P_y)*order*(M-n+2)); + B = sqrt((order-1)*(M-order+2)/(order*(M-order+1))); + BF_y(n,:)=A.*BF_y(n-1,:)-B.*BF_y(n-2,:); + end +elseif K==1 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); +elseif K==0 + BF_y(1,:)=sqrt(W); +end +% X=BF_y*double(img)*BF_x'; +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/KM_D.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/KM_D.m new file mode 100644 index 0000000..c0f7b03 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/KM_D.m @@ -0,0 +1,52 @@ +function [X] = KM_D(I,K,P_x,P_y) +N = size(I,1); +x = 0:1:N-1; +BF_x=zeros(K+1,N); +W=zeros(1,N); +W(1,1)=(1-P_x)^N; %xy=0 +for i=1:N-1 %xy=0:1:N-2 + xy=i-1; + W(i+1)=((N-xy)/(xy+1))*(P_x/(1-P_x))*W(i); +end +if K>=2 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); + for n=3:1:K+1 + order=n-1; + A = (N*P_x+(order-1)*(1-2*P_x)-x)/sqrt(P_x*(1-P_x)*order*(N-n+2)); + B = sqrt((order-1)*(N-order+2)/(order*(N-order+1))); + BF_x(n,:)=A.*BF_x(n-1,:)-B.*BF_x(n-2,:); + end +elseif K==1 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); +elseif K==0 + BF_x(1,:)=sqrt(W); +end + +M = size(I,2); +y = 0:1:M-1; +BF_y=zeros(K+1,M); +W=zeros(1,M); +W(1,1)=(1-P_y)^M; %xy=0 +for i=1:M-1 %xy=0:1:M-2 + xy=i-1; + W(i+1)=((M-xy)/(xy+1))*(P_y/(1-P_y))*W(i); +end +if K>=2 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); + for n=3:1:K+1 + order=n-1; + A = (M*P_y+(order-1)*(1-2*P_y)-y)/sqrt(P_y*(1-P_y)*order*(M-n+2)); + B = sqrt((order-1)*(M-order+2)/(order*(M-order+1))); + BF_y(n,:)=A.*BF_y(n-1,:)-B.*BF_y(n-2,:); + end +elseif K==1 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); +elseif K==0 + BF_y(1,:)=sqrt(W); +end +X=BF_y*double(I)*BF_x'; +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getBF.m new file mode 100644 index 0000000..e8c5291 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getBF.m @@ -0,0 +1,161 @@ +function [BF]=getBF(MODE,SZ,NM,alpha,p,q) +[rho,theta]=ro(SZ,SZ); +pz=rho>1; cnt=sum(pz(:));rho(pz)= 0.5; +L=size(NM,1); +BF=zeros(SZ,SZ,L); +%% ZM +if MODE==1 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getZM_RBF(order,repetition,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PZM +elseif MODE==2 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPZM_RBF(order,repetition,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% OFMM +elseif MODE==3 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getOFMM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% CHFM +elseif MODE==4 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getCHFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PJFM +elseif MODE==5 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPJFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% JFM +elseif MODE==6 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getJFM_RBF(order,rho,p,q); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% RHFM +elseif MODE==7 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getRHFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% EFM +elseif MODE==8 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getEFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PCET +elseif MODE==9 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPCET_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PCT +elseif MODE==10 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPCT_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PST +elseif MODE==11 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPST_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% BFM +elseif MODE==12 + v=1; + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getBFM_RBF(order,rho,v); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% FJFM +elseif MODE==13 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getFJFM_RBF(order,rho,p,q,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GRHFM +elseif MODE==14 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGRHFM_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPCET +elseif MODE==15 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPCET_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPCT +elseif MODE==16 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPCT_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPST +elseif MODE==17 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPST_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +end + diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getBFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getBFM_RBF.m new file mode 100644 index 0000000..7e78f83 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getBFM_RBF.m @@ -0,0 +1,17 @@ +%% REF +% Xiao B, Ma J, Wang X. Image analysis by Bessel¨CFourier moments. Pattern Recognition, 2010, 43(8): 2620-2629. +function [output] = getBFM_RBF(order,rho,v) +Roots=zeros(1,max(order)+2); +syms x; +Roots(1,1)=vpasolve(besselj(v, x) == 0, x); +for i=2:1:max(order)+2 + ST=Roots(1,i-1)+3; + Roots(1,i)=vpasolve(besselj(v, x) == 0, ST); +end +% obtain the order and repetition +n = order; +% compute the radial polynomial +rho=rho*Roots(n+2); +output=besselj(v,rho); +output=output*sqrt((1/(pi*(besselj(v+1,Roots(order+2)))^2))); +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getCHFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getCHFM_RBF.m new file mode 100644 index 0000000..cf6a8bc --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getCHFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +%¡¡Ping Z, Wu R, Sheng Y. Image description with Chebyshev¨CFourier moments. Journal of the Optical Society of America A, 2002, 19(9): 1748-1754. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getCHFM_RBF(order,rho) +% obtain the order +n = order; +p = 2; q = 1.5; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getEFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getEFM_RBF.m new file mode 100644 index 0000000..e60c98f --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getEFM_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hu H, Zhang Y, Shao C, et al. Orthogonal moments based on exponent functions: Exponent-Fourier moments. Pattern Recognition, 2014, 47(8): 2596-2606. +function [output] = getEFM_RBF(order,rho) +% compute the radial polynomial +output=sqrt(rho.^(-1)).*exp(1j*2*pi*order.*rho); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getFJFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getFJFM_RBF.m new file mode 100644 index 0000000..a9d3022 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getFJFM_RBF.m @@ -0,0 +1,38 @@ +%% REF +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getFJFM_RBF(order,rho,p,q,alpha) +% obtain the order +n = order; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getGPCET_RBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getGPCET_RBF.m new file mode 100644 index 0000000..b2dd435 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getGPCET_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPCET_RBF(order,rho,alpha) +% compute the radial polynomial +output=sqrt(alpha*rho.^(alpha-2)).*exp(1j*2*pi*order.*(rho.^alpha)); +end % end getRadialPoly method diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getGPCT_RBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getGPCT_RBF.m new file mode 100644 index 0000000..27b2420 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getGPCT_RBF.m @@ -0,0 +1,10 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPCT_RBF(order,rho,alpha) +% compute the radial polynomial +if order==0 + output=sqrt(alpha*rho.^(alpha-2)); +else + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*cos(pi*order.*rho.^alpha); +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getGPST_RBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getGPST_RBF.m new file mode 100644 index 0000000..ef8c6d0 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getGPST_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPST_RBF(order,rho,alpha) +% compute the radial polynomial +output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*sin(pi*order.*rho.^alpha); +end % end getRadialPoly method diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getGRHFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getGRHFM_RBF.m new file mode 100644 index 0000000..f40ccf5 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getGRHFM_RBF.m @@ -0,0 +1,12 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGRHFM_RBF(order,rho,alpha) +% compute the radial polynomial +if order==0 + output=sqrt(alpha*rho.^(alpha-2)); +elseif mod(order,2)==1 + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*sin(pi*(order+1).*rho.^alpha); +else + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*cos(pi*order.*rho.^alpha); +end +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getJFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getJFM_RBF.m new file mode 100644 index 0000000..b7103d3 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getJFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +% Ping Z, Ren H, Zou J, et al. Generic orthogonal moments: Jacobi¨CFourier moments for invariant image description. Pattern Recognition, 2007, 40(4): 1245-1254. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getJFM_RBF(order,rho,p,q) +% obtain the order +n = order; +alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getOFMM_RBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getOFMM_RBF.m new file mode 100644 index 0000000..4c2fe59 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getOFMM_RBF.m @@ -0,0 +1,41 @@ +%% REF +% Sheng Y, Shen L. Orthogonal Fourier-Mellin moments for invariant pattern recognition. Journal of the Optical Society of America A, 1994, 11(6): 1748-1757. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getOFMM_RBF(order,rho) +% obtain the order +n = order; +p = 2; q = 2; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; + +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPCET_RBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPCET_RBF.m new file mode 100644 index 0000000..7700dd6 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPCET_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPCET_RBF(order,rho) +% compute the radial polynomial +output=exp(1j*2*pi*order.*rho.^2); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPCT_RBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPCT_RBF.m new file mode 100644 index 0000000..b67c9c3 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPCT_RBF.m @@ -0,0 +1,10 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPCT_RBF(order,rho) +% compute the radial polynomial +if order==0 + output=rho.^0; +else + output=sqrt(2).*cos(pi*order.*rho.^2); +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPJFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPJFM_RBF.m new file mode 100644 index 0000000..4b87097 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPJFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +%¡¡Amu G, Hasi S, Yang X, et al. Image analysis by pseudo-Jacobi (p=4, q=3)¨CFourier moments. Applied Optics, 2004, 43(10): 2093-2101. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getPJFM_RBF(order,rho) +% obtain the order +n = order; +p = 4; q = 3; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPST_RBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPST_RBF.m new file mode 100644 index 0000000..e71350c --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPST_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPST_RBF(order,rho) +% compute the radial polynomial +output=sqrt(2).*sin(pi*order.*rho.^2); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPZM_RBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPZM_RBF.m new file mode 100644 index 0000000..68e7305 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getPZM_RBF.m @@ -0,0 +1,44 @@ +%% REF +% Teh C H, Chin R T. On image analysis by the methods of moments. IEEE Transactions on Pattern Analysis and Machine Intelligence, 1988, 10(4): 496-513. +% Al-Rawi M S. Fast computation of pseudo Zernike moments. Journal of Real-Time Image Processing, 2010, 5(1): 3-10. +function [output] = getPZM_RBF(order,repetition,rho) +N=size(rho,1); M=size(rho,2); +repetition=abs(repetition); +rho=rho(:); +output = zeros(order+1, length(rho) ); +if rho==0 + if repetition==0 + output( (0:order)+1,:)= 1; + else + output( (0:order)+1,:) = 0; + end + output=reshape(output,N,M); + return; +end +q=repetition; p = order; +output(q +1,:) = rho.^q; +if q==p + output=output(end,:); + output=reshape(output,N,M); + return; +end +if q == p-1 + Rpp=rho.^p; + output(p +1,:)=(2*p+1)*Rpp - 2*p*rho.^q; + output=output(end,:); + output=reshape(output,N,M); + return; +end +p=q+1; +Rpp=rho.^p; +output(p +1,:)=(2*p+1)*Rpp - 2*p*rho.^q; +q2=q+2; +for p = q2:order + L1 = ((2*p+1)*2*p)/((p+q +1.0)*(p-q)); + L2 = -2*p + L1*((p+q)*(p-q-1))/(2.0*p-1); + L3 = (2*p-1)*(p-1)- L1*(p+q-1)*(p-q-2)/2.0 + 2*(p-1)*L2; + output(p +1,:) = (L1*rho+L2)'.*output(p-1 +1,:) + L3*output(p-2 +1,:); +end +output=output(end,:); +output=reshape(output,N,M); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getRHFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getRHFM_RBF.m new file mode 100644 index 0000000..2a59186 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getRHFM_RBF.m @@ -0,0 +1,12 @@ +%% REF +% Ren H, Ping Z, Bo W, et al. Multidistortion-invariant image recognition with radial harmonic Fourier moments. Journal of the Optical Society of America A, 2003, 20(4): 631-637. +function [output] = getRHFM_RBF(order,rho) +% compute the radial polynomial +if order==0 + output=sqrt(rho.^(-1)); +elseif mod(order,2)==1 + output=sqrt(rho.^(-1)).*sqrt(2).*sin(pi*(order+1).*rho); +else + output=sqrt(rho.^(-1)).*sqrt(2).*cos(pi*order.*rho); +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getZM_RBF.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getZM_RBF.m new file mode 100644 index 0000000..e9e5f7f --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/getZM_RBF.m @@ -0,0 +1,48 @@ +%% REF +% Teague M R. Image analysis via the general theory of moments. Journal of the Optical Society of America, 1980, 70(8): 920-930. +% Chong C W, Raveendran P, Mukundan R. A comparative analysis of algorithms for fast computation of Zernike moments. Pattern Recognition, 2003, 36(3): 731-742. +function [output] = getZM_RBF(order,repetition,rho) +rr = rho.^2; +for p=0:1:order+1 + q = p-4; + while q>= 0 + H3mn(p+1,q+1) = -(4*(q + 2)*(q + 1))/((p+q+2)*(p-q)); + H2mn(p+1,q+1) = H3mn(p+1,q+1)*(p+q+4)*(p-q-2)/(4*(q+3))+(q+2); + H1mn(p+1,q+1) = (q+4)*(q+3)/2-H2mn(p+1,q+1)*(q+4)+H3mn(p+1,q+1)*(p+q+6)*(p-q-4)/8; + q = q-2; + end +end + +for p=0:1:order+1 + q = p; + Rn = rho.^p; + if p>1 + Rnm2 = rho.^(p-2); + end + while q>= 0 + if q == p + Rnm = Rn; + Rnmp4 = Rn; + elseif q == p-2 + Rnnm2 = p.*Rn-(p-1).*Rnm2; + Rnm = Rnnm2; + Rnmp2 = Rnnm2; + else + H3 = H3mn(p+1,q+1); + H2 = H2mn(p+1,q+1); + H1 = H1mn(p+1,q+1); + Rnm = H1.*Rnmp4+(H2+H3./rr).*Rnmp2; + Rnmp4 = Rnmp2; + Rnmp2 = Rnm; + end + if p == order && q == abs(repetition) + output = Rnm; + break; + end + q = q-2; + end + if p == order && q == abs(repetition) + break; + end +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/ro.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/ro.m new file mode 100644 index 0000000..17021fc --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/MOMENT/ro.m @@ -0,0 +1,36 @@ +function [r,o] = ro(n,m) +r = zeros(n,m); +o = zeros(n,m); +R = max((n-1)/2,(m-1)/2); +for x = 1:n + for y = 1:m + xx = x-1; + yy = y-1; + if (xx<=(n-1)/2) && (yy>=(m-1)/2) + p = yy-(m-1)/2; + q = (n-1)/2-xx; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = asin(q/sqrt(p^2+q^2)); + elseif (xx<=(n-1)/2) && (yy<(m-1)/2) + p = (m-1)/2-yy; + q = (n-1)/2-xx; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = pi-asin(q/sqrt(p^2+q^2)); + elseif (xx>(n-1)/2) && (yy<=(m-1)/2) + p = (m-1)/2-yy; + q = xx-(n-1)/2; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = pi+asin(q/sqrt(p^2+q^2)); + elseif (xx>(n-1)/2) && (yy>(m-1)/2) + p = yy-(m-1)/2; + q = xx-(n-1)/2; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = 2*pi-asin(q/sqrt(p^2+q^2)); + end + if r(x,y)==0 + o(x,y) = 0; + elseif r(x,y)>1 + r(x,y) = 10000; + end + end +end diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/PCAClassifier.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/PCAClassifier.m new file mode 100644 index 0000000..0450061 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/PCAClassifier.m @@ -0,0 +1,50 @@ +function labels =PCAClassifier(features,model) +% This function is only to support wavelet image scattering examples in +% Wavelet Toolbox. It may change or be removed in a future release. +% model is a structure array with fields, M, mu, v, and Labels +% features is the matrix of test data which is Ns-by-L, Ns is the number of +% scattering paths and L is the number of test examples. Each column of +% features is a test example. + +% Copyright 2018 MathWorks + +labelIdx = determineClass(features,model); +labels = model.Labels(labelIdx); +% Returns as column vector to agree with imageDatastore Labels +labels = labels(:); + + +%-------------------------------------------------------------------------- +function labelIdx = determineClass(features,model) +% Determine number of classes +Nclasses = numel(model.Labels); +% Initialize error matrix +errMatrix = Inf(Nclasses,size(features,2)); +for nc = 1:Nclasses + % class centroid + mu = model.mu{nc}; + u = model.U{nc}; + % 1-by-L + errMatrix(nc,:) = projectionError(features,mu,u); +end +% Determine minimum along class dimension +[~,labelIdx] = min(errMatrix,[],1); + + +%-------------------------------------------------------------------------- +function totalerr = projectionError(features,mu,u) + % + Npc = size(u,2); + L = size(features,2); + % Subtract class mean: Ns-by-L minus Ns-by-1 + s = features-mu; + % 1-by-L + normSqX = sum(abs(s).^2,1)'; + err = Inf(Npc+1,L); + err(1,:) = normSqX; + err(2:end,:) = -abs(u'*s).^2; + % 1-by-L + totalerr = sqrt(sum(err,1)); +end +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/PCAModel.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/PCAModel.m new file mode 100644 index 0000000..e62c4dd --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/PCAModel.m @@ -0,0 +1,47 @@ +function model = PCAModel(features,M,Labels) +% This function is only to support wavelet image scattering examples in +% Wavelet Toolbox. It may change or be removed in a future release. +% model = helperPCAModel(features,M,Labels) + +% Copyright 2018 MathWorks + +% Initialize structure array to hold the affine model +model = struct('Dim',[],'mu',[],'U',[],'Labels',categorical([]),'s',[]); +model.Dim = M; +% Obtain the number of classes +LabelCategories = categories(Labels); +Nclasses = numel(categories(Labels)); +for kk = 1:Nclasses + Class = LabelCategories{kk}; + % Find indices corresponding to each class + idxClass = Labels == Class; + % Extract feature vectors for each class + tmpFeatures = features(:,idxClass); + % Determine the mean for each class + model.mu{kk} = mean(tmpFeatures,2); + [model.U{kk},model.S{kk}] = scatPCA(tmpFeatures); + if size(model.U{kk},2) > M + model.U{kk} = model.U{kk}(:,1:M); + model.S{kk} = model.S{kk}(1:M); + + end + model.Labels(kk) = Class; +end + +function [u,s,v] = scatPCA(x,M) + % Calculate the principal components of x along the second dimension. + + if nargin > 1 && M > 0 + % If M is non-zero, calculate the first M principal components. + [u,s,v] = svds(x-sig_mean(x),M); + s = abs(diag(s)/sqrt(size(x,2)-1)).^2; + else + % Otherwise, calculate all the principal components. + % Each row is an observation, i.e. the number of scattering paths + % Each column is a class observation + [u,d] = eig(cov(x')); + [s,ind] = sort(diag(d),'descend'); + u = u(:,ind); + end +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/bf_filter.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/bf_filter.m new file mode 100644 index 0000000..4567b20 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/bf_filter.m @@ -0,0 +1,17 @@ +function y = bf_filter(x,bfdata) +% filtering bank +% y = bf_filter(x,bfdata) +% +% x is a 2d matrix +% bfdata is the filter bank, it is a structure with the following elements: +% .number number of filters, +% .bf a 3d matrix with the filters, +% .factor factor of the filters. +% + + len = size(bfdata,3); + y = zeros(cat(2,size(x),len)); + for index = 1:len, + y(:,:,index) = imfilter(x, conj(bfdata(:,:,index))); + end +end diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/bf_filter_fft.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/bf_filter_fft.m new file mode 100644 index 0000000..67dc4a3 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/bf_filter_fft.m @@ -0,0 +1,13 @@ +function y = bf_filter_fft(x,fft_x,bfdata) + + len = size(bfdata,3); + bf = flip(flip(conj(bfdata),1),2); + pbf = single(zeros([size(x),len])); + pbf(1:size(bf,1),1:size(bf,2),:) = bf; + y = ifft2(fft2(pbf).*fft_x); + y = y(size(bf,1):end,size(bf,2):end,:); + +end + + + diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/bf_filter_fft_scale.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/bf_filter_fft_scale.m new file mode 100644 index 0000000..c0a662b --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/bf_filter_fft_scale.m @@ -0,0 +1,6 @@ +function y = bf_filter_fft_scale(fft_x,fft_pbf_cell,bfdata) + + y = ifft2(single(fft_pbf_cell).*single(fft_x)); + y = y(size(bfdata,1):end,size(bfdata,2):end,:); + +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/customreader_imgeo.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/customreader_imgeo.m new file mode 100644 index 0000000..f7b6a96 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/customreader_imgeo.m @@ -0,0 +1,9 @@ +function data = customreader_imgeo(filename) +onState = warning('off', 'backtrace'); +c = onCleanup(@() warning(onState)); +data = imread(filename); +ra = randi([-180,180],1,1); +data = imrotate(data,ra,'bicubic','crop'); +txy = randi([-2,2],1,2); +data = imtranslate(data,txy,'bicubic'); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/customreader_imgeo_cnn.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/customreader_imgeo_cnn.m new file mode 100644 index 0000000..9a598a9 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/customreader_imgeo_cnn.m @@ -0,0 +1,10 @@ +function data = customreader_imgeo_cnn(filename,imgsize) +onState = warning('off', 'backtrace'); +c = onCleanup(@() warning(onState)); +data = imread(filename); +ra = randi([-180,180],1,1); +data = imrotate(data,ra,'bicubic','crop'); +txy = randi([-2,2],1,2); +data = imtranslate(data,txy,'bicubic'); +data = repmat(imresize(data,[imgsize,imgsize]),[1,1,3]); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_dct.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_dct.m new file mode 100644 index 0000000..8e76827 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_dct.m @@ -0,0 +1,9 @@ +function [F] =feature_extraction_dct(I,NB) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[100,100]); +X = dct2(I); +F = ring_integral(size(X,1)-1,NB,abs(X)); +F = F'; +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_dwt.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_dwt.m new file mode 100644 index 0000000..8af02c3 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_dwt.m @@ -0,0 +1,28 @@ +function [F] =feature_extraction_dwt(I,NB,NF) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[100,100]); + +F = zeros(1,NF); +[LoD,HiD] = wfilters('haar','d'); +[cA,cH,cV,cD] = dwt2(I,LoD,HiD,'mode','symh'); + +X = dct2(cA); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(1:NB) = Y; + +X = dct2(cH); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(NB+1:2*NB) = Y; + +X = dct2(cV); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(2*NB+1:3*NB) = Y; + +X = dct2(cD); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(3*NB+1:4*NB) = Y; + +F = F'; +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_hi.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_hi.m new file mode 100644 index 0000000..218d313 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_hi.m @@ -0,0 +1,15 @@ +function [F] =feature_extraction_hi(I,param) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[param.imgnorsize,param.imgnorsize]); +I = imgaussfilt(I); +I = padarray(I,[param.imgpadsize,param.imgpadsize],0,'both'); +[ord,featcell] = HI(I,param); +F=zeros(size(ord,2),1); +for i = 1:size(ord,2) + X = featcell{i}; + Y = mean(mean(X)); + F(i,1) = Y; +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_km.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_km.m new file mode 100644 index 0000000..78a2486 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_km.m @@ -0,0 +1,16 @@ +function [F] =feature_extraction_km(I,K,BF,NP,NB) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[100,100]); +F = zeros(NP,NB); +for i=1:NP + %% Moments + M = BF{i,2}*double(I)*BF{i,1}'; + %% Ring Integral + [IM] = ring_integral(K,NB,abs(M)); + F(i,:) = IM; +end +F = reshape(F',1,[]); +F = F'; +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_scattering.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_scattering.m new file mode 100644 index 0000000..c8ea725 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/feature_extraction_scattering.m @@ -0,0 +1,12 @@ +function features = feature_extraction_scattering(sf,x) +% This function is only to support examples in the Wavelet Toolbox. +% It may change or be removed in a future release. + +% Copyright 2018 MathWorks +if size(x,3) > 1 + x = rgb2gray(x); +end +x = imresize(x,[28 28]); +smat = featureMatrix(sf,x); +features = mean(mean(smat,2),3); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/multiclass_metrics_common.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/multiclass_metrics_common.m new file mode 100644 index 0000000..179c58a --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/multiclass_metrics_common.m @@ -0,0 +1,93 @@ +function metrics = multiclass_metrics_common(confmat) + +%%***********************************************************************% +%* Multiclass metrics *% +%* Finds the multiclss metrics provided a confusion matrix. *% +%* *% +%* Code author: Preetham Manjunatha *% +%* Github link: https://github.com/preethamam %* +%* Date: 11/24/2021 *% +%************************************************************************% +% +%************************************************************************% +% +% Usage: metrics = multiclass_metrics_common(confmat) +% Inputs: confmat - confusion matrix -- N x N matrix +% +% Outputs: metrics - metrics.Precision = Precision; +% metrics.Recall = Recall; +% metrics.Accuracy = Accuracy; +% metrics.Specificity = Specificity; +% metrics.F1score = F1score; + +% Array initialization +N = size(confmat,1); + +Precision = zeros(1,N); +Recall = zeros(1,N); +Specificity = zeros(1,N); +Accuracy = zeros(1,N); +F1score = zeros(1,N); + + +if size(confmat,1) > 2 + + for i = 1:size(confmat,1) + + TP = confmat(i,i); + FN = sum(confmat(i,:))-confmat(i,i); + FP = sum(confmat(:,i))-confmat(i,i); + TN = sum(confmat(:))-TP -FP-FN; + + Precision(:,i) = TP / (TP+FP); % positive predictive value (PPV) + Recall(:,i) = TP / (TP+FN); % true positive rate (TPR), sensitivity + if ((TN / (TN+FP)) > 1) + Specificity(:,i) = 1; + elseif ((TN / (TN+FP)) < 0) + Specificity(:,i) = 0; + else + Specificity(:,i) = TN / (TN+FP); % (SPC) or true negative rate + end + Accuracy(:,i) = (TP)/(TP+TN+FP+FN); % Accuracy + F1score(:,i) = (2*TP) /(2*TP + FP + FN); + end + + % Remove junks + stats = [Precision', Recall', F1score', Accuracy', Specificity']; + stats(any(isinf(stats),2),:) = 0; + stats(any(isnan(stats),2),:) = 0; + + % Compute averages + Accuracy = sum(stats(:,4)); + Precision = mean(stats(:,1)); + Recall = mean(stats(:,2)); + Specificity = mean(Specificity); + F1score = mean(stats(:,3)); +else + TP = confmat(1, 1); + FP = confmat(2, 1); + FN = confmat(1, 2); + TN = confmat(2,2); + + Precision = TP / (TP+FP); % positive predictive value (PPV) + Recall = TP / (TP+FN); % true positive rate (TPR), sensitivity + if ((TN / (TN+FP)) > 1) + Specificity = 1; + elseif ((TN / (TN+FP)) < 0) + Specificity = 0; + else + Specificity = TN / (TN+FP); % (SPC) or true negative rate + end + Accuracy = (TP+TN)/(TP+TN+FP+FN); % Accuracy + F1score = 2*TP /(2*TP + FP + FN); + +end + +% Output +metrics.Precision = Precision; +metrics.Recall = Recall; +metrics.Accuracy = Accuracy; +metrics.Specificity = Specificity; +metrics.F1score = F1score; + + diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/multiclass_metrics_special.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/multiclass_metrics_special.m new file mode 100644 index 0000000..2a92807 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/multiclass_metrics_special.m @@ -0,0 +1,161 @@ +function [Result,ReferenceResult] = multiclass_metrics_special(confMatrix) + +%%***********************************************************************% +%* Multiclass metrics *% +%* Finds the multiclss metrics provided a confusion matrix. *% +%* *% +%* Code author: Preetham Manjunatha *% +%* Github link: https://github.com/preethamam %* +%* Date: 11/24/2021 *% +%************************************************************************% +% +%************************************************************************% +% %confusion matrix for multiple class start +% %Inputs-1.Actual Class Labels,2.Predict Class Labels and 3.Display if need +% %Outputs +% +% %1.Result-Struct Over all output Which has follwing +% %2.RefereceResult indidual output Which has follwing +% %%%%%%%%1.acuuracy +% %%%%%%%%2.error +% %%%%%%%%3.Recall (Recall or True positive rate) +% %%%%%%%%4.Specificity +% %%%%%%%%5.Precision +% %%%%%%%%6.FPR-False positive rate +% %%%%%%%%7.F_score +% %%%%%%%%8.MCC-Matthews correlation coefficient +% %%%%%%%%9.kappa-Cohen's kappa +% +% %%Original Developer Mr.Abbas Manthiri S +% %%Date 25-12-2016 +% %%Mail Id: abbasmanthiribe@gmail.com +% %%http://www.dataschool.io/simple-guide-to-confusion-matrix-terminology/ +% %%https://en.wikipedia.org/wiki/Confusion_matrix +% +% %%Modified by Preetham Manjunatha +% %%Date 02-03-2020 +% %%Note: Fixed Abbas written code where the NaN and Inf values were +% not considered while performaing the class average. +% +% % clc +% % clear all +% % close all +% % %%Multiclass or two class +% % [Result,RefereceResult] = multiclass_metrics(confMatrix) + + % Size of confusion matrix + [row,col]=size(confMatrix); + if row~=col + error('Confusion matrix dimention is wrong') + end + + % Number of classes + n_class=row; + + % Find TP, FN, FP and TN + switch n_class + case 2 + TP=confMatrix(1,1); + FN=confMatrix(1,2); + FP=confMatrix(2,1); + TN=confMatrix(2,2); + + otherwise + TP=zeros(1,n_class); + FN=zeros(1,n_class); + FP=zeros(1,n_class); + TN=zeros(1,n_class); + for i=1:n_class + TP(i)=confMatrix(i,i); + FN(i)=sum(confMatrix(i,:))-confMatrix(i,i); + FP(i)=sum(confMatrix(:,i))-confMatrix(i,i); + TN(i)=sum(confMatrix(:))-TP(i)-FP(i)-FN(i); + end + + end + + %% Calulations + %1.P-Positive + %2.N-Negative + %3.acuuracy + %4.error + %5.Recall (Recall or True positive rate) + %6.Specificity + %7.Precision + %8.FPR-False positive rate + %9.F_score + %10.MCC-Matthews correlation coefficient + %11.kappa-Cohen's kappa + P=TP+FN; + N=FP+TN; + switch n_class + case 2 + accuracy=(TP+TN)/(P+N); + Error=1-accuracy; + Result.Accuracy=(accuracy); + Result.Error=(Error); + otherwise + accuracy=(TP)./(P+N); + Error=(FP)./(P+N); + Result.Accuracy=sum(accuracy); + Result.Error=sum(Error); + end + + ReferenceResult.AccuracyOfSingle=(TP ./ P)'; + ReferenceResult.ErrorOfSingle=1-ReferenceResult.AccuracyOfSingle; + Recall=TP./P; + Specificity=TN./N; + Precision=TP./(TP+FP); + FPR=1-Specificity; + beta=1; + F1_score=( (1+(beta^2))*(Recall.*Precision) ) ./ ( (beta^2)*(Precision+Recall) ); + MCC=[( TP.*TN - FP.*FN ) ./ ( ( (TP+FP).*P.*N.*(TN+FN) ).^(0.5) );... + ( FP.*FN - TP.*TN ) ./ ( ( (TP+FP).*P.*N.*(TN+FN) ).^(0.5) )] ; + MCC=max(MCC); + + %Kappa Calculation BY 2x2 Matrix Shape + pox=sum(accuracy); + Px=sum(P);TPx=sum(TP);FPx=sum(FP);TNx=sum(TN);FNx=sum(FN);Nx=sum(N); + pex=( (Px.*(TPx+FPx))+(Nx.*(FNx+TNx)) ) ./ ( (TPx+TNx+FPx+FNx).^2 ); + kappa_overall=([( pox-pex ) ./ ( 1-pex );( pex-pox ) ./ ( 1-pox )]); + kappa_overall=max(kappa_overall); + + %Kappa Calculation BY n_class x n_class Matrix Shape + po=accuracy; + pe=( (P.*(TP+FP))+(N.*(FN+TN)) ) ./ ( (TP+TN+FP+FN).^2 ); + kappa=([( po-pe ) ./ ( 1-pe );( pe-po ) ./ ( 1-po )]); + kappa=max(kappa); + + + %% + %Output Struct for individual Classes + % RefereceResult.Class=class_ref; + ReferenceResult.AccuracyInTotal=accuracy'; + ReferenceResult.ErrorInTotal=Error'; + ReferenceResult.Recall=Recall'; + ReferenceResult.Specificity=Specificity'; + ReferenceResult.Precision=Precision'; + ReferenceResult.FalsePositiveRate=FPR'; + ReferenceResult.F1_score=F1_score'; + ReferenceResult.MatthewsCorrelationCoefficient=MCC'; + ReferenceResult.Kappa=kappa'; + ReferenceResult.TruePositive=TP'; + ReferenceResult.FalsePositive=FP'; + ReferenceResult.FalseNegative=FN'; + ReferenceResult.TrueNegative=TN'; + + % Remove NANs and INFs + stats = [Precision', Recall', F1_score', MCC']; + stats(any(isinf(stats),2),:) = 0; + stats(any(isnan(stats),2),:) = 0; + + %Output Struct for over all class lists + Result.Recall=mean(stats(:,2)); + Result.Specificity=mean(Specificity); + Result.Precision=mean(stats(:,1)); + Result.FalsePositiveRate=mean(FPR); + Result.F1_score=mean(stats(:,3)); + Result.MatthewsCorrelationCoefficient=mean(stats(:,4)); + Result.Kappa=kappa_overall; + +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/ring_integral.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/ring_integral.m new file mode 100644 index 0000000..da57ab6 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/ring_integral.m @@ -0,0 +1,17 @@ +function [IM] =ring_integral(K,NB,M) +[Y,X]=meshgrid(1:K+1,1:K+1); +Rad = sqrt(X.^2+Y.^2); +LB=(max(Rad(:))-min(Rad(:)))/NB; +IM=zeros(1,NB); +M=M.*(Rad.^2); +for i=1:NB + minRad=(i-1)*LB; maxRad=(i)*LB; + PZ=(Rad>minRad)&(Rad<=maxRad); + temp=M(PZ); + IM(i)=sum(temp)/sum(PZ(:)); +% IM(i)=sum(temp); +end +% minRad=(60-1)*LB; maxRad=(80)*LB; +% PZ=(Rad>minRad)&(Rad<=maxRad); +% figure;imshow(PZ); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/tight_subplot.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/tight_subplot.m new file mode 100644 index 0000000..55f3a8d --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/function/tight_subplot.m @@ -0,0 +1,62 @@ +function ha = tight_subplot(Nh, Nw, gap, marg_h, marg_w) + +% tight_subplot creates "subplot" axes with adjustable gaps and margins +% +% ha = tight_subplot(Nh, Nw, gap, marg_h, marg_w) +% +% in: Nh number of axes in hight (vertical direction) +% Nw number of axes in width (horizontaldirection) +% gap gaps between the axes in normalized units (0...1) +% or [gap_h gap_w] for different gaps in height and width +% marg_h margins in height in normalized units (0...1) +% or [lower upper] for different lower and upper margins +% marg_w margins in width in normalized units (0...1) +% or [left right] for different left and right margins +% +% out: ha array of handles of the axes objects +% starting from upper left corner, going row-wise as in +% going row-wise as in +% +% Example: ha = tight_subplot(3,2,[.01 .03],[.1 .01],[.01 .01]) +% for ii = 1:6; axes(ha(ii)); plot(randn(10,ii)); end +% set(ha(1:4),'XTickLabel',''); set(ha,'YTickLabel','') + +% Pekka Kumpulainen 20.6.2010 @tut.fi +% Tampere University of Technology / Automation Science and Engineering + + +if nargin<3; gap = .02; end +if nargin<4 || isempty(marg_h); marg_h = .05; end +if nargin<5; marg_w = .05; end + +if numel(gap)==1; + gap = [gap gap]; +end +if numel(marg_w)==1; + marg_w = [marg_w marg_w]; +end +if numel(marg_h)==1; + marg_h = [marg_h marg_h]; +end + +axh = (1-sum(marg_h)-(Nh-1)*gap(1))/Nh; +axw = (1-sum(marg_w)-(Nw-1)*gap(2))/Nw; + +py = 1-marg_h(2)-axh; + +ha = zeros(Nh*Nw,1); +ii = 0; +for ih = 1:Nh + px = marg_w(1); + + for ix = 1:Nw + ii = ii+1; + ha(ii) = axes('Units','normalized', ... + 'Position',[px py axw axh], ... + 'XTickLabel','', ... + 'YTickLabel',''); + px = px+axw+gap(2); + end + py = py-axh-gap(1); +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/hierarchical_invariants.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/hierarchical_invariants.m new file mode 100644 index 0000000..3020623 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/hierarchical_invariants.m @@ -0,0 +1,94 @@ +%% +% close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +param = struct(); +param.type_feat = 10; % type of feature as following: +% '1.ZM';'2.PZM';'3.OFMM';'4.CHFM';'5.PJFM';'6.JFM'; % Classical Jacobi polynomial based moments +% '7.RHFM';'8.EFM';'9.PCET';'10.PCT';'11.PST'; % Classical Harmonic function based moments +% '12.BFM'; % Classical Eigenfunction based moments +% '13.FJFM'; % Fractional-order Jacobi polynomial based moments +% '14.GRHFM';'15.GPCET';'16.GPCT';'17.GPST' % Fractional-order Harmonic function based moments +param.XNM = [0,0;... + 0,1;1,0;... + 0,2;1,1;2,0;... + 3,0;2,1;1,2;0,3;... + 4,0;3,1;2,2;1,3;0,4;... + 5,0;4,1;3,2;2,3;1,4;0,5;... + 6,0;5,1;4,2;3,3;2,4;1,5;0,6]; % K = 6 all the n and m for the moments +param.alpha = 1; % parameter for fractional-order moments +param.p = 2; param.q = 2; % parameters for JFM and FJFM +param.scales = 10; % the scale +param.numofscale = size(param.scales,2); % number of scales +param.imgnorsize = 40; % image normaling size +param.imgpadsize = 12; % image pading size +%% Digit Images +location = fullfile(pwd,'DigitDataset'); +Imds = imageDatastore(location,'IncludeSubfolders',true, 'LabelSource','foldernames'); +rng(10); +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.8); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Digit Featuring with Hierarchical Invariants +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_hi(x,param),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_hi(x,param),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Digit Classification with PCA Model +model = PCAModel(trainfeatures,30,trainImds.Labels); +predlabels = PCAClassifier(testfeatures,model); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Hierarchical Invariants, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); +%% Digit Classification under Arbitrary Rotation and Translation Changes +testImds.ReadFcn = @customreader_imgeo; +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +Ttest = tall(testImds); +testfeatures = cellfun(@(x)feature_extraction_hi(x,param),Ttest,'Uni',0); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +predlabels = PCAClassifier(testfeatures,model); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Hierarchical Invariants, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); + diff --git a/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/scattering_network.m b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/scattering_network.m new file mode 100644 index 0000000..2356be6 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.2 Digit Classification/scattering_network.m @@ -0,0 +1,75 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +sf = waveletScattering2('ImageSize',[28 28],'InvarianceScale',28, ... + 'NumRotations',[8 8]); +%% Digit Images +location = fullfile(pwd,'DigitDataset'); +Imds = imageDatastore(location,'IncludeSubfolders',true, 'LabelSource','foldernames'); +rng(10); +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.8); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Digit Featuring with Wavelet Scattering +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_scattering(sf,x),Ttrain,'UniformOutput',false); +testfeatures = cellfun(@(x)feature_extraction_scattering(sf,x),Ttest,'UniformOutput',false); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Digit Classification with PCA Model +model = PCAModel(trainfeatures,30,trainImds.Labels); +predlabels = PCAClassifier(testfeatures,model); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Wavelet Scattering, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); +%% Digit Classification under Arbitrary Rotation and Translation Changes +testImds.ReadFcn = @customreader_imgeo; +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +Ttest = tall(testImds); +testfeatures = cellfun(@(x)feature_extraction_scattering(sf,x),Ttest,'UniformOutput',false); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +predlabels = PCAClassifier(testfeatures,model); +accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Wavelet Scattering, accuracy = ',num2str(accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/Krawtchouk_moments.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/Krawtchouk_moments.m new file mode 100644 index 0000000..c3c6750 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/Krawtchouk_moments.m @@ -0,0 +1,59 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +K = 80; +P = [0.5,0.5;0.42,0.58;0.58,0.42]; +NP = size(P,1); +NB = 75; +BF = cell(NP,2); +SZI = [100,100]; +for i=1:NP + [BF_x,BF_y]=KM_BF(SZI,K,P(i,1),P(i,2)); + BF{i,1}=BF_x; BF{i,2}=BF_y; +end +%% Parasite Images +location = fullfile(pwd,'Parasite Data Set'); +Imds = imageDatastore(location,'IncludeSubfolders',true, 'LabelSource','foldernames'); +rng(10); +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Parasite Featuring with KM +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_km(x,K,BF,NP,NB),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_km(x,K,BF,NP,NB),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Parasite Classification with PCA Model +model = PCAModel(trainfeatures,30,trainImds.Labels); +predlabels = PCAClassifier(testfeatures,model); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['KM, accuracy = ',num2str(Accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/convolutional_neural_network.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/convolutional_neural_network.m new file mode 100644 index 0000000..196a762 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/convolutional_neural_network.m @@ -0,0 +1,86 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parasite Images +location = fullfile(pwd,'Parasite Data Set'); +Imds = imageDatastore(location,'IncludeSubfolders',true, 'LabelSource','foldernames'); +rng(10); +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Parasite Featuring with CNN +imgsize = 224; +trainImds.ReadFcn = @(x)repmat(imresize(im2gray(imread(x)),'OutputSize',[imgsize,imgsize]),[1,1,3]); +testImds.ReadFcn = @(x)repmat(imresize(im2gray(imread(x)),'OutputSize',[imgsize,imgsize]),[1,1,3]); +reset(trainImds); +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +%% --------simple CNN imgsize = 224 +layers = [ + imageInputLayer([imgsize,imgsize,3]) + convolution2dLayer(7,16) + batchNormalizationLayer + reluLayer + convolution2dLayer(3,20) + batchNormalizationLayer + reluLayer + maxPooling2dLayer(4) + fullyConnectedLayer(8) + softmaxLayer + classificationLayer]; +%% --------alexnet imgsize = 227 +% inputnet = alexnet; +% layersTransfer = inputnet.Layers(1:end-3); +% numClasses = numel(categories(trainImds.Labels)); +% layers = [ +% layersTransfer +% fullyConnectedLayer(numClasses) +% softmaxLayer +% classificationLayer]; +%% --------vgg16 imgsize = 224 +% inputnet = vgg16; +% layersTransfer = inputnet.Layers(1:end-3); +% numClasses = numel(categories(trainImds.Labels)); +% layers = [ +% layersTransfer +% fullyConnectedLayer(numClasses) +% softmaxLayer +% classificationLayer]; +%% -------- +analyzeNetwork(layers); +options = trainingOptions('sgdm',... + 'InitialLearnRate',0.0001, ... + 'MaxEpochs',20, ... + 'MiniBatchSize',100,... + 'Shuffle','every-epoch',... + 'Plots', 'training-progress',... + 'Verbose',false,... + 'ExecutionEnvironment','gpu'); +t = tic; +net = trainNetwork(trainImds,layers,options); +Time = toc(t); +%% Parasite Classification with CNN Model +predlabels = classify(net,testImds,'ExecutionEnvironment','gpu'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['CNN, accuracy = ',num2str(Accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/discrete_cosine_transform.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/discrete_cosine_transform.m new file mode 100644 index 0000000..0f8818f --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/discrete_cosine_transform.m @@ -0,0 +1,50 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +NB = 90; +%% Parasite Images +location = fullfile(pwd,'Parasite Data Set'); +Imds = imageDatastore(location,'IncludeSubfolders',true, 'LabelSource','foldernames'); +rng(10); +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Parasite Featuring with DCT +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_dct(x,NB),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_dct(x,NB),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Parasite Classification with PCA Model +model = PCAModel(trainfeatures,30,trainImds.Labels); +predlabels = PCAClassifier(testfeatures,model); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DCT, accuracy = ',num2str(Accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/discrete_wavelet_transform.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/discrete_wavelet_transform.m new file mode 100644 index 0000000..60c8221 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/discrete_wavelet_transform.m @@ -0,0 +1,51 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +NB = 45; +NF = 4*NB; +%% Parasite Images +location = fullfile(pwd,'Parasite Data Set'); +Imds = imageDatastore(location,'IncludeSubfolders',true, 'LabelSource','foldernames'); +rng(10); +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Parasite Featuring with DWT +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_dwt(x,NB,NF),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_dwt(x,NB,NF),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Parasite Classification with PCA Model +model = PCAModel(trainfeatures,30,trainImds.Labels); +predlabels = PCAClassifier(testfeatures,model); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DWT, accuracy = ',num2str(Accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/DIR.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/DIR.m new file mode 100644 index 0000000..9a59f4c --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/DIR.m @@ -0,0 +1,49 @@ +function [featcell,time] = DIR(img,param) +%% input +if size(img,3) ~= 1 + img = rgb2gray(img); +end +img = double(img); +timestamp = tic; +%% get basis function data +bfdatacell = cell(1,param.numofscale); +for ns = 1:1:param.numofscale + sizeofbf = param.scales(ns); + if mod(sizeofbf,2) == 1 + sizeofbf = sizeofbf - 1; + end + if param.type_feat == 1 || param.type_feat == 2 + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.ZNM,param.alpha, param.p, param.q); + elseif param.type_feat == 11 || param.type_feat == 17 + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.SNM,param.alpha, param.p, param.q); + else + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.NM,param.alpha, param.p, param.q); + end +end +%% naive feature generation +% raggioU = ceil((sizeofbf-1)/2); +% raggioL = floor((sizeofbf-1)/2); +% featcell = cell(1,param.numofscale); +% for ns = 1:1:param.numofscale +% featcell{ns} = abs(bf_filter(img, bfdatacell{ns})); +% featcell{ns} = featcell{ns}((1+raggioU):(end-raggioL),(1+raggioU):(end-raggioL),:); +% end +%% fast feature generation by FFT (Convolution Theorem) +featcell = cell(1,param.numofscale); +fft_img = fft2(img); +nof = size(bfdatacell{1},3); +fft_img_cell = single(zeros([size(img), nof])); +for i = 1:1:nof + fft_img_cell(:,:,i) = fft_img; +end +featcell{param.numofscale} = abs(bf_filter_fft(img, fft_img_cell, bfdatacell{param.numofscale})); +unisize = size (featcell{param.numofscale}); +for ns = 1:1:param.numofscale-1 + temp = abs(bf_filter_fft(img, fft_img_cell, bfdatacell{ns})); + rr = (size(temp)-unisize)/2; + featcell{ns} = temp ((1+rr(1)):(end-rr(1)),(1+rr(2)):(end-rr(2)),:); +end +%% output +clc; +time = toc(timestamp); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/HI.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/HI.m new file mode 100644 index 0000000..dbcb699 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/HI.m @@ -0,0 +1,32 @@ +function [ord,featcell] = HI(img,param) +K = max(max(param.XNM)); +idx = 1; +featcell = cell(1,1); +ord = zeros(1,1); +for x = 0:K + if x == 0 + param.NM = param.XNM(1,:); + [feat,~] = DIR(img,param); + featcell(1)=feat; + ord(1)=x; + else + param.NM = param.XNM(idx:idx+x,:); + inputfeat=img; + [feat,~] = DIR(inputfeat,param); + for z=1:size(feat{1},3) + featcell = [featcell, {feat{1}(:,:,z)}]; + ord =[ord, x]; + end + for y = idx-x:idx-1 + param.NM = param.XNM(idx:idx+x,:); + inputfeat=featcell{y}; + [feat,~] = DIR(inputfeat,param); + for z=1:size(feat{1},3) + featcell = [featcell, {feat{1}(:,:,z)}]; + ord =[ord, x]; + end + end + end + idx=idx+x+1; +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/KM_BF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/KM_BF.m new file mode 100644 index 0000000..cb61b3c --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/KM_BF.m @@ -0,0 +1,52 @@ +function [BF_x,BF_y] = KM_BF(SZI,K,P_x,P_y) +N = SZI(1); +x = 0:1:N-1; +BF_x=zeros(K+1,N); +W=zeros(1,N); +W(1,1)=(1-P_x)^N; %xy=0 +for i=1:N-1 %xy=0:1:N-2 + xy=i-1; + W(i+1)=((N-xy)/(xy+1))*(P_x/(1-P_x))*W(i); +end +if K>=2 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); + for n=3:1:K+1 + order=n-1; + A = (N*P_x+(order-1)*(1-2*P_x)-x)/sqrt(P_x*(1-P_x)*order*(N-n+2)); + B = sqrt((order-1)*(N-order+2)/(order*(N-order+1))); + BF_x(n,:)=A.*BF_x(n-1,:)-B.*BF_x(n-2,:); + end +elseif K==1 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); +elseif K==0 + BF_x(1,:)=sqrt(W); +end + +M = SZI(2); +y = 0:1:M-1; +BF_y=zeros(K+1,M); +W=zeros(1,M); +W(1,1)=(1-P_y)^M; %xy=0 +for i=1:M-1 %xy=0:1:M-2 + xy=i-1; + W(i+1)=((M-xy)/(xy+1))*(P_y/(1-P_y))*W(i); +end +if K>=2 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); + for n=3:1:K+1 + order=n-1; + A = (M*P_y+(order-1)*(1-2*P_y)-y)/sqrt(P_y*(1-P_y)*order*(M-n+2)); + B = sqrt((order-1)*(M-order+2)/(order*(M-order+1))); + BF_y(n,:)=A.*BF_y(n-1,:)-B.*BF_y(n-2,:); + end +elseif K==1 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); +elseif K==0 + BF_y(1,:)=sqrt(W); +end +% X=BF_y*double(img)*BF_x'; +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/KM_D.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/KM_D.m new file mode 100644 index 0000000..c0f7b03 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/KM_D.m @@ -0,0 +1,52 @@ +function [X] = KM_D(I,K,P_x,P_y) +N = size(I,1); +x = 0:1:N-1; +BF_x=zeros(K+1,N); +W=zeros(1,N); +W(1,1)=(1-P_x)^N; %xy=0 +for i=1:N-1 %xy=0:1:N-2 + xy=i-1; + W(i+1)=((N-xy)/(xy+1))*(P_x/(1-P_x))*W(i); +end +if K>=2 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); + for n=3:1:K+1 + order=n-1; + A = (N*P_x+(order-1)*(1-2*P_x)-x)/sqrt(P_x*(1-P_x)*order*(N-n+2)); + B = sqrt((order-1)*(N-order+2)/(order*(N-order+1))); + BF_x(n,:)=A.*BF_x(n-1,:)-B.*BF_x(n-2,:); + end +elseif K==1 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); +elseif K==0 + BF_x(1,:)=sqrt(W); +end + +M = size(I,2); +y = 0:1:M-1; +BF_y=zeros(K+1,M); +W=zeros(1,M); +W(1,1)=(1-P_y)^M; %xy=0 +for i=1:M-1 %xy=0:1:M-2 + xy=i-1; + W(i+1)=((M-xy)/(xy+1))*(P_y/(1-P_y))*W(i); +end +if K>=2 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); + for n=3:1:K+1 + order=n-1; + A = (M*P_y+(order-1)*(1-2*P_y)-y)/sqrt(P_y*(1-P_y)*order*(M-n+2)); + B = sqrt((order-1)*(M-order+2)/(order*(M-order+1))); + BF_y(n,:)=A.*BF_y(n-1,:)-B.*BF_y(n-2,:); + end +elseif K==1 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); +elseif K==0 + BF_y(1,:)=sqrt(W); +end +X=BF_y*double(I)*BF_x'; +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getBF.m new file mode 100644 index 0000000..e8c5291 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getBF.m @@ -0,0 +1,161 @@ +function [BF]=getBF(MODE,SZ,NM,alpha,p,q) +[rho,theta]=ro(SZ,SZ); +pz=rho>1; cnt=sum(pz(:));rho(pz)= 0.5; +L=size(NM,1); +BF=zeros(SZ,SZ,L); +%% ZM +if MODE==1 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getZM_RBF(order,repetition,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PZM +elseif MODE==2 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPZM_RBF(order,repetition,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% OFMM +elseif MODE==3 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getOFMM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% CHFM +elseif MODE==4 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getCHFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PJFM +elseif MODE==5 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPJFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% JFM +elseif MODE==6 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getJFM_RBF(order,rho,p,q); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% RHFM +elseif MODE==7 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getRHFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% EFM +elseif MODE==8 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getEFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PCET +elseif MODE==9 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPCET_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PCT +elseif MODE==10 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPCT_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PST +elseif MODE==11 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPST_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% BFM +elseif MODE==12 + v=1; + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getBFM_RBF(order,rho,v); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% FJFM +elseif MODE==13 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getFJFM_RBF(order,rho,p,q,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GRHFM +elseif MODE==14 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGRHFM_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPCET +elseif MODE==15 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPCET_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPCT +elseif MODE==16 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPCT_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPST +elseif MODE==17 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPST_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +end + diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getBFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getBFM_RBF.m new file mode 100644 index 0000000..7e78f83 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getBFM_RBF.m @@ -0,0 +1,17 @@ +%% REF +% Xiao B, Ma J, Wang X. Image analysis by Bessel¨CFourier moments. Pattern Recognition, 2010, 43(8): 2620-2629. +function [output] = getBFM_RBF(order,rho,v) +Roots=zeros(1,max(order)+2); +syms x; +Roots(1,1)=vpasolve(besselj(v, x) == 0, x); +for i=2:1:max(order)+2 + ST=Roots(1,i-1)+3; + Roots(1,i)=vpasolve(besselj(v, x) == 0, ST); +end +% obtain the order and repetition +n = order; +% compute the radial polynomial +rho=rho*Roots(n+2); +output=besselj(v,rho); +output=output*sqrt((1/(pi*(besselj(v+1,Roots(order+2)))^2))); +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getCHFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getCHFM_RBF.m new file mode 100644 index 0000000..cf6a8bc --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getCHFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +%¡¡Ping Z, Wu R, Sheng Y. Image description with Chebyshev¨CFourier moments. Journal of the Optical Society of America A, 2002, 19(9): 1748-1754. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getCHFM_RBF(order,rho) +% obtain the order +n = order; +p = 2; q = 1.5; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getEFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getEFM_RBF.m new file mode 100644 index 0000000..e60c98f --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getEFM_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hu H, Zhang Y, Shao C, et al. Orthogonal moments based on exponent functions: Exponent-Fourier moments. Pattern Recognition, 2014, 47(8): 2596-2606. +function [output] = getEFM_RBF(order,rho) +% compute the radial polynomial +output=sqrt(rho.^(-1)).*exp(1j*2*pi*order.*rho); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getFJFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getFJFM_RBF.m new file mode 100644 index 0000000..a9d3022 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getFJFM_RBF.m @@ -0,0 +1,38 @@ +%% REF +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getFJFM_RBF(order,rho,p,q,alpha) +% obtain the order +n = order; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getGPCET_RBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getGPCET_RBF.m new file mode 100644 index 0000000..b2dd435 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getGPCET_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPCET_RBF(order,rho,alpha) +% compute the radial polynomial +output=sqrt(alpha*rho.^(alpha-2)).*exp(1j*2*pi*order.*(rho.^alpha)); +end % end getRadialPoly method diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getGPCT_RBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getGPCT_RBF.m new file mode 100644 index 0000000..27b2420 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getGPCT_RBF.m @@ -0,0 +1,10 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPCT_RBF(order,rho,alpha) +% compute the radial polynomial +if order==0 + output=sqrt(alpha*rho.^(alpha-2)); +else + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*cos(pi*order.*rho.^alpha); +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getGPST_RBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getGPST_RBF.m new file mode 100644 index 0000000..ef8c6d0 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getGPST_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPST_RBF(order,rho,alpha) +% compute the radial polynomial +output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*sin(pi*order.*rho.^alpha); +end % end getRadialPoly method diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getGRHFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getGRHFM_RBF.m new file mode 100644 index 0000000..f40ccf5 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getGRHFM_RBF.m @@ -0,0 +1,12 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGRHFM_RBF(order,rho,alpha) +% compute the radial polynomial +if order==0 + output=sqrt(alpha*rho.^(alpha-2)); +elseif mod(order,2)==1 + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*sin(pi*(order+1).*rho.^alpha); +else + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*cos(pi*order.*rho.^alpha); +end +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getJFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getJFM_RBF.m new file mode 100644 index 0000000..b7103d3 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getJFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +% Ping Z, Ren H, Zou J, et al. Generic orthogonal moments: Jacobi¨CFourier moments for invariant image description. Pattern Recognition, 2007, 40(4): 1245-1254. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getJFM_RBF(order,rho,p,q) +% obtain the order +n = order; +alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getOFMM_RBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getOFMM_RBF.m new file mode 100644 index 0000000..4c2fe59 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getOFMM_RBF.m @@ -0,0 +1,41 @@ +%% REF +% Sheng Y, Shen L. Orthogonal Fourier-Mellin moments for invariant pattern recognition. Journal of the Optical Society of America A, 1994, 11(6): 1748-1757. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getOFMM_RBF(order,rho) +% obtain the order +n = order; +p = 2; q = 2; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; + +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPCET_RBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPCET_RBF.m new file mode 100644 index 0000000..7700dd6 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPCET_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPCET_RBF(order,rho) +% compute the radial polynomial +output=exp(1j*2*pi*order.*rho.^2); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPCT_RBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPCT_RBF.m new file mode 100644 index 0000000..b67c9c3 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPCT_RBF.m @@ -0,0 +1,10 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPCT_RBF(order,rho) +% compute the radial polynomial +if order==0 + output=rho.^0; +else + output=sqrt(2).*cos(pi*order.*rho.^2); +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPJFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPJFM_RBF.m new file mode 100644 index 0000000..4b87097 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPJFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +%¡¡Amu G, Hasi S, Yang X, et al. Image analysis by pseudo-Jacobi (p=4, q=3)¨CFourier moments. Applied Optics, 2004, 43(10): 2093-2101. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getPJFM_RBF(order,rho) +% obtain the order +n = order; +p = 4; q = 3; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPST_RBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPST_RBF.m new file mode 100644 index 0000000..e71350c --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPST_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPST_RBF(order,rho) +% compute the radial polynomial +output=sqrt(2).*sin(pi*order.*rho.^2); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPZM_RBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPZM_RBF.m new file mode 100644 index 0000000..68e7305 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getPZM_RBF.m @@ -0,0 +1,44 @@ +%% REF +% Teh C H, Chin R T. On image analysis by the methods of moments. IEEE Transactions on Pattern Analysis and Machine Intelligence, 1988, 10(4): 496-513. +% Al-Rawi M S. Fast computation of pseudo Zernike moments. Journal of Real-Time Image Processing, 2010, 5(1): 3-10. +function [output] = getPZM_RBF(order,repetition,rho) +N=size(rho,1); M=size(rho,2); +repetition=abs(repetition); +rho=rho(:); +output = zeros(order+1, length(rho) ); +if rho==0 + if repetition==0 + output( (0:order)+1,:)= 1; + else + output( (0:order)+1,:) = 0; + end + output=reshape(output,N,M); + return; +end +q=repetition; p = order; +output(q +1,:) = rho.^q; +if q==p + output=output(end,:); + output=reshape(output,N,M); + return; +end +if q == p-1 + Rpp=rho.^p; + output(p +1,:)=(2*p+1)*Rpp - 2*p*rho.^q; + output=output(end,:); + output=reshape(output,N,M); + return; +end +p=q+1; +Rpp=rho.^p; +output(p +1,:)=(2*p+1)*Rpp - 2*p*rho.^q; +q2=q+2; +for p = q2:order + L1 = ((2*p+1)*2*p)/((p+q +1.0)*(p-q)); + L2 = -2*p + L1*((p+q)*(p-q-1))/(2.0*p-1); + L3 = (2*p-1)*(p-1)- L1*(p+q-1)*(p-q-2)/2.0 + 2*(p-1)*L2; + output(p +1,:) = (L1*rho+L2)'.*output(p-1 +1,:) + L3*output(p-2 +1,:); +end +output=output(end,:); +output=reshape(output,N,M); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getRHFM_RBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getRHFM_RBF.m new file mode 100644 index 0000000..2a59186 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getRHFM_RBF.m @@ -0,0 +1,12 @@ +%% REF +% Ren H, Ping Z, Bo W, et al. Multidistortion-invariant image recognition with radial harmonic Fourier moments. Journal of the Optical Society of America A, 2003, 20(4): 631-637. +function [output] = getRHFM_RBF(order,rho) +% compute the radial polynomial +if order==0 + output=sqrt(rho.^(-1)); +elseif mod(order,2)==1 + output=sqrt(rho.^(-1)).*sqrt(2).*sin(pi*(order+1).*rho); +else + output=sqrt(rho.^(-1)).*sqrt(2).*cos(pi*order.*rho); +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getZM_RBF.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getZM_RBF.m new file mode 100644 index 0000000..e9e5f7f --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/getZM_RBF.m @@ -0,0 +1,48 @@ +%% REF +% Teague M R. Image analysis via the general theory of moments. Journal of the Optical Society of America, 1980, 70(8): 920-930. +% Chong C W, Raveendran P, Mukundan R. A comparative analysis of algorithms for fast computation of Zernike moments. Pattern Recognition, 2003, 36(3): 731-742. +function [output] = getZM_RBF(order,repetition,rho) +rr = rho.^2; +for p=0:1:order+1 + q = p-4; + while q>= 0 + H3mn(p+1,q+1) = -(4*(q + 2)*(q + 1))/((p+q+2)*(p-q)); + H2mn(p+1,q+1) = H3mn(p+1,q+1)*(p+q+4)*(p-q-2)/(4*(q+3))+(q+2); + H1mn(p+1,q+1) = (q+4)*(q+3)/2-H2mn(p+1,q+1)*(q+4)+H3mn(p+1,q+1)*(p+q+6)*(p-q-4)/8; + q = q-2; + end +end + +for p=0:1:order+1 + q = p; + Rn = rho.^p; + if p>1 + Rnm2 = rho.^(p-2); + end + while q>= 0 + if q == p + Rnm = Rn; + Rnmp4 = Rn; + elseif q == p-2 + Rnnm2 = p.*Rn-(p-1).*Rnm2; + Rnm = Rnnm2; + Rnmp2 = Rnnm2; + else + H3 = H3mn(p+1,q+1); + H2 = H2mn(p+1,q+1); + H1 = H1mn(p+1,q+1); + Rnm = H1.*Rnmp4+(H2+H3./rr).*Rnmp2; + Rnmp4 = Rnmp2; + Rnmp2 = Rnm; + end + if p == order && q == abs(repetition) + output = Rnm; + break; + end + q = q-2; + end + if p == order && q == abs(repetition) + break; + end +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/ro.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/ro.m new file mode 100644 index 0000000..17021fc --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/MOMENT/ro.m @@ -0,0 +1,36 @@ +function [r,o] = ro(n,m) +r = zeros(n,m); +o = zeros(n,m); +R = max((n-1)/2,(m-1)/2); +for x = 1:n + for y = 1:m + xx = x-1; + yy = y-1; + if (xx<=(n-1)/2) && (yy>=(m-1)/2) + p = yy-(m-1)/2; + q = (n-1)/2-xx; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = asin(q/sqrt(p^2+q^2)); + elseif (xx<=(n-1)/2) && (yy<(m-1)/2) + p = (m-1)/2-yy; + q = (n-1)/2-xx; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = pi-asin(q/sqrt(p^2+q^2)); + elseif (xx>(n-1)/2) && (yy<=(m-1)/2) + p = (m-1)/2-yy; + q = xx-(n-1)/2; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = pi+asin(q/sqrt(p^2+q^2)); + elseif (xx>(n-1)/2) && (yy>(m-1)/2) + p = yy-(m-1)/2; + q = xx-(n-1)/2; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = 2*pi-asin(q/sqrt(p^2+q^2)); + end + if r(x,y)==0 + o(x,y) = 0; + elseif r(x,y)>1 + r(x,y) = 10000; + end + end +end diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/PCAClassifier.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/PCAClassifier.m new file mode 100644 index 0000000..0450061 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/PCAClassifier.m @@ -0,0 +1,50 @@ +function labels =PCAClassifier(features,model) +% This function is only to support wavelet image scattering examples in +% Wavelet Toolbox. It may change or be removed in a future release. +% model is a structure array with fields, M, mu, v, and Labels +% features is the matrix of test data which is Ns-by-L, Ns is the number of +% scattering paths and L is the number of test examples. Each column of +% features is a test example. + +% Copyright 2018 MathWorks + +labelIdx = determineClass(features,model); +labels = model.Labels(labelIdx); +% Returns as column vector to agree with imageDatastore Labels +labels = labels(:); + + +%-------------------------------------------------------------------------- +function labelIdx = determineClass(features,model) +% Determine number of classes +Nclasses = numel(model.Labels); +% Initialize error matrix +errMatrix = Inf(Nclasses,size(features,2)); +for nc = 1:Nclasses + % class centroid + mu = model.mu{nc}; + u = model.U{nc}; + % 1-by-L + errMatrix(nc,:) = projectionError(features,mu,u); +end +% Determine minimum along class dimension +[~,labelIdx] = min(errMatrix,[],1); + + +%-------------------------------------------------------------------------- +function totalerr = projectionError(features,mu,u) + % + Npc = size(u,2); + L = size(features,2); + % Subtract class mean: Ns-by-L minus Ns-by-1 + s = features-mu; + % 1-by-L + normSqX = sum(abs(s).^2,1)'; + err = Inf(Npc+1,L); + err(1,:) = normSqX; + err(2:end,:) = -abs(u'*s).^2; + % 1-by-L + totalerr = sqrt(sum(err,1)); +end +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/PCAModel.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/PCAModel.m new file mode 100644 index 0000000..e62c4dd --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/PCAModel.m @@ -0,0 +1,47 @@ +function model = PCAModel(features,M,Labels) +% This function is only to support wavelet image scattering examples in +% Wavelet Toolbox. It may change or be removed in a future release. +% model = helperPCAModel(features,M,Labels) + +% Copyright 2018 MathWorks + +% Initialize structure array to hold the affine model +model = struct('Dim',[],'mu',[],'U',[],'Labels',categorical([]),'s',[]); +model.Dim = M; +% Obtain the number of classes +LabelCategories = categories(Labels); +Nclasses = numel(categories(Labels)); +for kk = 1:Nclasses + Class = LabelCategories{kk}; + % Find indices corresponding to each class + idxClass = Labels == Class; + % Extract feature vectors for each class + tmpFeatures = features(:,idxClass); + % Determine the mean for each class + model.mu{kk} = mean(tmpFeatures,2); + [model.U{kk},model.S{kk}] = scatPCA(tmpFeatures); + if size(model.U{kk},2) > M + model.U{kk} = model.U{kk}(:,1:M); + model.S{kk} = model.S{kk}(1:M); + + end + model.Labels(kk) = Class; +end + +function [u,s,v] = scatPCA(x,M) + % Calculate the principal components of x along the second dimension. + + if nargin > 1 && M > 0 + % If M is non-zero, calculate the first M principal components. + [u,s,v] = svds(x-sig_mean(x),M); + s = abs(diag(s)/sqrt(size(x,2)-1)).^2; + else + % Otherwise, calculate all the principal components. + % Each row is an observation, i.e. the number of scattering paths + % Each column is a class observation + [u,d] = eig(cov(x')); + [s,ind] = sort(diag(d),'descend'); + u = u(:,ind); + end +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/bf_filter.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/bf_filter.m new file mode 100644 index 0000000..4567b20 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/bf_filter.m @@ -0,0 +1,17 @@ +function y = bf_filter(x,bfdata) +% filtering bank +% y = bf_filter(x,bfdata) +% +% x is a 2d matrix +% bfdata is the filter bank, it is a structure with the following elements: +% .number number of filters, +% .bf a 3d matrix with the filters, +% .factor factor of the filters. +% + + len = size(bfdata,3); + y = zeros(cat(2,size(x),len)); + for index = 1:len, + y(:,:,index) = imfilter(x, conj(bfdata(:,:,index))); + end +end diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/bf_filter_fft.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/bf_filter_fft.m new file mode 100644 index 0000000..67dc4a3 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/bf_filter_fft.m @@ -0,0 +1,13 @@ +function y = bf_filter_fft(x,fft_x,bfdata) + + len = size(bfdata,3); + bf = flip(flip(conj(bfdata),1),2); + pbf = single(zeros([size(x),len])); + pbf(1:size(bf,1),1:size(bf,2),:) = bf; + y = ifft2(fft2(pbf).*fft_x); + y = y(size(bf,1):end,size(bf,2):end,:); + +end + + + diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/bf_filter_fft_scale.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/bf_filter_fft_scale.m new file mode 100644 index 0000000..c0a662b --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/bf_filter_fft_scale.m @@ -0,0 +1,6 @@ +function y = bf_filter_fft_scale(fft_x,fft_pbf_cell,bfdata) + + y = ifft2(single(fft_pbf_cell).*single(fft_x)); + y = y(size(bfdata,1):end,size(bfdata,2):end,:); + +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/customreader_imnoi.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/customreader_imnoi.m new file mode 100644 index 0000000..bfdd311 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/customreader_imnoi.m @@ -0,0 +1,8 @@ +function data = customreader_imnoi(filename,imgsize) +onState = warning('off', 'backtrace'); +c = onCleanup(@() warning(onState)); +data = im2gray(imread(filename)); +data = imnoise(data,'gaussian',0,0.001); +% data = imnoise(data,'salt & pepper',0.001); +data = imresize(data,[imgsize,imgsize]); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/customreader_imnoi_cnn.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/customreader_imnoi_cnn.m new file mode 100644 index 0000000..8f541c8 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/customreader_imnoi_cnn.m @@ -0,0 +1,8 @@ +function data = customreader_imnoi_cnn(filename,imgsize) +onState = warning('off', 'backtrace'); +c = onCleanup(@() warning(onState)); +data = im2gray(imread(filename)); +% data = imnoise(data,'gaussian',0,0.001); +data = imnoise(data,'salt & pepper',0.001); +data = repmat(imresize(data,[imgsize,imgsize]),[1,1,3]); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_dct.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_dct.m new file mode 100644 index 0000000..8e76827 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_dct.m @@ -0,0 +1,9 @@ +function [F] =feature_extraction_dct(I,NB) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[100,100]); +X = dct2(I); +F = ring_integral(size(X,1)-1,NB,abs(X)); +F = F'; +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_dwt.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_dwt.m new file mode 100644 index 0000000..8af02c3 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_dwt.m @@ -0,0 +1,28 @@ +function [F] =feature_extraction_dwt(I,NB,NF) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[100,100]); + +F = zeros(1,NF); +[LoD,HiD] = wfilters('haar','d'); +[cA,cH,cV,cD] = dwt2(I,LoD,HiD,'mode','symh'); + +X = dct2(cA); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(1:NB) = Y; + +X = dct2(cH); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(NB+1:2*NB) = Y; + +X = dct2(cV); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(2*NB+1:3*NB) = Y; + +X = dct2(cD); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(3*NB+1:4*NB) = Y; + +F = F'; +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_hi.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_hi.m new file mode 100644 index 0000000..9717f8a --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_hi.m @@ -0,0 +1,14 @@ +function [F] =feature_extraction_hi(I,param) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[param.imgnorsize,param.imgnorsize]); +I = padarray(I,[param.imgpadsize,param.imgpadsize],0,'both'); +[ord,featcell] = HI(I,param); +F=zeros(size(ord,2),1); +for i = 1:size(ord,2) + X = featcell{i}; + Y = mean(mean(X)); + F(i,1) = Y; +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_km.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_km.m new file mode 100644 index 0000000..7146c1c --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_km.m @@ -0,0 +1,16 @@ +function [F] =feature_extraction_km(I,K,BF,NP,NB) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[100,100]); +F=zeros(NP,NB); +for i=1:NP + %% Moments + M = BF{i,2}*double(I)*BF{i,1}'; + %% Ring Integral + [IM] = ring_integral(K,NB,abs(M)); + F(i,:) = IM; +end +F = reshape(F',1,[]); +F = F'; +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_scattering.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_scattering.m new file mode 100644 index 0000000..7f4c08d --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/feature_extraction_scattering.m @@ -0,0 +1,12 @@ +function features = feature_extraction_scattering(sf,x) +% This function is only to support examples in the Wavelet Toolbox. +% It may change or be removed in a future release. + +% Copyright 2018 MathWorks +if size(x,3) > 1 + x = rgb2gray(x); +end +x = imresize(x,[100 100]); +smat = featureMatrix(sf,x); +features = mean(mean(smat,2),3); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/multiclass_metrics_common.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/multiclass_metrics_common.m new file mode 100644 index 0000000..179c58a --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/multiclass_metrics_common.m @@ -0,0 +1,93 @@ +function metrics = multiclass_metrics_common(confmat) + +%%***********************************************************************% +%* Multiclass metrics *% +%* Finds the multiclss metrics provided a confusion matrix. *% +%* *% +%* Code author: Preetham Manjunatha *% +%* Github link: https://github.com/preethamam %* +%* Date: 11/24/2021 *% +%************************************************************************% +% +%************************************************************************% +% +% Usage: metrics = multiclass_metrics_common(confmat) +% Inputs: confmat - confusion matrix -- N x N matrix +% +% Outputs: metrics - metrics.Precision = Precision; +% metrics.Recall = Recall; +% metrics.Accuracy = Accuracy; +% metrics.Specificity = Specificity; +% metrics.F1score = F1score; + +% Array initialization +N = size(confmat,1); + +Precision = zeros(1,N); +Recall = zeros(1,N); +Specificity = zeros(1,N); +Accuracy = zeros(1,N); +F1score = zeros(1,N); + + +if size(confmat,1) > 2 + + for i = 1:size(confmat,1) + + TP = confmat(i,i); + FN = sum(confmat(i,:))-confmat(i,i); + FP = sum(confmat(:,i))-confmat(i,i); + TN = sum(confmat(:))-TP -FP-FN; + + Precision(:,i) = TP / (TP+FP); % positive predictive value (PPV) + Recall(:,i) = TP / (TP+FN); % true positive rate (TPR), sensitivity + if ((TN / (TN+FP)) > 1) + Specificity(:,i) = 1; + elseif ((TN / (TN+FP)) < 0) + Specificity(:,i) = 0; + else + Specificity(:,i) = TN / (TN+FP); % (SPC) or true negative rate + end + Accuracy(:,i) = (TP)/(TP+TN+FP+FN); % Accuracy + F1score(:,i) = (2*TP) /(2*TP + FP + FN); + end + + % Remove junks + stats = [Precision', Recall', F1score', Accuracy', Specificity']; + stats(any(isinf(stats),2),:) = 0; + stats(any(isnan(stats),2),:) = 0; + + % Compute averages + Accuracy = sum(stats(:,4)); + Precision = mean(stats(:,1)); + Recall = mean(stats(:,2)); + Specificity = mean(Specificity); + F1score = mean(stats(:,3)); +else + TP = confmat(1, 1); + FP = confmat(2, 1); + FN = confmat(1, 2); + TN = confmat(2,2); + + Precision = TP / (TP+FP); % positive predictive value (PPV) + Recall = TP / (TP+FN); % true positive rate (TPR), sensitivity + if ((TN / (TN+FP)) > 1) + Specificity = 1; + elseif ((TN / (TN+FP)) < 0) + Specificity = 0; + else + Specificity = TN / (TN+FP); % (SPC) or true negative rate + end + Accuracy = (TP+TN)/(TP+TN+FP+FN); % Accuracy + F1score = 2*TP /(2*TP + FP + FN); + +end + +% Output +metrics.Precision = Precision; +metrics.Recall = Recall; +metrics.Accuracy = Accuracy; +metrics.Specificity = Specificity; +metrics.F1score = F1score; + + diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/multiclass_metrics_special.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/multiclass_metrics_special.m new file mode 100644 index 0000000..2a92807 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/multiclass_metrics_special.m @@ -0,0 +1,161 @@ +function [Result,ReferenceResult] = multiclass_metrics_special(confMatrix) + +%%***********************************************************************% +%* Multiclass metrics *% +%* Finds the multiclss metrics provided a confusion matrix. *% +%* *% +%* Code author: Preetham Manjunatha *% +%* Github link: https://github.com/preethamam %* +%* Date: 11/24/2021 *% +%************************************************************************% +% +%************************************************************************% +% %confusion matrix for multiple class start +% %Inputs-1.Actual Class Labels,2.Predict Class Labels and 3.Display if need +% %Outputs +% +% %1.Result-Struct Over all output Which has follwing +% %2.RefereceResult indidual output Which has follwing +% %%%%%%%%1.acuuracy +% %%%%%%%%2.error +% %%%%%%%%3.Recall (Recall or True positive rate) +% %%%%%%%%4.Specificity +% %%%%%%%%5.Precision +% %%%%%%%%6.FPR-False positive rate +% %%%%%%%%7.F_score +% %%%%%%%%8.MCC-Matthews correlation coefficient +% %%%%%%%%9.kappa-Cohen's kappa +% +% %%Original Developer Mr.Abbas Manthiri S +% %%Date 25-12-2016 +% %%Mail Id: abbasmanthiribe@gmail.com +% %%http://www.dataschool.io/simple-guide-to-confusion-matrix-terminology/ +% %%https://en.wikipedia.org/wiki/Confusion_matrix +% +% %%Modified by Preetham Manjunatha +% %%Date 02-03-2020 +% %%Note: Fixed Abbas written code where the NaN and Inf values were +% not considered while performaing the class average. +% +% % clc +% % clear all +% % close all +% % %%Multiclass or two class +% % [Result,RefereceResult] = multiclass_metrics(confMatrix) + + % Size of confusion matrix + [row,col]=size(confMatrix); + if row~=col + error('Confusion matrix dimention is wrong') + end + + % Number of classes + n_class=row; + + % Find TP, FN, FP and TN + switch n_class + case 2 + TP=confMatrix(1,1); + FN=confMatrix(1,2); + FP=confMatrix(2,1); + TN=confMatrix(2,2); + + otherwise + TP=zeros(1,n_class); + FN=zeros(1,n_class); + FP=zeros(1,n_class); + TN=zeros(1,n_class); + for i=1:n_class + TP(i)=confMatrix(i,i); + FN(i)=sum(confMatrix(i,:))-confMatrix(i,i); + FP(i)=sum(confMatrix(:,i))-confMatrix(i,i); + TN(i)=sum(confMatrix(:))-TP(i)-FP(i)-FN(i); + end + + end + + %% Calulations + %1.P-Positive + %2.N-Negative + %3.acuuracy + %4.error + %5.Recall (Recall or True positive rate) + %6.Specificity + %7.Precision + %8.FPR-False positive rate + %9.F_score + %10.MCC-Matthews correlation coefficient + %11.kappa-Cohen's kappa + P=TP+FN; + N=FP+TN; + switch n_class + case 2 + accuracy=(TP+TN)/(P+N); + Error=1-accuracy; + Result.Accuracy=(accuracy); + Result.Error=(Error); + otherwise + accuracy=(TP)./(P+N); + Error=(FP)./(P+N); + Result.Accuracy=sum(accuracy); + Result.Error=sum(Error); + end + + ReferenceResult.AccuracyOfSingle=(TP ./ P)'; + ReferenceResult.ErrorOfSingle=1-ReferenceResult.AccuracyOfSingle; + Recall=TP./P; + Specificity=TN./N; + Precision=TP./(TP+FP); + FPR=1-Specificity; + beta=1; + F1_score=( (1+(beta^2))*(Recall.*Precision) ) ./ ( (beta^2)*(Precision+Recall) ); + MCC=[( TP.*TN - FP.*FN ) ./ ( ( (TP+FP).*P.*N.*(TN+FN) ).^(0.5) );... + ( FP.*FN - TP.*TN ) ./ ( ( (TP+FP).*P.*N.*(TN+FN) ).^(0.5) )] ; + MCC=max(MCC); + + %Kappa Calculation BY 2x2 Matrix Shape + pox=sum(accuracy); + Px=sum(P);TPx=sum(TP);FPx=sum(FP);TNx=sum(TN);FNx=sum(FN);Nx=sum(N); + pex=( (Px.*(TPx+FPx))+(Nx.*(FNx+TNx)) ) ./ ( (TPx+TNx+FPx+FNx).^2 ); + kappa_overall=([( pox-pex ) ./ ( 1-pex );( pex-pox ) ./ ( 1-pox )]); + kappa_overall=max(kappa_overall); + + %Kappa Calculation BY n_class x n_class Matrix Shape + po=accuracy; + pe=( (P.*(TP+FP))+(N.*(FN+TN)) ) ./ ( (TP+TN+FP+FN).^2 ); + kappa=([( po-pe ) ./ ( 1-pe );( pe-po ) ./ ( 1-po )]); + kappa=max(kappa); + + + %% + %Output Struct for individual Classes + % RefereceResult.Class=class_ref; + ReferenceResult.AccuracyInTotal=accuracy'; + ReferenceResult.ErrorInTotal=Error'; + ReferenceResult.Recall=Recall'; + ReferenceResult.Specificity=Specificity'; + ReferenceResult.Precision=Precision'; + ReferenceResult.FalsePositiveRate=FPR'; + ReferenceResult.F1_score=F1_score'; + ReferenceResult.MatthewsCorrelationCoefficient=MCC'; + ReferenceResult.Kappa=kappa'; + ReferenceResult.TruePositive=TP'; + ReferenceResult.FalsePositive=FP'; + ReferenceResult.FalseNegative=FN'; + ReferenceResult.TrueNegative=TN'; + + % Remove NANs and INFs + stats = [Precision', Recall', F1_score', MCC']; + stats(any(isinf(stats),2),:) = 0; + stats(any(isnan(stats),2),:) = 0; + + %Output Struct for over all class lists + Result.Recall=mean(stats(:,2)); + Result.Specificity=mean(Specificity); + Result.Precision=mean(stats(:,1)); + Result.FalsePositiveRate=mean(FPR); + Result.F1_score=mean(stats(:,3)); + Result.MatthewsCorrelationCoefficient=mean(stats(:,4)); + Result.Kappa=kappa_overall; + +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/ring_integral.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/ring_integral.m new file mode 100644 index 0000000..da57ab6 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/ring_integral.m @@ -0,0 +1,17 @@ +function [IM] =ring_integral(K,NB,M) +[Y,X]=meshgrid(1:K+1,1:K+1); +Rad = sqrt(X.^2+Y.^2); +LB=(max(Rad(:))-min(Rad(:)))/NB; +IM=zeros(1,NB); +M=M.*(Rad.^2); +for i=1:NB + minRad=(i-1)*LB; maxRad=(i)*LB; + PZ=(Rad>minRad)&(Rad<=maxRad); + temp=M(PZ); + IM(i)=sum(temp)/sum(PZ(:)); +% IM(i)=sum(temp); +end +% minRad=(60-1)*LB; maxRad=(80)*LB; +% PZ=(Rad>minRad)&(Rad<=maxRad); +% figure;imshow(PZ); +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/tight_subplot.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/tight_subplot.m new file mode 100644 index 0000000..55f3a8d --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/function/tight_subplot.m @@ -0,0 +1,62 @@ +function ha = tight_subplot(Nh, Nw, gap, marg_h, marg_w) + +% tight_subplot creates "subplot" axes with adjustable gaps and margins +% +% ha = tight_subplot(Nh, Nw, gap, marg_h, marg_w) +% +% in: Nh number of axes in hight (vertical direction) +% Nw number of axes in width (horizontaldirection) +% gap gaps between the axes in normalized units (0...1) +% or [gap_h gap_w] for different gaps in height and width +% marg_h margins in height in normalized units (0...1) +% or [lower upper] for different lower and upper margins +% marg_w margins in width in normalized units (0...1) +% or [left right] for different left and right margins +% +% out: ha array of handles of the axes objects +% starting from upper left corner, going row-wise as in +% going row-wise as in +% +% Example: ha = tight_subplot(3,2,[.01 .03],[.1 .01],[.01 .01]) +% for ii = 1:6; axes(ha(ii)); plot(randn(10,ii)); end +% set(ha(1:4),'XTickLabel',''); set(ha,'YTickLabel','') + +% Pekka Kumpulainen 20.6.2010 @tut.fi +% Tampere University of Technology / Automation Science and Engineering + + +if nargin<3; gap = .02; end +if nargin<4 || isempty(marg_h); marg_h = .05; end +if nargin<5; marg_w = .05; end + +if numel(gap)==1; + gap = [gap gap]; +end +if numel(marg_w)==1; + marg_w = [marg_w marg_w]; +end +if numel(marg_h)==1; + marg_h = [marg_h marg_h]; +end + +axh = (1-sum(marg_h)-(Nh-1)*gap(1))/Nh; +axw = (1-sum(marg_w)-(Nw-1)*gap(2))/Nw; + +py = 1-marg_h(2)-axh; + +ha = zeros(Nh*Nw,1); +ii = 0; +for ih = 1:Nh + px = marg_w(1); + + for ix = 1:Nw + ii = ii+1; + ha(ii) = axes('Units','normalized', ... + 'Position',[px py axw axh], ... + 'XTickLabel','', ... + 'YTickLabel',''); + px = px+axw+gap(2); + end + py = py-axh-gap(1); +end +end \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/hierarchical_invariants.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/hierarchical_invariants.m new file mode 100644 index 0000000..13df69e --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/hierarchical_invariants.m @@ -0,0 +1,69 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +param = struct(); +param.type_feat = 10; % type of feature as following: +% '1.ZM';'2.PZM';'3.OFMM';'4.CHFM';'5.PJFM';'6.JFM'; % Classical Jacobi polynomial based moments +% '7.RHFM';'8.EFM';'9.PCET';'10.PCT';'11.PST'; % Classical Harmonic function based moments +% '12.BFM'; % Classical Eigenfunction based moments +% '13.FJFM'; % Fractional-order Jacobi polynomial based moments +% '14.GRHFM';'15.GPCET';'16.GPCT';'17.GPST' % Fractional-order Harmonic function based moments +param.XNM = [0,0;... + 0,1;1,0;... + 0,2;1,1;2,0;... + 3,0;2,1;1,2;0,3;... + 4,0;3,1;2,2;1,3;0,4;... + 5,0;4,1;3,2;2,3;1,4;0,5;... + 6,0;5,1;4,2;3,3;2,4;1,5;0,6]; % K = 6 all the n and m for the moments +param.alpha = 1; % parameter for fractional-order moments +param.p = 2; param.q = 2; % parameters for JFM and FJFM +param.scales = 10; % the scale +param.numofscale = size(param.scales,2); % number of scales +param.imgnorsize = 100; % image normaling size +param.imgpadsize = 12; % image pading size +%% Parasite Images +location = fullfile(pwd,'Parasite Data Set'); +Imds = imageDatastore(location,'IncludeSubfolders',true, 'LabelSource','foldernames'); +rng(10); +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Parasite Featuring with Hierarchical Invariants +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_hi(x,param),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_hi(x,param),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Parasite Classification with PCA Model +model = PCAModel(trainfeatures,30,trainImds.Labels); +predlabels = PCAClassifier(testfeatures,model); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Hierarchical Invariants, accuracy = ',num2str(Accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); \ No newline at end of file diff --git a/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/scattering_network.m b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/scattering_network.m new file mode 100644 index 0000000..1529831 --- /dev/null +++ b/2. Computer Vision and Pattern Recognition/2.3 Parasite Classification/scattering_network.m @@ -0,0 +1,51 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +sf = waveletScattering2('ImageSize',[100 100],'InvarianceScale',80, ... + 'NumRotations',[8 8]); +%% Parasite Images +location = fullfile(pwd,'Parasite Data Set'); +Imds = imageDatastore(location,'IncludeSubfolders',true, 'LabelSource','foldernames'); +rng(10); +Imds = shuffle(Imds); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Parasite Featuring with Wavelet Scattering +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_scattering(sf,x),Ttrain,'UniformOutput',false); +testfeatures = cellfun(@(x)feature_extraction_scattering(sf,x),Ttest,'UniformOutput',false); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Parasite Classification with PCA Model +model = PCAModel(trainfeatures,30,trainImds.Labels); +predlabels = PCAClassifier(testfeatures,model); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Wavelet Scattering, accuracy = ',num2str(Accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +disp(table(permetrics.F1_score*100,... + 'RowNames',categories(cchart.ClassLabels),'VariableNames',{'F1 per class'})); \ No newline at end of file diff --git a/3. Adversarial Example Detection/Krawtchouk_moments.m b/3. Adversarial Example Detection/Krawtchouk_moments.m new file mode 100644 index 0000000..92c8b4d --- /dev/null +++ b/3. Adversarial Example Detection/Krawtchouk_moments.m @@ -0,0 +1,73 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +K = 80; +P = [0.5,0.5;0.42,0.58;0.58,0.42]; +NP = size(P,1); +NB = 75; +BF = cell(NP,2); +SZI = [224,224]; +for i=1:NP + [BF_x,BF_y]=KM_BF(SZI,K,P(i,1),P(i,2)); + BF{i,1}=BF_x; BF{i,2}=BF_y; +end +%% Real and Fake Images +RealImds = imageDatastore(fullfile(pwd,'image\Real'),'IncludeSubFolders',true,'LabelSource','foldernames'); +FakeImds = imageDatastore(fullfile(pwd,'image\ALLIN'),'IncludeSubFolders',true,'LabelSource','foldernames'); +rng(100) +FakeImds = shuffle(FakeImds); +numofimages = 4980; % for ALLIN Fake set +% numofimages = length(FakeImds.Files); % for reset Fake sets +FakeImds = subset(FakeImds,1:numofimages); +Imds = imageDatastore(cat(1, RealImds.Files,FakeImds.Files)); +Imds.Labels = cat(1, RealImds.Labels, FakeImds.Labels); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Image Featuring with KM +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_km(x,K,BF,NP,NB),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_km(x,K,BF,NP,NB),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Image Classification with NN Model +NNmodel = fitcnet(trainfeatures',trainImds.Labels); +predlabels = predict(NNmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['KM, NN, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); +%% Image Classification with SVM Model +SVMmodel = fitcsvm(trainfeatures',trainImds.Labels,'OptimizeHyperparameters','all','HyperparameterOptimizationOptions',struct('UseParallel',true)); +predlabels = predict(SVMmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['KM, SVM, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); \ No newline at end of file diff --git a/3. Adversarial Example Detection/convolutional_neural_network.m b/3. Adversarial Example Detection/convolutional_neural_network.m new file mode 100644 index 0000000..e657c87 --- /dev/null +++ b/3. Adversarial Example Detection/convolutional_neural_network.m @@ -0,0 +1,119 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Real and Fake Images +imgsize = 224; +RealImds = imageDatastore(fullfile(pwd,'image\Real'),'IncludeSubFolders',true,'LabelSource','foldernames'); +FakeImds = imageDatastore(fullfile(pwd,'image\ALLIN'),'IncludeSubFolders',true,'LabelSource','foldernames'); +rng(100) +FakeImds = shuffle(FakeImds); +numofimages = 4980; % for ALLIN Fake set +% numofimages = length(FakeImds.Files); % for reset Fake sets +FakeImds = subset(FakeImds,1:numofimages); +Imds = imageDatastore(cat(1, RealImds.Files,FakeImds.Files)); +Imds.Labels = cat(1, RealImds.Labels, FakeImds.Labels); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Image Featuring with CNN +trainImds.ReadFcn = @(x)customreader(x,imgsize); +testImds.ReadFcn = @(x)customreader(x,imgsize); +reset(trainImds); +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +%% --------simple CNN +layers = [ + imageInputLayer([imgsize,imgsize,3]) + convolution2dLayer(7,16) + batchNormalizationLayer + reluLayer + convolution2dLayer(3,20) + batchNormalizationLayer + reluLayer + maxPooling2dLayer(4) + fullyConnectedLayer(2) + softmaxLayer + classificationLayer]; +%% --------alexnet +% inputnet = alexnet; +% layersTransfer = inputnet.Layers(1:end-3); +% numClasses = numel(categories(trainImds.Labels)); +% layers = [ +% layersTransfer +% fullyConnectedLayer(numClasses) +% softmaxLayer +% classificationLayer]; +%% --------vgg16 +% inputnet = vgg16; +% layersTransfer = inputnet.Layers(1:end-3); +% numClasses = numel(categories(trainImds.Labels)); +% layers = [ +% layersTransfer +% fullyConnectedLayer(numClasses) +% softmaxLayer +% classificationLayer]; +%% --------googlenet +% layers = layerGraph(googlenet); +% numClasses = numel(categories(trainImds.Labels)); +% layers = replaceLayer(layers,'loss3-classifier',fullyConnectedLayer(numClasses)); +% layers = replaceLayer(layers,'prob',softmaxLayer); +% layers = replaceLayer(layers,'output',classificationLayer); +%% --------resnet50 +% layers = layerGraph(resnet50); +% numClasses = numel(categories(trainImds.Labels)); +% layers = replaceLayer(layers,'fc1000',fullyConnectedLayer(numClasses)); +% layers = replaceLayer(layers,'fc1000_softmax',softmaxLayer); +% layers = replaceLayer(layers,'ClassificationLayer_fc1000',classificationLayer); +%% --------densenet201 +% layers = layerGraph(densenet201); +% numClasses = numel(categories(trainImds.Labels)); +% layers = replaceLayer(layers,'fc1000',fullyConnectedLayer(numClasses)); +% layers = replaceLayer(layers,'fc1000_softmax',softmaxLayer); +% layers = replaceLayer(layers,'ClassificationLayer_fc1000',classificationLayer); +%% --------inceptionv3 +% layers = layerGraph(inceptionv3); +% numClasses = numel(categories(trainImds.Labels)); +% layers = replaceLayer(layers,'predictions',fullyConnectedLayer(numClasses)); +% layers = replaceLayer(layers,'predictions_softmax',softmaxLayer); +% layers = replaceLayer(layers,'ClassificationLayer_predictions',classificationLayer); +%% --------mobilenetv2 +% layers = layerGraph(mobilenetv2); +% numClasses = numel(categories(trainImds.Labels)); +% layers = replaceLayer(layers,'Logits',fullyConnectedLayer(numClasses)); +% layers = replaceLayer(layers,'Logits_softmax',softmaxLayer); +% layers = replaceLayer(layers,'ClassificationLayer_Logits',classificationLayer); +%% -------- +analyzeNetwork(layers); +options = trainingOptions('sgdm',... + 'InitialLearnRate',0.0001, ... + 'MaxEpochs',20, ... + 'MiniBatchSize',100,... + 'Shuffle','every-epoch',... + 'Plots', 'training-progress',... + 'Verbose',false,... + 'ExecutionEnvironment','gpu'); +t = tic; +net = trainNetwork(trainImds,layers,options); +Time = toc(t); +%% Image Classification with CNN Model +predlabels = classify(net,testImds,'ExecutionEnvironment','gpu'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['CNN, accuracy = ',num2str(Accuracy),'%']); +[avgmetrics, permetrics] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); \ No newline at end of file diff --git a/3. Adversarial Example Detection/discrete_cosine_transform.m b/3. Adversarial Example Detection/discrete_cosine_transform.m new file mode 100644 index 0000000..29b6b33 --- /dev/null +++ b/3. Adversarial Example Detection/discrete_cosine_transform.m @@ -0,0 +1,64 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +NB = 90; +%% Real and Fake Images +RealImds = imageDatastore(fullfile(pwd,'image\Real'),'IncludeSubFolders',true,'LabelSource','foldernames'); +FakeImds = imageDatastore(fullfile(pwd,'image\ALLIN'),'IncludeSubFolders',true,'LabelSource','foldernames'); +rng(100) +FakeImds = shuffle(FakeImds); +numofimages = 4980; % for ALLIN Fake set +% numofimages = length(FakeImds.Files); % for reset Fake sets +FakeImds = subset(FakeImds,1:numofimages); +Imds = imageDatastore(cat(1, RealImds.Files,FakeImds.Files)); +Imds.Labels = cat(1, RealImds.Labels, FakeImds.Labels); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Image Featuring with DCT +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_dct(x,NB),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_dct(x,NB),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Image Classification with NN Model +NNmodel = fitcnet(trainfeatures',trainImds.Labels); +predlabels = predict(NNmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DCT, NN, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); +%% Image Classification with SVM Model +SVMmodel = fitcsvm(trainfeatures',trainImds.Labels,'OptimizeHyperparameters','all','HyperparameterOptimizationOptions',struct('UseParallel',true)); +predlabels = predict(SVMmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DCT, SVM, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); \ No newline at end of file diff --git a/3. Adversarial Example Detection/discrete_wavelet_transform.m b/3. Adversarial Example Detection/discrete_wavelet_transform.m new file mode 100644 index 0000000..554cdbf --- /dev/null +++ b/3. Adversarial Example Detection/discrete_wavelet_transform.m @@ -0,0 +1,65 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +NB = 45; +NF = 4*NB; +%% Real and Fake Images +RealImds = imageDatastore(fullfile(pwd,'image\Real'),'IncludeSubFolders',true,'LabelSource','foldernames'); +FakeImds = imageDatastore(fullfile(pwd,'image\ALLIN'),'IncludeSubFolders',true,'LabelSource','foldernames'); +rng(100) +FakeImds = shuffle(FakeImds); +numofimages = 4980; % for ALLIN Fake set +% numofimages = length(FakeImds.Files); % for reset Fake sets +FakeImds = subset(FakeImds,1:numofimages); +Imds = imageDatastore(cat(1, RealImds.Files,FakeImds.Files)); +Imds.Labels = cat(1, RealImds.Labels, FakeImds.Labels); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Image Featuring with DWT +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_dwt(x,NB,NF),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_dwt(x,NB,NF),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Image Classification with NN Model +NNmodel = fitcnet(trainfeatures',trainImds.Labels); +predlabels = predict(NNmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DWT, NN, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); +%% Image Classification with SVM Model +SVMmodel = fitcsvm(trainfeatures',trainImds.Labels,'OptimizeHyperparameters','all'); +predlabels = predict(SVMmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DWT, SVM, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/DIR.m b/3. Adversarial Example Detection/function/DIR.m new file mode 100644 index 0000000..9a59f4c --- /dev/null +++ b/3. Adversarial Example Detection/function/DIR.m @@ -0,0 +1,49 @@ +function [featcell,time] = DIR(img,param) +%% input +if size(img,3) ~= 1 + img = rgb2gray(img); +end +img = double(img); +timestamp = tic; +%% get basis function data +bfdatacell = cell(1,param.numofscale); +for ns = 1:1:param.numofscale + sizeofbf = param.scales(ns); + if mod(sizeofbf,2) == 1 + sizeofbf = sizeofbf - 1; + end + if param.type_feat == 1 || param.type_feat == 2 + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.ZNM,param.alpha, param.p, param.q); + elseif param.type_feat == 11 || param.type_feat == 17 + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.SNM,param.alpha, param.p, param.q); + else + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.NM,param.alpha, param.p, param.q); + end +end +%% naive feature generation +% raggioU = ceil((sizeofbf-1)/2); +% raggioL = floor((sizeofbf-1)/2); +% featcell = cell(1,param.numofscale); +% for ns = 1:1:param.numofscale +% featcell{ns} = abs(bf_filter(img, bfdatacell{ns})); +% featcell{ns} = featcell{ns}((1+raggioU):(end-raggioL),(1+raggioU):(end-raggioL),:); +% end +%% fast feature generation by FFT (Convolution Theorem) +featcell = cell(1,param.numofscale); +fft_img = fft2(img); +nof = size(bfdatacell{1},3); +fft_img_cell = single(zeros([size(img), nof])); +for i = 1:1:nof + fft_img_cell(:,:,i) = fft_img; +end +featcell{param.numofscale} = abs(bf_filter_fft(img, fft_img_cell, bfdatacell{param.numofscale})); +unisize = size (featcell{param.numofscale}); +for ns = 1:1:param.numofscale-1 + temp = abs(bf_filter_fft(img, fft_img_cell, bfdatacell{ns})); + rr = (size(temp)-unisize)/2; + featcell{ns} = temp ((1+rr(1)):(end-rr(1)),(1+rr(2)):(end-rr(2)),:); +end +%% output +clc; +time = toc(timestamp); +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/HI.m b/3. Adversarial Example Detection/function/HI.m new file mode 100644 index 0000000..dbcb699 --- /dev/null +++ b/3. Adversarial Example Detection/function/HI.m @@ -0,0 +1,32 @@ +function [ord,featcell] = HI(img,param) +K = max(max(param.XNM)); +idx = 1; +featcell = cell(1,1); +ord = zeros(1,1); +for x = 0:K + if x == 0 + param.NM = param.XNM(1,:); + [feat,~] = DIR(img,param); + featcell(1)=feat; + ord(1)=x; + else + param.NM = param.XNM(idx:idx+x,:); + inputfeat=img; + [feat,~] = DIR(inputfeat,param); + for z=1:size(feat{1},3) + featcell = [featcell, {feat{1}(:,:,z)}]; + ord =[ord, x]; + end + for y = idx-x:idx-1 + param.NM = param.XNM(idx:idx+x,:); + inputfeat=featcell{y}; + [feat,~] = DIR(inputfeat,param); + for z=1:size(feat{1},3) + featcell = [featcell, {feat{1}(:,:,z)}]; + ord =[ord, x]; + end + end + end + idx=idx+x+1; +end +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/KM_BF.m b/3. Adversarial Example Detection/function/MOMENT/KM_BF.m new file mode 100644 index 0000000..cb61b3c --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/KM_BF.m @@ -0,0 +1,52 @@ +function [BF_x,BF_y] = KM_BF(SZI,K,P_x,P_y) +N = SZI(1); +x = 0:1:N-1; +BF_x=zeros(K+1,N); +W=zeros(1,N); +W(1,1)=(1-P_x)^N; %xy=0 +for i=1:N-1 %xy=0:1:N-2 + xy=i-1; + W(i+1)=((N-xy)/(xy+1))*(P_x/(1-P_x))*W(i); +end +if K>=2 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); + for n=3:1:K+1 + order=n-1; + A = (N*P_x+(order-1)*(1-2*P_x)-x)/sqrt(P_x*(1-P_x)*order*(N-n+2)); + B = sqrt((order-1)*(N-order+2)/(order*(N-order+1))); + BF_x(n,:)=A.*BF_x(n-1,:)-B.*BF_x(n-2,:); + end +elseif K==1 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); +elseif K==0 + BF_x(1,:)=sqrt(W); +end + +M = SZI(2); +y = 0:1:M-1; +BF_y=zeros(K+1,M); +W=zeros(1,M); +W(1,1)=(1-P_y)^M; %xy=0 +for i=1:M-1 %xy=0:1:M-2 + xy=i-1; + W(i+1)=((M-xy)/(xy+1))*(P_y/(1-P_y))*W(i); +end +if K>=2 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); + for n=3:1:K+1 + order=n-1; + A = (M*P_y+(order-1)*(1-2*P_y)-y)/sqrt(P_y*(1-P_y)*order*(M-n+2)); + B = sqrt((order-1)*(M-order+2)/(order*(M-order+1))); + BF_y(n,:)=A.*BF_y(n-1,:)-B.*BF_y(n-2,:); + end +elseif K==1 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); +elseif K==0 + BF_y(1,:)=sqrt(W); +end +% X=BF_y*double(img)*BF_x'; +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/KM_D.m b/3. Adversarial Example Detection/function/MOMENT/KM_D.m new file mode 100644 index 0000000..c0f7b03 --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/KM_D.m @@ -0,0 +1,52 @@ +function [X] = KM_D(I,K,P_x,P_y) +N = size(I,1); +x = 0:1:N-1; +BF_x=zeros(K+1,N); +W=zeros(1,N); +W(1,1)=(1-P_x)^N; %xy=0 +for i=1:N-1 %xy=0:1:N-2 + xy=i-1; + W(i+1)=((N-xy)/(xy+1))*(P_x/(1-P_x))*W(i); +end +if K>=2 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); + for n=3:1:K+1 + order=n-1; + A = (N*P_x+(order-1)*(1-2*P_x)-x)/sqrt(P_x*(1-P_x)*order*(N-n+2)); + B = sqrt((order-1)*(N-order+2)/(order*(N-order+1))); + BF_x(n,:)=A.*BF_x(n-1,:)-B.*BF_x(n-2,:); + end +elseif K==1 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); +elseif K==0 + BF_x(1,:)=sqrt(W); +end + +M = size(I,2); +y = 0:1:M-1; +BF_y=zeros(K+1,M); +W=zeros(1,M); +W(1,1)=(1-P_y)^M; %xy=0 +for i=1:M-1 %xy=0:1:M-2 + xy=i-1; + W(i+1)=((M-xy)/(xy+1))*(P_y/(1-P_y))*W(i); +end +if K>=2 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); + for n=3:1:K+1 + order=n-1; + A = (M*P_y+(order-1)*(1-2*P_y)-y)/sqrt(P_y*(1-P_y)*order*(M-n+2)); + B = sqrt((order-1)*(M-order+2)/(order*(M-order+1))); + BF_y(n,:)=A.*BF_y(n-1,:)-B.*BF_y(n-2,:); + end +elseif K==1 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); +elseif K==0 + BF_y(1,:)=sqrt(W); +end +X=BF_y*double(I)*BF_x'; +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/getBF.m b/3. Adversarial Example Detection/function/MOMENT/getBF.m new file mode 100644 index 0000000..e8c5291 --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getBF.m @@ -0,0 +1,161 @@ +function [BF]=getBF(MODE,SZ,NM,alpha,p,q) +[rho,theta]=ro(SZ,SZ); +pz=rho>1; cnt=sum(pz(:));rho(pz)= 0.5; +L=size(NM,1); +BF=zeros(SZ,SZ,L); +%% ZM +if MODE==1 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getZM_RBF(order,repetition,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PZM +elseif MODE==2 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPZM_RBF(order,repetition,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% OFMM +elseif MODE==3 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getOFMM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% CHFM +elseif MODE==4 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getCHFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PJFM +elseif MODE==5 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPJFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% JFM +elseif MODE==6 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getJFM_RBF(order,rho,p,q); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% RHFM +elseif MODE==7 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getRHFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% EFM +elseif MODE==8 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getEFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PCET +elseif MODE==9 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPCET_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PCT +elseif MODE==10 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPCT_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PST +elseif MODE==11 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPST_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% BFM +elseif MODE==12 + v=1; + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getBFM_RBF(order,rho,v); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% FJFM +elseif MODE==13 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getFJFM_RBF(order,rho,p,q,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GRHFM +elseif MODE==14 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGRHFM_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPCET +elseif MODE==15 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPCET_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPCT +elseif MODE==16 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPCT_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPST +elseif MODE==17 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPST_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +end + diff --git a/3. Adversarial Example Detection/function/MOMENT/getBFM_RBF.m b/3. Adversarial Example Detection/function/MOMENT/getBFM_RBF.m new file mode 100644 index 0000000..7e78f83 --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getBFM_RBF.m @@ -0,0 +1,17 @@ +%% REF +% Xiao B, Ma J, Wang X. Image analysis by Bessel¨CFourier moments. Pattern Recognition, 2010, 43(8): 2620-2629. +function [output] = getBFM_RBF(order,rho,v) +Roots=zeros(1,max(order)+2); +syms x; +Roots(1,1)=vpasolve(besselj(v, x) == 0, x); +for i=2:1:max(order)+2 + ST=Roots(1,i-1)+3; + Roots(1,i)=vpasolve(besselj(v, x) == 0, ST); +end +% obtain the order and repetition +n = order; +% compute the radial polynomial +rho=rho*Roots(n+2); +output=besselj(v,rho); +output=output*sqrt((1/(pi*(besselj(v+1,Roots(order+2)))^2))); +end % end getRadialPoly method \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/getCHFM_RBF.m b/3. Adversarial Example Detection/function/MOMENT/getCHFM_RBF.m new file mode 100644 index 0000000..cf6a8bc --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getCHFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +%¡¡Ping Z, Wu R, Sheng Y. Image description with Chebyshev¨CFourier moments. Journal of the Optical Society of America A, 2002, 19(9): 1748-1754. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getCHFM_RBF(order,rho) +% obtain the order +n = order; +p = 2; q = 1.5; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/getEFM_RBF.m b/3. Adversarial Example Detection/function/MOMENT/getEFM_RBF.m new file mode 100644 index 0000000..e60c98f --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getEFM_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hu H, Zhang Y, Shao C, et al. Orthogonal moments based on exponent functions: Exponent-Fourier moments. Pattern Recognition, 2014, 47(8): 2596-2606. +function [output] = getEFM_RBF(order,rho) +% compute the radial polynomial +output=sqrt(rho.^(-1)).*exp(1j*2*pi*order.*rho); +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/getFJFM_RBF.m b/3. Adversarial Example Detection/function/MOMENT/getFJFM_RBF.m new file mode 100644 index 0000000..a9d3022 --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getFJFM_RBF.m @@ -0,0 +1,38 @@ +%% REF +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getFJFM_RBF(order,rho,p,q,alpha) +% obtain the order +n = order; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/getGPCET_RBF.m b/3. Adversarial Example Detection/function/MOMENT/getGPCET_RBF.m new file mode 100644 index 0000000..b2dd435 --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getGPCET_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPCET_RBF(order,rho,alpha) +% compute the radial polynomial +output=sqrt(alpha*rho.^(alpha-2)).*exp(1j*2*pi*order.*(rho.^alpha)); +end % end getRadialPoly method diff --git a/3. Adversarial Example Detection/function/MOMENT/getGPCT_RBF.m b/3. Adversarial Example Detection/function/MOMENT/getGPCT_RBF.m new file mode 100644 index 0000000..27b2420 --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getGPCT_RBF.m @@ -0,0 +1,10 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPCT_RBF(order,rho,alpha) +% compute the radial polynomial +if order==0 + output=sqrt(alpha*rho.^(alpha-2)); +else + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*cos(pi*order.*rho.^alpha); +end +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/getGPST_RBF.m b/3. Adversarial Example Detection/function/MOMENT/getGPST_RBF.m new file mode 100644 index 0000000..ef8c6d0 --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getGPST_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPST_RBF(order,rho,alpha) +% compute the radial polynomial +output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*sin(pi*order.*rho.^alpha); +end % end getRadialPoly method diff --git a/3. Adversarial Example Detection/function/MOMENT/getGRHFM_RBF.m b/3. Adversarial Example Detection/function/MOMENT/getGRHFM_RBF.m new file mode 100644 index 0000000..f40ccf5 --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getGRHFM_RBF.m @@ -0,0 +1,12 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGRHFM_RBF(order,rho,alpha) +% compute the radial polynomial +if order==0 + output=sqrt(alpha*rho.^(alpha-2)); +elseif mod(order,2)==1 + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*sin(pi*(order+1).*rho.^alpha); +else + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*cos(pi*order.*rho.^alpha); +end +end % end getRadialPoly method \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/getJFM_RBF.m b/3. Adversarial Example Detection/function/MOMENT/getJFM_RBF.m new file mode 100644 index 0000000..b7103d3 --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getJFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +% Ping Z, Ren H, Zou J, et al. Generic orthogonal moments: Jacobi¨CFourier moments for invariant image description. Pattern Recognition, 2007, 40(4): 1245-1254. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getJFM_RBF(order,rho,p,q) +% obtain the order +n = order; +alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/getOFMM_RBF.m b/3. Adversarial Example Detection/function/MOMENT/getOFMM_RBF.m new file mode 100644 index 0000000..4c2fe59 --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getOFMM_RBF.m @@ -0,0 +1,41 @@ +%% REF +% Sheng Y, Shen L. Orthogonal Fourier-Mellin moments for invariant pattern recognition. Journal of the Optical Society of America A, 1994, 11(6): 1748-1757. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getOFMM_RBF(order,rho) +% obtain the order +n = order; +p = 2; q = 2; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; + +end % end getRadialPoly method \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/getPCET_RBF.m b/3. Adversarial Example Detection/function/MOMENT/getPCET_RBF.m new file mode 100644 index 0000000..7700dd6 --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getPCET_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPCET_RBF(order,rho) +% compute the radial polynomial +output=exp(1j*2*pi*order.*rho.^2); +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/getPCT_RBF.m b/3. Adversarial Example Detection/function/MOMENT/getPCT_RBF.m new file mode 100644 index 0000000..b67c9c3 --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getPCT_RBF.m @@ -0,0 +1,10 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPCT_RBF(order,rho) +% compute the radial polynomial +if order==0 + output=rho.^0; +else + output=sqrt(2).*cos(pi*order.*rho.^2); +end +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/getPJFM_RBF.m b/3. Adversarial Example Detection/function/MOMENT/getPJFM_RBF.m new file mode 100644 index 0000000..4b87097 --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getPJFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +%¡¡Amu G, Hasi S, Yang X, et al. Image analysis by pseudo-Jacobi (p=4, q=3)¨CFourier moments. Applied Optics, 2004, 43(10): 2093-2101. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getPJFM_RBF(order,rho) +% obtain the order +n = order; +p = 4; q = 3; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/getPST_RBF.m b/3. Adversarial Example Detection/function/MOMENT/getPST_RBF.m new file mode 100644 index 0000000..e71350c --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getPST_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPST_RBF(order,rho) +% compute the radial polynomial +output=sqrt(2).*sin(pi*order.*rho.^2); +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/getPZM_RBF.m b/3. Adversarial Example Detection/function/MOMENT/getPZM_RBF.m new file mode 100644 index 0000000..68e7305 --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getPZM_RBF.m @@ -0,0 +1,44 @@ +%% REF +% Teh C H, Chin R T. On image analysis by the methods of moments. IEEE Transactions on Pattern Analysis and Machine Intelligence, 1988, 10(4): 496-513. +% Al-Rawi M S. Fast computation of pseudo Zernike moments. Journal of Real-Time Image Processing, 2010, 5(1): 3-10. +function [output] = getPZM_RBF(order,repetition,rho) +N=size(rho,1); M=size(rho,2); +repetition=abs(repetition); +rho=rho(:); +output = zeros(order+1, length(rho) ); +if rho==0 + if repetition==0 + output( (0:order)+1,:)= 1; + else + output( (0:order)+1,:) = 0; + end + output=reshape(output,N,M); + return; +end +q=repetition; p = order; +output(q +1,:) = rho.^q; +if q==p + output=output(end,:); + output=reshape(output,N,M); + return; +end +if q == p-1 + Rpp=rho.^p; + output(p +1,:)=(2*p+1)*Rpp - 2*p*rho.^q; + output=output(end,:); + output=reshape(output,N,M); + return; +end +p=q+1; +Rpp=rho.^p; +output(p +1,:)=(2*p+1)*Rpp - 2*p*rho.^q; +q2=q+2; +for p = q2:order + L1 = ((2*p+1)*2*p)/((p+q +1.0)*(p-q)); + L2 = -2*p + L1*((p+q)*(p-q-1))/(2.0*p-1); + L3 = (2*p-1)*(p-1)- L1*(p+q-1)*(p-q-2)/2.0 + 2*(p-1)*L2; + output(p +1,:) = (L1*rho+L2)'.*output(p-1 +1,:) + L3*output(p-2 +1,:); +end +output=output(end,:); +output=reshape(output,N,M); +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/getRHFM_RBF.m b/3. Adversarial Example Detection/function/MOMENT/getRHFM_RBF.m new file mode 100644 index 0000000..2a59186 --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getRHFM_RBF.m @@ -0,0 +1,12 @@ +%% REF +% Ren H, Ping Z, Bo W, et al. Multidistortion-invariant image recognition with radial harmonic Fourier moments. Journal of the Optical Society of America A, 2003, 20(4): 631-637. +function [output] = getRHFM_RBF(order,rho) +% compute the radial polynomial +if order==0 + output=sqrt(rho.^(-1)); +elseif mod(order,2)==1 + output=sqrt(rho.^(-1)).*sqrt(2).*sin(pi*(order+1).*rho); +else + output=sqrt(rho.^(-1)).*sqrt(2).*cos(pi*order.*rho); +end +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/getZM_RBF.m b/3. Adversarial Example Detection/function/MOMENT/getZM_RBF.m new file mode 100644 index 0000000..e9e5f7f --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/getZM_RBF.m @@ -0,0 +1,48 @@ +%% REF +% Teague M R. Image analysis via the general theory of moments. Journal of the Optical Society of America, 1980, 70(8): 920-930. +% Chong C W, Raveendran P, Mukundan R. A comparative analysis of algorithms for fast computation of Zernike moments. Pattern Recognition, 2003, 36(3): 731-742. +function [output] = getZM_RBF(order,repetition,rho) +rr = rho.^2; +for p=0:1:order+1 + q = p-4; + while q>= 0 + H3mn(p+1,q+1) = -(4*(q + 2)*(q + 1))/((p+q+2)*(p-q)); + H2mn(p+1,q+1) = H3mn(p+1,q+1)*(p+q+4)*(p-q-2)/(4*(q+3))+(q+2); + H1mn(p+1,q+1) = (q+4)*(q+3)/2-H2mn(p+1,q+1)*(q+4)+H3mn(p+1,q+1)*(p+q+6)*(p-q-4)/8; + q = q-2; + end +end + +for p=0:1:order+1 + q = p; + Rn = rho.^p; + if p>1 + Rnm2 = rho.^(p-2); + end + while q>= 0 + if q == p + Rnm = Rn; + Rnmp4 = Rn; + elseif q == p-2 + Rnnm2 = p.*Rn-(p-1).*Rnm2; + Rnm = Rnnm2; + Rnmp2 = Rnnm2; + else + H3 = H3mn(p+1,q+1); + H2 = H2mn(p+1,q+1); + H1 = H1mn(p+1,q+1); + Rnm = H1.*Rnmp4+(H2+H3./rr).*Rnmp2; + Rnmp4 = Rnmp2; + Rnmp2 = Rnm; + end + if p == order && q == abs(repetition) + output = Rnm; + break; + end + q = q-2; + end + if p == order && q == abs(repetition) + break; + end +end +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/MOMENT/ro.m b/3. Adversarial Example Detection/function/MOMENT/ro.m new file mode 100644 index 0000000..17021fc --- /dev/null +++ b/3. Adversarial Example Detection/function/MOMENT/ro.m @@ -0,0 +1,36 @@ +function [r,o] = ro(n,m) +r = zeros(n,m); +o = zeros(n,m); +R = max((n-1)/2,(m-1)/2); +for x = 1:n + for y = 1:m + xx = x-1; + yy = y-1; + if (xx<=(n-1)/2) && (yy>=(m-1)/2) + p = yy-(m-1)/2; + q = (n-1)/2-xx; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = asin(q/sqrt(p^2+q^2)); + elseif (xx<=(n-1)/2) && (yy<(m-1)/2) + p = (m-1)/2-yy; + q = (n-1)/2-xx; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = pi-asin(q/sqrt(p^2+q^2)); + elseif (xx>(n-1)/2) && (yy<=(m-1)/2) + p = (m-1)/2-yy; + q = xx-(n-1)/2; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = pi+asin(q/sqrt(p^2+q^2)); + elseif (xx>(n-1)/2) && (yy>(m-1)/2) + p = yy-(m-1)/2; + q = xx-(n-1)/2; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = 2*pi-asin(q/sqrt(p^2+q^2)); + end + if r(x,y)==0 + o(x,y) = 0; + elseif r(x,y)>1 + r(x,y) = 10000; + end + end +end diff --git a/3. Adversarial Example Detection/function/PCAClassifier.m b/3. Adversarial Example Detection/function/PCAClassifier.m new file mode 100644 index 0000000..0450061 --- /dev/null +++ b/3. Adversarial Example Detection/function/PCAClassifier.m @@ -0,0 +1,50 @@ +function labels =PCAClassifier(features,model) +% This function is only to support wavelet image scattering examples in +% Wavelet Toolbox. It may change or be removed in a future release. +% model is a structure array with fields, M, mu, v, and Labels +% features is the matrix of test data which is Ns-by-L, Ns is the number of +% scattering paths and L is the number of test examples. Each column of +% features is a test example. + +% Copyright 2018 MathWorks + +labelIdx = determineClass(features,model); +labels = model.Labels(labelIdx); +% Returns as column vector to agree with imageDatastore Labels +labels = labels(:); + + +%-------------------------------------------------------------------------- +function labelIdx = determineClass(features,model) +% Determine number of classes +Nclasses = numel(model.Labels); +% Initialize error matrix +errMatrix = Inf(Nclasses,size(features,2)); +for nc = 1:Nclasses + % class centroid + mu = model.mu{nc}; + u = model.U{nc}; + % 1-by-L + errMatrix(nc,:) = projectionError(features,mu,u); +end +% Determine minimum along class dimension +[~,labelIdx] = min(errMatrix,[],1); + + +%-------------------------------------------------------------------------- +function totalerr = projectionError(features,mu,u) + % + Npc = size(u,2); + L = size(features,2); + % Subtract class mean: Ns-by-L minus Ns-by-1 + s = features-mu; + % 1-by-L + normSqX = sum(abs(s).^2,1)'; + err = Inf(Npc+1,L); + err(1,:) = normSqX; + err(2:end,:) = -abs(u'*s).^2; + % 1-by-L + totalerr = sqrt(sum(err,1)); +end +end +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/PCAModel.m b/3. Adversarial Example Detection/function/PCAModel.m new file mode 100644 index 0000000..e62c4dd --- /dev/null +++ b/3. Adversarial Example Detection/function/PCAModel.m @@ -0,0 +1,47 @@ +function model = PCAModel(features,M,Labels) +% This function is only to support wavelet image scattering examples in +% Wavelet Toolbox. It may change or be removed in a future release. +% model = helperPCAModel(features,M,Labels) + +% Copyright 2018 MathWorks + +% Initialize structure array to hold the affine model +model = struct('Dim',[],'mu',[],'U',[],'Labels',categorical([]),'s',[]); +model.Dim = M; +% Obtain the number of classes +LabelCategories = categories(Labels); +Nclasses = numel(categories(Labels)); +for kk = 1:Nclasses + Class = LabelCategories{kk}; + % Find indices corresponding to each class + idxClass = Labels == Class; + % Extract feature vectors for each class + tmpFeatures = features(:,idxClass); + % Determine the mean for each class + model.mu{kk} = mean(tmpFeatures,2); + [model.U{kk},model.S{kk}] = scatPCA(tmpFeatures); + if size(model.U{kk},2) > M + model.U{kk} = model.U{kk}(:,1:M); + model.S{kk} = model.S{kk}(1:M); + + end + model.Labels(kk) = Class; +end + +function [u,s,v] = scatPCA(x,M) + % Calculate the principal components of x along the second dimension. + + if nargin > 1 && M > 0 + % If M is non-zero, calculate the first M principal components. + [u,s,v] = svds(x-sig_mean(x),M); + s = abs(diag(s)/sqrt(size(x,2)-1)).^2; + else + % Otherwise, calculate all the principal components. + % Each row is an observation, i.e. the number of scattering paths + % Each column is a class observation + [u,d] = eig(cov(x')); + [s,ind] = sort(diag(d),'descend'); + u = u(:,ind); + end +end +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/bf_filter.m b/3. Adversarial Example Detection/function/bf_filter.m new file mode 100644 index 0000000..4567b20 --- /dev/null +++ b/3. Adversarial Example Detection/function/bf_filter.m @@ -0,0 +1,17 @@ +function y = bf_filter(x,bfdata) +% filtering bank +% y = bf_filter(x,bfdata) +% +% x is a 2d matrix +% bfdata is the filter bank, it is a structure with the following elements: +% .number number of filters, +% .bf a 3d matrix with the filters, +% .factor factor of the filters. +% + + len = size(bfdata,3); + y = zeros(cat(2,size(x),len)); + for index = 1:len, + y(:,:,index) = imfilter(x, conj(bfdata(:,:,index))); + end +end diff --git a/3. Adversarial Example Detection/function/bf_filter_fft.m b/3. Adversarial Example Detection/function/bf_filter_fft.m new file mode 100644 index 0000000..67dc4a3 --- /dev/null +++ b/3. Adversarial Example Detection/function/bf_filter_fft.m @@ -0,0 +1,13 @@ +function y = bf_filter_fft(x,fft_x,bfdata) + + len = size(bfdata,3); + bf = flip(flip(conj(bfdata),1),2); + pbf = single(zeros([size(x),len])); + pbf(1:size(bf,1),1:size(bf,2),:) = bf; + y = ifft2(fft2(pbf).*fft_x); + y = y(size(bf,1):end,size(bf,2):end,:); + +end + + + diff --git a/3. Adversarial Example Detection/function/bf_filter_fft_scale.m b/3. Adversarial Example Detection/function/bf_filter_fft_scale.m new file mode 100644 index 0000000..c0a662b --- /dev/null +++ b/3. Adversarial Example Detection/function/bf_filter_fft_scale.m @@ -0,0 +1,6 @@ +function y = bf_filter_fft_scale(fft_x,fft_pbf_cell,bfdata) + + y = ifft2(single(fft_pbf_cell).*single(fft_x)); + y = y(size(bfdata,1):end,size(bfdata,2):end,:); + +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/customreader.m b/3. Adversarial Example Detection/function/customreader.m new file mode 100644 index 0000000..51bf1c7 --- /dev/null +++ b/3. Adversarial Example Detection/function/customreader.m @@ -0,0 +1,9 @@ +function data = customreader(filename,imgsize) +onState = warning('off', 'backtrace'); +c = onCleanup(@() warning(onState)); +data = imread(filename); +data = imresize(data,'OutputSize',[imgsize,imgsize]); +if size(data,3) == 1 + data = repmat(data,[1 1 3]); +end +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/feature_extraction_dct.m b/3. Adversarial Example Detection/function/feature_extraction_dct.m new file mode 100644 index 0000000..6862f90 --- /dev/null +++ b/3. Adversarial Example Detection/function/feature_extraction_dct.m @@ -0,0 +1,9 @@ +function [F] =feature_extraction_dct(I,NB) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[224,224]); +X = dct2(I); +F = ring_integral(size(X,1)-1,NB,abs(X)); +F = F'; +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/feature_extraction_dwt.m b/3. Adversarial Example Detection/function/feature_extraction_dwt.m new file mode 100644 index 0000000..75cc3c6 --- /dev/null +++ b/3. Adversarial Example Detection/function/feature_extraction_dwt.m @@ -0,0 +1,28 @@ +function [F] =feature_extraction_dwt(I,NB,NF) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[224,224]); + +F = zeros(1,NF); +[LoD,HiD] = wfilters('haar','d'); +[cA,cH,cV,cD] = dwt2(I,LoD,HiD,'mode','symh'); + +X = dct2(cA); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(1:NB) = Y; + +X = dct2(cH); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(NB+1:2*NB) = Y; + +X = dct2(cV); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(2*NB+1:3*NB) = Y; + +X = dct2(cD); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(3*NB+1:4*NB) = Y; + +F = F'; +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/feature_extraction_hi.m b/3. Adversarial Example Detection/function/feature_extraction_hi.m new file mode 100644 index 0000000..4c96719 --- /dev/null +++ b/3. Adversarial Example Detection/function/feature_extraction_hi.m @@ -0,0 +1,15 @@ +function [F] =feature_extraction_hi(I,param) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[param.imgnorsize,param.imgnorsize]); +I = padarray(I,[param.imgpadsize,param.imgpadsize],0,'both'); +[ord,featcell] = HI(I,param); +F=zeros(size(ord,2)*param.binsize,1); +for i = 1:size(ord,2) + X = featcell{i}; + Y = dct2(X)/(size(X,1)*size(X,2)); + Z = ring_integral(size(Y,1)-1,param.binsize,abs(Y)); + F((i-1)*param.binsize+1:(i)*param.binsize) = Z'; +end +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/feature_extraction_km.m b/3. Adversarial Example Detection/function/feature_extraction_km.m new file mode 100644 index 0000000..dd41ec9 --- /dev/null +++ b/3. Adversarial Example Detection/function/feature_extraction_km.m @@ -0,0 +1,16 @@ +function [F] =feature_extraction_km(I,K,BF,NP,NB) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[224,224]); +F=zeros(NP,NB); +for i=1:NP + %% Moments + M = BF{i,2}*double(I)*BF{i,1}'; + %% Ring Integral + [IM] = ring_integral(K,NB,abs(M)); + F(i,:) = IM; +end +F = reshape(F',1,[]); +F = F'; +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/feature_extraction_scattering.m b/3. Adversarial Example Detection/function/feature_extraction_scattering.m new file mode 100644 index 0000000..324d5b0 --- /dev/null +++ b/3. Adversarial Example Detection/function/feature_extraction_scattering.m @@ -0,0 +1,12 @@ +function features = feature_extraction_scattering(sf,x) +% This function is only to support examples in the Wavelet Toolbox. +% It may change or be removed in a future release. + +% Copyright 2018 MathWorks +if size(x,3) > 1 + x = rgb2gray(x); +end +x = imresize(x,[224 224]); +smat = featureMatrix(sf,x); +features = mean(mean(smat,2),3); +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/multiclass_metrics_common.m b/3. Adversarial Example Detection/function/multiclass_metrics_common.m new file mode 100644 index 0000000..179c58a --- /dev/null +++ b/3. Adversarial Example Detection/function/multiclass_metrics_common.m @@ -0,0 +1,93 @@ +function metrics = multiclass_metrics_common(confmat) + +%%***********************************************************************% +%* Multiclass metrics *% +%* Finds the multiclss metrics provided a confusion matrix. *% +%* *% +%* Code author: Preetham Manjunatha *% +%* Github link: https://github.com/preethamam %* +%* Date: 11/24/2021 *% +%************************************************************************% +% +%************************************************************************% +% +% Usage: metrics = multiclass_metrics_common(confmat) +% Inputs: confmat - confusion matrix -- N x N matrix +% +% Outputs: metrics - metrics.Precision = Precision; +% metrics.Recall = Recall; +% metrics.Accuracy = Accuracy; +% metrics.Specificity = Specificity; +% metrics.F1score = F1score; + +% Array initialization +N = size(confmat,1); + +Precision = zeros(1,N); +Recall = zeros(1,N); +Specificity = zeros(1,N); +Accuracy = zeros(1,N); +F1score = zeros(1,N); + + +if size(confmat,1) > 2 + + for i = 1:size(confmat,1) + + TP = confmat(i,i); + FN = sum(confmat(i,:))-confmat(i,i); + FP = sum(confmat(:,i))-confmat(i,i); + TN = sum(confmat(:))-TP -FP-FN; + + Precision(:,i) = TP / (TP+FP); % positive predictive value (PPV) + Recall(:,i) = TP / (TP+FN); % true positive rate (TPR), sensitivity + if ((TN / (TN+FP)) > 1) + Specificity(:,i) = 1; + elseif ((TN / (TN+FP)) < 0) + Specificity(:,i) = 0; + else + Specificity(:,i) = TN / (TN+FP); % (SPC) or true negative rate + end + Accuracy(:,i) = (TP)/(TP+TN+FP+FN); % Accuracy + F1score(:,i) = (2*TP) /(2*TP + FP + FN); + end + + % Remove junks + stats = [Precision', Recall', F1score', Accuracy', Specificity']; + stats(any(isinf(stats),2),:) = 0; + stats(any(isnan(stats),2),:) = 0; + + % Compute averages + Accuracy = sum(stats(:,4)); + Precision = mean(stats(:,1)); + Recall = mean(stats(:,2)); + Specificity = mean(Specificity); + F1score = mean(stats(:,3)); +else + TP = confmat(1, 1); + FP = confmat(2, 1); + FN = confmat(1, 2); + TN = confmat(2,2); + + Precision = TP / (TP+FP); % positive predictive value (PPV) + Recall = TP / (TP+FN); % true positive rate (TPR), sensitivity + if ((TN / (TN+FP)) > 1) + Specificity = 1; + elseif ((TN / (TN+FP)) < 0) + Specificity = 0; + else + Specificity = TN / (TN+FP); % (SPC) or true negative rate + end + Accuracy = (TP+TN)/(TP+TN+FP+FN); % Accuracy + F1score = 2*TP /(2*TP + FP + FN); + +end + +% Output +metrics.Precision = Precision; +metrics.Recall = Recall; +metrics.Accuracy = Accuracy; +metrics.Specificity = Specificity; +metrics.F1score = F1score; + + diff --git a/3. Adversarial Example Detection/function/multiclass_metrics_special.m b/3. Adversarial Example Detection/function/multiclass_metrics_special.m new file mode 100644 index 0000000..2a92807 --- /dev/null +++ b/3. Adversarial Example Detection/function/multiclass_metrics_special.m @@ -0,0 +1,161 @@ +function [Result,ReferenceResult] = multiclass_metrics_special(confMatrix) + +%%***********************************************************************% +%* Multiclass metrics *% +%* Finds the multiclss metrics provided a confusion matrix. *% +%* *% +%* Code author: Preetham Manjunatha *% +%* Github link: https://github.com/preethamam %* +%* Date: 11/24/2021 *% +%************************************************************************% +% +%************************************************************************% +% %confusion matrix for multiple class start +% %Inputs-1.Actual Class Labels,2.Predict Class Labels and 3.Display if need +% %Outputs +% +% %1.Result-Struct Over all output Which has follwing +% %2.RefereceResult indidual output Which has follwing +% %%%%%%%%1.acuuracy +% %%%%%%%%2.error +% %%%%%%%%3.Recall (Recall or True positive rate) +% %%%%%%%%4.Specificity +% %%%%%%%%5.Precision +% %%%%%%%%6.FPR-False positive rate +% %%%%%%%%7.F_score +% %%%%%%%%8.MCC-Matthews correlation coefficient +% %%%%%%%%9.kappa-Cohen's kappa +% +% %%Original Developer Mr.Abbas Manthiri S +% %%Date 25-12-2016 +% %%Mail Id: abbasmanthiribe@gmail.com +% %%http://www.dataschool.io/simple-guide-to-confusion-matrix-terminology/ +% %%https://en.wikipedia.org/wiki/Confusion_matrix +% +% %%Modified by Preetham Manjunatha +% %%Date 02-03-2020 +% %%Note: Fixed Abbas written code where the NaN and Inf values were +% not considered while performaing the class average. +% +% % clc +% % clear all +% % close all +% % %%Multiclass or two class +% % [Result,RefereceResult] = multiclass_metrics(confMatrix) + + % Size of confusion matrix + [row,col]=size(confMatrix); + if row~=col + error('Confusion matrix dimention is wrong') + end + + % Number of classes + n_class=row; + + % Find TP, FN, FP and TN + switch n_class + case 2 + TP=confMatrix(1,1); + FN=confMatrix(1,2); + FP=confMatrix(2,1); + TN=confMatrix(2,2); + + otherwise + TP=zeros(1,n_class); + FN=zeros(1,n_class); + FP=zeros(1,n_class); + TN=zeros(1,n_class); + for i=1:n_class + TP(i)=confMatrix(i,i); + FN(i)=sum(confMatrix(i,:))-confMatrix(i,i); + FP(i)=sum(confMatrix(:,i))-confMatrix(i,i); + TN(i)=sum(confMatrix(:))-TP(i)-FP(i)-FN(i); + end + + end + + %% Calulations + %1.P-Positive + %2.N-Negative + %3.acuuracy + %4.error + %5.Recall (Recall or True positive rate) + %6.Specificity + %7.Precision + %8.FPR-False positive rate + %9.F_score + %10.MCC-Matthews correlation coefficient + %11.kappa-Cohen's kappa + P=TP+FN; + N=FP+TN; + switch n_class + case 2 + accuracy=(TP+TN)/(P+N); + Error=1-accuracy; + Result.Accuracy=(accuracy); + Result.Error=(Error); + otherwise + accuracy=(TP)./(P+N); + Error=(FP)./(P+N); + Result.Accuracy=sum(accuracy); + Result.Error=sum(Error); + end + + ReferenceResult.AccuracyOfSingle=(TP ./ P)'; + ReferenceResult.ErrorOfSingle=1-ReferenceResult.AccuracyOfSingle; + Recall=TP./P; + Specificity=TN./N; + Precision=TP./(TP+FP); + FPR=1-Specificity; + beta=1; + F1_score=( (1+(beta^2))*(Recall.*Precision) ) ./ ( (beta^2)*(Precision+Recall) ); + MCC=[( TP.*TN - FP.*FN ) ./ ( ( (TP+FP).*P.*N.*(TN+FN) ).^(0.5) );... + ( FP.*FN - TP.*TN ) ./ ( ( (TP+FP).*P.*N.*(TN+FN) ).^(0.5) )] ; + MCC=max(MCC); + + %Kappa Calculation BY 2x2 Matrix Shape + pox=sum(accuracy); + Px=sum(P);TPx=sum(TP);FPx=sum(FP);TNx=sum(TN);FNx=sum(FN);Nx=sum(N); + pex=( (Px.*(TPx+FPx))+(Nx.*(FNx+TNx)) ) ./ ( (TPx+TNx+FPx+FNx).^2 ); + kappa_overall=([( pox-pex ) ./ ( 1-pex );( pex-pox ) ./ ( 1-pox )]); + kappa_overall=max(kappa_overall); + + %Kappa Calculation BY n_class x n_class Matrix Shape + po=accuracy; + pe=( (P.*(TP+FP))+(N.*(FN+TN)) ) ./ ( (TP+TN+FP+FN).^2 ); + kappa=([( po-pe ) ./ ( 1-pe );( pe-po ) ./ ( 1-po )]); + kappa=max(kappa); + + + %% + %Output Struct for individual Classes + % RefereceResult.Class=class_ref; + ReferenceResult.AccuracyInTotal=accuracy'; + ReferenceResult.ErrorInTotal=Error'; + ReferenceResult.Recall=Recall'; + ReferenceResult.Specificity=Specificity'; + ReferenceResult.Precision=Precision'; + ReferenceResult.FalsePositiveRate=FPR'; + ReferenceResult.F1_score=F1_score'; + ReferenceResult.MatthewsCorrelationCoefficient=MCC'; + ReferenceResult.Kappa=kappa'; + ReferenceResult.TruePositive=TP'; + ReferenceResult.FalsePositive=FP'; + ReferenceResult.FalseNegative=FN'; + ReferenceResult.TrueNegative=TN'; + + % Remove NANs and INFs + stats = [Precision', Recall', F1_score', MCC']; + stats(any(isinf(stats),2),:) = 0; + stats(any(isnan(stats),2),:) = 0; + + %Output Struct for over all class lists + Result.Recall=mean(stats(:,2)); + Result.Specificity=mean(Specificity); + Result.Precision=mean(stats(:,1)); + Result.FalsePositiveRate=mean(FPR); + Result.F1_score=mean(stats(:,3)); + Result.MatthewsCorrelationCoefficient=mean(stats(:,4)); + Result.Kappa=kappa_overall; + +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/ring_integral.m b/3. Adversarial Example Detection/function/ring_integral.m new file mode 100644 index 0000000..da57ab6 --- /dev/null +++ b/3. Adversarial Example Detection/function/ring_integral.m @@ -0,0 +1,17 @@ +function [IM] =ring_integral(K,NB,M) +[Y,X]=meshgrid(1:K+1,1:K+1); +Rad = sqrt(X.^2+Y.^2); +LB=(max(Rad(:))-min(Rad(:)))/NB; +IM=zeros(1,NB); +M=M.*(Rad.^2); +for i=1:NB + minRad=(i-1)*LB; maxRad=(i)*LB; + PZ=(Rad>minRad)&(Rad<=maxRad); + temp=M(PZ); + IM(i)=sum(temp)/sum(PZ(:)); +% IM(i)=sum(temp); +end +% minRad=(60-1)*LB; maxRad=(80)*LB; +% PZ=(Rad>minRad)&(Rad<=maxRad); +% figure;imshow(PZ); +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/function/tight_subplot.m b/3. Adversarial Example Detection/function/tight_subplot.m new file mode 100644 index 0000000..55f3a8d --- /dev/null +++ b/3. Adversarial Example Detection/function/tight_subplot.m @@ -0,0 +1,62 @@ +function ha = tight_subplot(Nh, Nw, gap, marg_h, marg_w) + +% tight_subplot creates "subplot" axes with adjustable gaps and margins +% +% ha = tight_subplot(Nh, Nw, gap, marg_h, marg_w) +% +% in: Nh number of axes in hight (vertical direction) +% Nw number of axes in width (horizontaldirection) +% gap gaps between the axes in normalized units (0...1) +% or [gap_h gap_w] for different gaps in height and width +% marg_h margins in height in normalized units (0...1) +% or [lower upper] for different lower and upper margins +% marg_w margins in width in normalized units (0...1) +% or [left right] for different left and right margins +% +% out: ha array of handles of the axes objects +% starting from upper left corner, going row-wise as in +% going row-wise as in +% +% Example: ha = tight_subplot(3,2,[.01 .03],[.1 .01],[.01 .01]) +% for ii = 1:6; axes(ha(ii)); plot(randn(10,ii)); end +% set(ha(1:4),'XTickLabel',''); set(ha,'YTickLabel','') + +% Pekka Kumpulainen 20.6.2010 @tut.fi +% Tampere University of Technology / Automation Science and Engineering + + +if nargin<3; gap = .02; end +if nargin<4 || isempty(marg_h); marg_h = .05; end +if nargin<5; marg_w = .05; end + +if numel(gap)==1; + gap = [gap gap]; +end +if numel(marg_w)==1; + marg_w = [marg_w marg_w]; +end +if numel(marg_h)==1; + marg_h = [marg_h marg_h]; +end + +axh = (1-sum(marg_h)-(Nh-1)*gap(1))/Nh; +axw = (1-sum(marg_w)-(Nw-1)*gap(2))/Nw; + +py = 1-marg_h(2)-axh; + +ha = zeros(Nh*Nw,1); +ii = 0; +for ih = 1:Nh + px = marg_w(1); + + for ix = 1:Nw + ii = ii+1; + ha(ii) = axes('Units','normalized', ... + 'Position',[px py axw axh], ... + 'XTickLabel','', ... + 'YTickLabel',''); + px = px+axw+gap(2); + end + py = py-axh-gap(1); +end +end \ No newline at end of file diff --git a/3. Adversarial Example Detection/hierarchical_invariants.m b/3. Adversarial Example Detection/hierarchical_invariants.m new file mode 100644 index 0000000..83d9559 --- /dev/null +++ b/3. Adversarial Example Detection/hierarchical_invariants.m @@ -0,0 +1,89 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +param = struct(); +param.type_feat = 10; % type of feature as following: +% '1.ZM';'2.PZM';'3.OFMM';'4.CHFM';'5.PJFM';'6.JFM'; % Classical Jacobi polynomial based moments +% '7.RHFM';'8.EFM';'9.PCET';'10.PCT';'11.PST'; % Classical Harmonic function based moments +% '12.BFM'; % Classical Eigenfunction based moments +% '13.FJFM'; % Fractional-order Jacobi polynomial based moments +% '14.GRHFM';'15.GPCET';'16.GPCT';'17.GPST' % Fractional-order Harmonic function based moments +param.XNM = [0,0;... + 0,1;1,0;... + 0,2;1,1;2,0;... + 3,0;2,1;1,2;0,3;... + 4,0;3,1;2,2;1,3;0,4;... + 5,0;4,1;3,2;2,3;1,4;0,5;... + 6,0;5,1;4,2;3,3;2,4;1,5;0,6;... + 7,0;6,1;5,2;4,3;3,4;2,5;1,6;0,7]; % K = 7 all the n and m for the moments +param.alpha = 1; % parameter for fractional-order moments +param.p = 2; param.q = 2; % parameters for JFM and FJFM +param.scales = 10; % the scale +param.numofscale = size(param.scales,2); % number of scales +param.imgnorsize = 224; % image normaling size +param.imgpadsize = 0; % image pading size +param.binsize = 30; % number of bins for DCT band integration +param.featsize = 1000; % compressed feature size +%% Real and Fake Images +RealImds = imageDatastore(fullfile(pwd,'image\Real'),'IncludeSubFolders',true,'LabelSource','foldernames'); +FakeImds = imageDatastore(fullfile(pwd,'image\ALLIN'),'IncludeSubFolders',true,'LabelSource','foldernames'); +rng(100) +FakeImds = shuffle(FakeImds); +numofimages = 4980; % for ALLIN Fake set +% numofimages = length(FakeImds.Files); % for reset Fake sets +FakeImds = subset(FakeImds,1:numofimages); +Imds = imageDatastore(cat(1, RealImds.Files,FakeImds.Files)); +Imds.Labels = cat(1, RealImds.Labels, FakeImds.Labels); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Image Featuring with Hierarchical Invariants +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_hi(x,param),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_hi(x,param),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +idx = fscchi2(trainfeatures',trainImds.Labels); +shorttrainfeatures = trainfeatures(idx(1:param.featsize),:); +shorttestfeatures = testfeatures(idx(1:param.featsize),:); +Time = toc(t); +%% Image Classification with NN Model +NNmodel = fitcnet(shorttrainfeatures',trainImds.Labels); +predlabels = predict(NNmodel,shorttestfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Hierarchical Invariants, NN, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); +%% Image Classification with SVM Model +SVMmodel = fitcsvm(shorttrainfeatures',trainImds.Labels,'OptimizeHyperparameters','all','HyperparameterOptimizationOptions',struct('UseParallel',true)); +predlabels = predict(SVMmodel,shorttestfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Hierarchical Invariants, SVM, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); diff --git a/3. Adversarial Example Detection/scattering_network.m b/3. Adversarial Example Detection/scattering_network.m new file mode 100644 index 0000000..26e5476 --- /dev/null +++ b/3. Adversarial Example Detection/scattering_network.m @@ -0,0 +1,65 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +sf = waveletScattering2('ImageSize',[224 224],'InvarianceScale',200, ... + 'NumRotations',[8 8]); +%% Real and Fake Images +RealImds = imageDatastore(fullfile(pwd,'image\Real'),'IncludeSubFolders',true,'LabelSource','foldernames'); +FakeImds = imageDatastore(fullfile(pwd,'image\ALLIN'),'IncludeSubFolders',true,'LabelSource','foldernames'); +rng(100) +FakeImds = shuffle(FakeImds); +numofimages = 4980; % for ALLIN Fake set +% numofimages = length(FakeImds.Files); % for reset Fake sets +FakeImds = subset(FakeImds,1:numofimages); +Imds = imageDatastore(cat(1, RealImds.Files,FakeImds.Files)); +Imds.Labels = cat(1, RealImds.Labels, FakeImds.Labels); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Image Featuring with Wavelet Scattering +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_scattering(sf,x),Ttrain,'UniformOutput',false); +testfeatures = cellfun(@(x)feature_extraction_scattering(sf,x),Ttest,'UniformOutput',false); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Image Classification with NN Model +NNmodel = fitcnet(trainfeatures',trainImds.Labels); +predlabels = predict(NNmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Wavelet Scattering, NN, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); +%% Image Classification with SVM Model +SVMmodel = fitcsvm(trainfeatures',trainImds.Labels,'OptimizeHyperparameters','all','HyperparameterOptimizationOptions',struct('UseParallel',true)); +predlabels = predict(SVMmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Wavelet Scattering, SVM, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); \ No newline at end of file diff --git a/4. AIGC Detection/Krawtchouk_moments.m b/4. AIGC Detection/Krawtchouk_moments.m new file mode 100644 index 0000000..3efd6be --- /dev/null +++ b/4. AIGC Detection/Krawtchouk_moments.m @@ -0,0 +1,100 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +imgsize = 512; +K = 500; +P = [0.5,0.5;0.42,0.58;0.58,0.42]; +NP = size(P,1); +NB = 75; +BF = cell(NP,2); +SZI = [imgsize,imgsize]; +for i=1:NP + [BF_x,BF_y]=KM_BF(SZI,K,P(i,1),P(i,2)); + BF{i,1}=BF_x; BF{i,2}=BF_y; +end +%% Real and Fake Images +RealImds = imageDatastore(fullfile(pwd,'image\Real'),'IncludeSubFolders',true,'LabelSource','foldernames'); +FakeImds = imageDatastore(fullfile(pwd,'image\ALLIN'),'IncludeSubFolders',true,'LabelSource','foldernames'); +rng(100) +RealImds = shuffle(RealImds); +FakeImds = shuffle(FakeImds); +numofimages = 6000; % for ALLIN Fake set +% numofimages = length(FakeImds.Files); % for reset Fake sets +RealImds = subset(RealImds,1:numofimages); +FakeImds = subset(FakeImds,1:numofimages); +Imds = imageDatastore(cat(1, RealImds.Files,FakeImds.Files)); +Imds.Labels = cat(1, RealImds.Labels, FakeImds.Labels); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Image Featuring with KM +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_km(x,K,BF,NP,NB),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_km(x,K,BF,NP,NB),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Image Classification with NN Model +NNmodel = fitcnet(trainfeatures',trainImds.Labels); +predlabels = predict(NNmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['KM, NN, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); +%% Image Classification with SVM Model +SVMmodel = fitcsvm(trainfeatures',trainImds.Labels,'OptimizeHyperparameters','all','HyperparameterOptimizationOptions',struct('UseParallel',true)); +predlabels = predict(SVMmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['KM, SVM, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); +%% Image Classification under Orientation and Flipping Changes +testImds.ReadFcn = @(x)customreader_imgeo(x,imgsize); +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +Ttest = tall(testImds); +testfeatures = cellfun(@(x)feature_extraction_km(x,K,BF,NP,NB),Ttest,'Uni',0); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +predlabels = predict(SVMmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['KM, SVM, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); \ No newline at end of file diff --git a/4. AIGC Detection/convolutional_neural_network.m b/4. AIGC Detection/convolutional_neural_network.m new file mode 100644 index 0000000..2b0c8c0 --- /dev/null +++ b/4. AIGC Detection/convolutional_neural_network.m @@ -0,0 +1,141 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Real and Fake Images +imgsize = 224; +RealImds = imageDatastore(fullfile(pwd,'image\Real'),'IncludeSubFolders',true,'LabelSource','foldernames'); +FakeImds = imageDatastore(fullfile(pwd,'image\ALLIN'),'IncludeSubFolders',true,'LabelSource','foldernames'); +rng(100) +RealImds = shuffle(RealImds); +FakeImds = shuffle(FakeImds); +numofimages = 6000; % for ALLIN Fake set +% numofimages = length(FakeImds.Files); % for reset Fake sets +RealImds = subset(RealImds,1:numofimages); +FakeImds = subset(FakeImds,1:numofimages); +Imds = imageDatastore(cat(1, RealImds.Files,FakeImds.Files)); +Imds.Labels = cat(1, RealImds.Labels, FakeImds.Labels); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Image Featuring with CNN +trainImds.ReadFcn = @(x)customreader(x,imgsize); +testImds.ReadFcn = @(x)customreader(x,imgsize); +reset(trainImds); +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +%% --------simple CNN +layers = [ + imageInputLayer([imgsize,imgsize,3]) + convolution2dLayer(7,16) + batchNormalizationLayer + reluLayer + convolution2dLayer(3,20) + batchNormalizationLayer + reluLayer + maxPooling2dLayer(4) + fullyConnectedLayer(2) + softmaxLayer + classificationLayer]; +%% --------alexnet +% inputnet = alexnet; +% layersTransfer = inputnet.Layers(1:end-3); +% numClasses = numel(categories(trainImds.Labels)); +% layers = [ +% layersTransfer +% fullyConnectedLayer(numClasses) +% softmaxLayer +% classificationLayer]; +%% --------vgg16 +% inputnet = vgg16; +% layersTransfer = inputnet.Layers(1:end-3); +% numClasses = numel(categories(trainImds.Labels)); +% layers = [ +% layersTransfer +% fullyConnectedLayer(numClasses) +% softmaxLayer +% classificationLayer]; +%% --------googlenet +% layers = layerGraph(googlenet); +% numClasses = numel(categories(trainImds.Labels)); +% layers = replaceLayer(layers,'loss3-classifier',fullyConnectedLayer(numClasses)); +% layers = replaceLayer(layers,'prob',softmaxLayer); +% layers = replaceLayer(layers,'output',classificationLayer); +%% --------resnet50 +% layers = layerGraph(resnet50); +% numClasses = numel(categories(trainImds.Labels)); +% layers = replaceLayer(layers,'fc1000',fullyConnectedLayer(numClasses)); +% layers = replaceLayer(layers,'fc1000_softmax',softmaxLayer); +% layers = replaceLayer(layers,'ClassificationLayer_fc1000',classificationLayer); +%% --------densenet201 +% layers = layerGraph(densenet201); +% numClasses = numel(categories(trainImds.Labels)); +% layers = replaceLayer(layers,'fc1000',fullyConnectedLayer(numClasses)); +% layers = replaceLayer(layers,'fc1000_softmax',softmaxLayer); +% layers = replaceLayer(layers,'ClassificationLayer_fc1000',classificationLayer); +%% --------inceptionv3 +% layers = layerGraph(inceptionv3); +% numClasses = numel(categories(trainImds.Labels)); +% layers = replaceLayer(layers,'predictions',fullyConnectedLayer(numClasses)); +% layers = replaceLayer(layers,'predictions_softmax',softmaxLayer); +% layers = replaceLayer(layers,'ClassificationLayer_predictions',classificationLayer); +%% --------mobilenetv2 +% layers = layerGraph(mobilenetv2); +% numClasses = numel(categories(trainImds.Labels)); +% layers = replaceLayer(layers,'Logits',fullyConnectedLayer(numClasses)); +% layers = replaceLayer(layers,'Logits_softmax',softmaxLayer); +% layers = replaceLayer(layers,'ClassificationLayer_Logits',classificationLayer); +%% -------- +analyzeNetwork(layers); +options = trainingOptions('sgdm',... + 'InitialLearnRate',0.0001, ... + 'MaxEpochs',20, ... + 'MiniBatchSize',100,... + 'Shuffle','every-epoch',... + 'Plots', 'training-progress',... + 'Verbose',false,... + 'ExecutionEnvironment','gpu'); +t = tic; +net = trainNetwork(trainImds,layers,options); +Time = toc(t); +%% Image Classification with CNN Model +predlabels = classify(net,testImds,'ExecutionEnvironment','gpu'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['CNN, accuracy = ',num2str(Accuracy),'%']); +[avgmetrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +clc; +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([avgmetrics.Accuracy;avgmetrics.Recall;avgmetrics.Precision;avgmetrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Avg. metrics'})); +%% Image Classification under Orientation and Flipping Changes +testImds.ReadFcn = @(x)customreader_imgeo(x,imgsize); +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +predlabels = classify(net,testImds,'ExecutionEnvironment','gpu'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['CNN, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); \ No newline at end of file diff --git a/4. AIGC Detection/discrete_cosine_transform.m b/4. AIGC Detection/discrete_cosine_transform.m new file mode 100644 index 0000000..6c32eb4 --- /dev/null +++ b/4. AIGC Detection/discrete_cosine_transform.m @@ -0,0 +1,94 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +imgsize = 512; +NB = 90; +%% Real and Fake Images +RealImds = imageDatastore(fullfile(pwd,'image\Real'),'IncludeSubFolders',true,'LabelSource','foldernames'); +FakeImds = imageDatastore(fullfile(pwd,'image\ALLIN'),'IncludeSubFolders',true,'LabelSource','foldernames'); +rng(100) +RealImds = shuffle(RealImds); +FakeImds = shuffle(FakeImds); +numofimages = 6000; % for ALLIN Fake set +% numofimages = length(FakeImds.Files); % for reset Fake sets +RealImds = subset(RealImds,1:numofimages); +FakeImds = subset(FakeImds,1:numofimages); +Imds = imageDatastore(cat(1, RealImds.Files,FakeImds.Files)); +Imds.Labels = cat(1, RealImds.Labels, FakeImds.Labels); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Image Featuring with DCT +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_dct(x,NB),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_dct(x,NB),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Image Classification with NN Model +NNmodel = fitcnet(trainfeatures',trainImds.Labels); +predlabels = predict(NNmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DCT, NN, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); +NNmetcrics = [metrics.Precision,metrics.Recall,metrics.F1_score]*100; +%% Image Classification with SVM Model +SVMmodel = fitcsvm(trainfeatures',trainImds.Labels,'OptimizeHyperparameters','all','HyperparameterOptimizationOptions',struct('UseParallel',true)); +predlabels = predict(SVMmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DCT, SVM, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); +SVMmetcrics = [metrics.Precision,metrics.Recall,metrics.F1_score]*100; +ALLmetcrics = [NNmetcrics;SVMmetcrics]; +%% Image Classification under Orientation and Flipping Changes +testImds.ReadFcn = @(x)customreader_imgeo(x,imgsize); +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +Ttest = tall(testImds); +testfeatures = cellfun(@(x)feature_extraction_dct(x,NB),Ttest,'Uni',0); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +predlabels = predict(SVMmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DCT, SVM, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); \ No newline at end of file diff --git a/4. AIGC Detection/discrete_wavelet_transform.m b/4. AIGC Detection/discrete_wavelet_transform.m new file mode 100644 index 0000000..9f62ffb --- /dev/null +++ b/4. AIGC Detection/discrete_wavelet_transform.m @@ -0,0 +1,95 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +imgsize = 512; +NB = 45; +NF = 4*NB; +%% Real and Fake Images +RealImds = imageDatastore(fullfile(pwd,'image\Real'),'IncludeSubFolders',true,'LabelSource','foldernames'); +FakeImds = imageDatastore(fullfile(pwd,'image\ALLIN'),'IncludeSubFolders',true,'LabelSource','foldernames'); +rng(100) +RealImds = shuffle(RealImds); +FakeImds = shuffle(FakeImds); +numofimages = 6000; % for ALLIN Fake set +% numofimages = length(FakeImds.Files); % for reset Fake sets +RealImds = subset(RealImds,1:numofimages); +FakeImds = subset(FakeImds,1:numofimages); +Imds = imageDatastore(cat(1, RealImds.Files,FakeImds.Files)); +Imds.Labels = cat(1, RealImds.Labels, FakeImds.Labels); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Image Featuring with DWT +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_dwt(x,NB,NF),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_dwt(x,NB,NF),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Image Classification with NN Model +NNmodel = fitcnet(trainfeatures',trainImds.Labels); +predlabels = predict(NNmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DWT, NN, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); +NNmetcrics = [metrics.Precision,metrics.Recall,metrics.F1_score]*100; +%% Image Classification with SVM Model +SVMmodel = fitcsvm(trainfeatures',trainImds.Labels,'OptimizeHyperparameters','all','HyperparameterOptimizationOptions',struct('UseParallel',true)); +predlabels = predict(SVMmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DWT, SVM, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); +SVMmetcrics = [metrics.Precision,metrics.Recall,metrics.F1_score]*100; +ALLmetcrics = [NNmetcrics;SVMmetcrics]; +%% Image Classification under Orientation and Flipping Changes +testImds.ReadFcn = @(x)customreader_imgeo(x,imgsize); +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +Ttest = tall(testImds); +testfeatures = cellfun(@(x)feature_extraction_dwt(x,NB,NF),Ttest,'Uni',0); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +predlabels = predict(SVMmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['DWT, SVM, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); \ No newline at end of file diff --git a/4. AIGC Detection/function/DIR.m b/4. AIGC Detection/function/DIR.m new file mode 100644 index 0000000..9a59f4c --- /dev/null +++ b/4. AIGC Detection/function/DIR.m @@ -0,0 +1,49 @@ +function [featcell,time] = DIR(img,param) +%% input +if size(img,3) ~= 1 + img = rgb2gray(img); +end +img = double(img); +timestamp = tic; +%% get basis function data +bfdatacell = cell(1,param.numofscale); +for ns = 1:1:param.numofscale + sizeofbf = param.scales(ns); + if mod(sizeofbf,2) == 1 + sizeofbf = sizeofbf - 1; + end + if param.type_feat == 1 || param.type_feat == 2 + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.ZNM,param.alpha, param.p, param.q); + elseif param.type_feat == 11 || param.type_feat == 17 + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.SNM,param.alpha, param.p, param.q); + else + bfdatacell{ns} = getBF(param.type_feat,sizeofbf,param.NM,param.alpha, param.p, param.q); + end +end +%% naive feature generation +% raggioU = ceil((sizeofbf-1)/2); +% raggioL = floor((sizeofbf-1)/2); +% featcell = cell(1,param.numofscale); +% for ns = 1:1:param.numofscale +% featcell{ns} = abs(bf_filter(img, bfdatacell{ns})); +% featcell{ns} = featcell{ns}((1+raggioU):(end-raggioL),(1+raggioU):(end-raggioL),:); +% end +%% fast feature generation by FFT (Convolution Theorem) +featcell = cell(1,param.numofscale); +fft_img = fft2(img); +nof = size(bfdatacell{1},3); +fft_img_cell = single(zeros([size(img), nof])); +for i = 1:1:nof + fft_img_cell(:,:,i) = fft_img; +end +featcell{param.numofscale} = abs(bf_filter_fft(img, fft_img_cell, bfdatacell{param.numofscale})); +unisize = size (featcell{param.numofscale}); +for ns = 1:1:param.numofscale-1 + temp = abs(bf_filter_fft(img, fft_img_cell, bfdatacell{ns})); + rr = (size(temp)-unisize)/2; + featcell{ns} = temp ((1+rr(1)):(end-rr(1)),(1+rr(2)):(end-rr(2)),:); +end +%% output +clc; +time = toc(timestamp); +end \ No newline at end of file diff --git a/4. AIGC Detection/function/HI.m b/4. AIGC Detection/function/HI.m new file mode 100644 index 0000000..dbcb699 --- /dev/null +++ b/4. AIGC Detection/function/HI.m @@ -0,0 +1,32 @@ +function [ord,featcell] = HI(img,param) +K = max(max(param.XNM)); +idx = 1; +featcell = cell(1,1); +ord = zeros(1,1); +for x = 0:K + if x == 0 + param.NM = param.XNM(1,:); + [feat,~] = DIR(img,param); + featcell(1)=feat; + ord(1)=x; + else + param.NM = param.XNM(idx:idx+x,:); + inputfeat=img; + [feat,~] = DIR(inputfeat,param); + for z=1:size(feat{1},3) + featcell = [featcell, {feat{1}(:,:,z)}]; + ord =[ord, x]; + end + for y = idx-x:idx-1 + param.NM = param.XNM(idx:idx+x,:); + inputfeat=featcell{y}; + [feat,~] = DIR(inputfeat,param); + for z=1:size(feat{1},3) + featcell = [featcell, {feat{1}(:,:,z)}]; + ord =[ord, x]; + end + end + end + idx=idx+x+1; +end +end \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/KM_BF.m b/4. AIGC Detection/function/MOMENT/KM_BF.m new file mode 100644 index 0000000..cb61b3c --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/KM_BF.m @@ -0,0 +1,52 @@ +function [BF_x,BF_y] = KM_BF(SZI,K,P_x,P_y) +N = SZI(1); +x = 0:1:N-1; +BF_x=zeros(K+1,N); +W=zeros(1,N); +W(1,1)=(1-P_x)^N; %xy=0 +for i=1:N-1 %xy=0:1:N-2 + xy=i-1; + W(i+1)=((N-xy)/(xy+1))*(P_x/(1-P_x))*W(i); +end +if K>=2 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); + for n=3:1:K+1 + order=n-1; + A = (N*P_x+(order-1)*(1-2*P_x)-x)/sqrt(P_x*(1-P_x)*order*(N-n+2)); + B = sqrt((order-1)*(N-order+2)/(order*(N-order+1))); + BF_x(n,:)=A.*BF_x(n-1,:)-B.*BF_x(n-2,:); + end +elseif K==1 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); +elseif K==0 + BF_x(1,:)=sqrt(W); +end + +M = SZI(2); +y = 0:1:M-1; +BF_y=zeros(K+1,M); +W=zeros(1,M); +W(1,1)=(1-P_y)^M; %xy=0 +for i=1:M-1 %xy=0:1:M-2 + xy=i-1; + W(i+1)=((M-xy)/(xy+1))*(P_y/(1-P_y))*W(i); +end +if K>=2 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); + for n=3:1:K+1 + order=n-1; + A = (M*P_y+(order-1)*(1-2*P_y)-y)/sqrt(P_y*(1-P_y)*order*(M-n+2)); + B = sqrt((order-1)*(M-order+2)/(order*(M-order+1))); + BF_y(n,:)=A.*BF_y(n-1,:)-B.*BF_y(n-2,:); + end +elseif K==1 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); +elseif K==0 + BF_y(1,:)=sqrt(W); +end +% X=BF_y*double(img)*BF_x'; +end \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/KM_D.m b/4. AIGC Detection/function/MOMENT/KM_D.m new file mode 100644 index 0000000..c0f7b03 --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/KM_D.m @@ -0,0 +1,52 @@ +function [X] = KM_D(I,K,P_x,P_y) +N = size(I,1); +x = 0:1:N-1; +BF_x=zeros(K+1,N); +W=zeros(1,N); +W(1,1)=(1-P_x)^N; %xy=0 +for i=1:N-1 %xy=0:1:N-2 + xy=i-1; + W(i+1)=((N-xy)/(xy+1))*(P_x/(1-P_x))*W(i); +end +if K>=2 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); + for n=3:1:K+1 + order=n-1; + A = (N*P_x+(order-1)*(1-2*P_x)-x)/sqrt(P_x*(1-P_x)*order*(N-n+2)); + B = sqrt((order-1)*(N-order+2)/(order*(N-order+1))); + BF_x(n,:)=A.*BF_x(n-1,:)-B.*BF_x(n-2,:); + end +elseif K==1 + BF_x(1,:)=sqrt(W); + BF_x(2,:)=((P_x*N-x)/sqrt(P_x*(1-P_x)*N)).*BF_x(1,:); +elseif K==0 + BF_x(1,:)=sqrt(W); +end + +M = size(I,2); +y = 0:1:M-1; +BF_y=zeros(K+1,M); +W=zeros(1,M); +W(1,1)=(1-P_y)^M; %xy=0 +for i=1:M-1 %xy=0:1:M-2 + xy=i-1; + W(i+1)=((M-xy)/(xy+1))*(P_y/(1-P_y))*W(i); +end +if K>=2 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); + for n=3:1:K+1 + order=n-1; + A = (M*P_y+(order-1)*(1-2*P_y)-y)/sqrt(P_y*(1-P_y)*order*(M-n+2)); + B = sqrt((order-1)*(M-order+2)/(order*(M-order+1))); + BF_y(n,:)=A.*BF_y(n-1,:)-B.*BF_y(n-2,:); + end +elseif K==1 + BF_y(1,:)=sqrt(W); + BF_y(2,:)=((P_y*M-y)/sqrt(P_y*(1-P_y)*M)).*BF_y(1,:); +elseif K==0 + BF_y(1,:)=sqrt(W); +end +X=BF_y*double(I)*BF_x'; +end \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/getBF.m b/4. AIGC Detection/function/MOMENT/getBF.m new file mode 100644 index 0000000..e8c5291 --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getBF.m @@ -0,0 +1,161 @@ +function [BF]=getBF(MODE,SZ,NM,alpha,p,q) +[rho,theta]=ro(SZ,SZ); +pz=rho>1; cnt=sum(pz(:));rho(pz)= 0.5; +L=size(NM,1); +BF=zeros(SZ,SZ,L); +%% ZM +if MODE==1 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getZM_RBF(order,repetition,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PZM +elseif MODE==2 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPZM_RBF(order,repetition,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% OFMM +elseif MODE==3 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getOFMM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% CHFM +elseif MODE==4 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getCHFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PJFM +elseif MODE==5 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPJFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% JFM +elseif MODE==6 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getJFM_RBF(order,rho,p,q); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% RHFM +elseif MODE==7 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getRHFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% EFM +elseif MODE==8 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getEFM_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PCET +elseif MODE==9 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPCET_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PCT +elseif MODE==10 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPCT_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% PST +elseif MODE==11 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getPST_RBF(order,rho); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% BFM +elseif MODE==12 + v=1; + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getBFM_RBF(order,rho,v); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% FJFM +elseif MODE==13 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getFJFM_RBF(order,rho,p,q,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GRHFM +elseif MODE==14 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGRHFM_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPCET +elseif MODE==15 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPCET_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPCT +elseif MODE==16 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPCT_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +%% GPST +elseif MODE==17 + for index =1:1:L + order = NM(index,1); repetition = NM(index,2); + R=getGPST_RBF(order,rho,alpha); + pupil =R.*exp(-1j*repetition * theta); + pupil(pz) = 0; + BF(:,:,index)=(1/cnt).*pupil; + end +end + diff --git a/4. AIGC Detection/function/MOMENT/getBFM_RBF.m b/4. AIGC Detection/function/MOMENT/getBFM_RBF.m new file mode 100644 index 0000000..7e78f83 --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getBFM_RBF.m @@ -0,0 +1,17 @@ +%% REF +% Xiao B, Ma J, Wang X. Image analysis by Bessel¨CFourier moments. Pattern Recognition, 2010, 43(8): 2620-2629. +function [output] = getBFM_RBF(order,rho,v) +Roots=zeros(1,max(order)+2); +syms x; +Roots(1,1)=vpasolve(besselj(v, x) == 0, x); +for i=2:1:max(order)+2 + ST=Roots(1,i-1)+3; + Roots(1,i)=vpasolve(besselj(v, x) == 0, ST); +end +% obtain the order and repetition +n = order; +% compute the radial polynomial +rho=rho*Roots(n+2); +output=besselj(v,rho); +output=output*sqrt((1/(pi*(besselj(v+1,Roots(order+2)))^2))); +end % end getRadialPoly method \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/getCHFM_RBF.m b/4. AIGC Detection/function/MOMENT/getCHFM_RBF.m new file mode 100644 index 0000000..cf6a8bc --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getCHFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +%¡¡Ping Z, Wu R, Sheng Y. Image description with Chebyshev¨CFourier moments. Journal of the Optical Society of America A, 2002, 19(9): 1748-1754. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getCHFM_RBF(order,rho) +% obtain the order +n = order; +p = 2; q = 1.5; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/getEFM_RBF.m b/4. AIGC Detection/function/MOMENT/getEFM_RBF.m new file mode 100644 index 0000000..e60c98f --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getEFM_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hu H, Zhang Y, Shao C, et al. Orthogonal moments based on exponent functions: Exponent-Fourier moments. Pattern Recognition, 2014, 47(8): 2596-2606. +function [output] = getEFM_RBF(order,rho) +% compute the radial polynomial +output=sqrt(rho.^(-1)).*exp(1j*2*pi*order.*rho); +end \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/getFJFM_RBF.m b/4. AIGC Detection/function/MOMENT/getFJFM_RBF.m new file mode 100644 index 0000000..a9d3022 --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getFJFM_RBF.m @@ -0,0 +1,38 @@ +%% REF +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getFJFM_RBF(order,rho,p,q,alpha) +% obtain the order +n = order; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/getGPCET_RBF.m b/4. AIGC Detection/function/MOMENT/getGPCET_RBF.m new file mode 100644 index 0000000..b2dd435 --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getGPCET_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPCET_RBF(order,rho,alpha) +% compute the radial polynomial +output=sqrt(alpha*rho.^(alpha-2)).*exp(1j*2*pi*order.*(rho.^alpha)); +end % end getRadialPoly method diff --git a/4. AIGC Detection/function/MOMENT/getGPCT_RBF.m b/4. AIGC Detection/function/MOMENT/getGPCT_RBF.m new file mode 100644 index 0000000..27b2420 --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getGPCT_RBF.m @@ -0,0 +1,10 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPCT_RBF(order,rho,alpha) +% compute the radial polynomial +if order==0 + output=sqrt(alpha*rho.^(alpha-2)); +else + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*cos(pi*order.*rho.^alpha); +end +end \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/getGPST_RBF.m b/4. AIGC Detection/function/MOMENT/getGPST_RBF.m new file mode 100644 index 0000000..ef8c6d0 --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getGPST_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGPST_RBF(order,rho,alpha) +% compute the radial polynomial +output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*sin(pi*order.*rho.^alpha); +end % end getRadialPoly method diff --git a/4. AIGC Detection/function/MOMENT/getGRHFM_RBF.m b/4. AIGC Detection/function/MOMENT/getGRHFM_RBF.m new file mode 100644 index 0000000..f40ccf5 --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getGRHFM_RBF.m @@ -0,0 +1,12 @@ +%% REF +% Hoang T V, Tabbone S. Generic polar harmonic transforms for invariant image representation. Image and Vision Computing, 2014, 32(8): 497-509. +function [output] = getGRHFM_RBF(order,rho,alpha) +% compute the radial polynomial +if order==0 + output=sqrt(alpha*rho.^(alpha-2)); +elseif mod(order,2)==1 + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*sin(pi*(order+1).*rho.^alpha); +else + output=sqrt(alpha*rho.^(alpha-2)).*sqrt(2).*cos(pi*order.*rho.^alpha); +end +end % end getRadialPoly method \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/getJFM_RBF.m b/4. AIGC Detection/function/MOMENT/getJFM_RBF.m new file mode 100644 index 0000000..b7103d3 --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getJFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +% Ping Z, Ren H, Zou J, et al. Generic orthogonal moments: Jacobi¨CFourier moments for invariant image description. Pattern Recognition, 2007, 40(4): 1245-1254. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getJFM_RBF(order,rho,p,q) +% obtain the order +n = order; +alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/getOFMM_RBF.m b/4. AIGC Detection/function/MOMENT/getOFMM_RBF.m new file mode 100644 index 0000000..4c2fe59 --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getOFMM_RBF.m @@ -0,0 +1,41 @@ +%% REF +% Sheng Y, Shen L. Orthogonal Fourier-Mellin moments for invariant pattern recognition. Journal of the Optical Society of America A, 1994, 11(6): 1748-1757. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getOFMM_RBF(order,rho) +% obtain the order +n = order; +p = 2; q = 2; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; + +end % end getRadialPoly method \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/getPCET_RBF.m b/4. AIGC Detection/function/MOMENT/getPCET_RBF.m new file mode 100644 index 0000000..7700dd6 --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getPCET_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPCET_RBF(order,rho) +% compute the radial polynomial +output=exp(1j*2*pi*order.*rho.^2); +end \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/getPCT_RBF.m b/4. AIGC Detection/function/MOMENT/getPCT_RBF.m new file mode 100644 index 0000000..b67c9c3 --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getPCT_RBF.m @@ -0,0 +1,10 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPCT_RBF(order,rho) +% compute the radial polynomial +if order==0 + output=rho.^0; +else + output=sqrt(2).*cos(pi*order.*rho.^2); +end +end \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/getPJFM_RBF.m b/4. AIGC Detection/function/MOMENT/getPJFM_RBF.m new file mode 100644 index 0000000..4b87097 --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getPJFM_RBF.m @@ -0,0 +1,40 @@ +%% REF +%¡¡Amu G, Hasi S, Yang X, et al. Image analysis by pseudo-Jacobi (p=4, q=3)¨CFourier moments. Applied Optics, 2004, 43(10): 2093-2101. +% H. Yang, S. Qi, J. Tian, P. Niu, X. Wang, Robust and discriminative image representation: Fractional-order Jacobi-Fourier moments, Pattern Recognition. +function [output] = getPJFM_RBF(order,rho) +% obtain the order +n = order; +p = 4; q = 3; alpha = 1; +% PN +if n>=2 + P0=(gamma(p)/gamma(q))*ones(size(rho)); + P1=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); + PN1=P1;PN2=P0; + for k = 2:n + L1=-((2*k+p-1)*(2*k+p-2))/(k*(q+k-1)); + L2=(p+2*k-2)+(((k-1)*(q+k-2)*L1)/(p+2*k-3)); + L3=((p+2*k-4)*(p+2*k-3)/2)+((q+k-3)*(k-2)*L1/2)-((p+2*k-4)*L2); + PN=(L1*(rho.^alpha)+L2).*PN1+L3.*PN2; + PN2=PN1; + PN1=PN; + end +elseif n==1 + PN=(gamma(p+1)/gamma(q))*(1-((p+1)/q)*(rho.^alpha)); +elseif n==0 + PN=(gamma(p)/gamma(q))*ones(size(rho)); +end + +%AN +if n>=1 + A0=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); + AN1=A0; + for k = 1:n + AN=sqrt(k*(q+k-1)/((p+k-1)*(p-q+k)))*AN1; + AN1=AN; + end +elseif n==0 + AN=sqrt(gamma(q)/(gamma(p)*gamma(p-q+1))); +end + +output=sqrt((p+2*n)*alpha*((1-rho.^alpha).^(p-q)).*(rho.^(alpha*q-1))./rho)*AN.*PN; +end % end getRadialPoly method \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/getPST_RBF.m b/4. AIGC Detection/function/MOMENT/getPST_RBF.m new file mode 100644 index 0000000..e71350c --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getPST_RBF.m @@ -0,0 +1,6 @@ +%% REF +% Yap P T, Jiang X, Kot A C. Two-dimensional polar harmonic transforms for invariant image representation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009, 32(7): 1259-1270. +function [output] = getPST_RBF(order,rho) +% compute the radial polynomial +output=sqrt(2).*sin(pi*order.*rho.^2); +end \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/getPZM_RBF.m b/4. AIGC Detection/function/MOMENT/getPZM_RBF.m new file mode 100644 index 0000000..68e7305 --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getPZM_RBF.m @@ -0,0 +1,44 @@ +%% REF +% Teh C H, Chin R T. On image analysis by the methods of moments. IEEE Transactions on Pattern Analysis and Machine Intelligence, 1988, 10(4): 496-513. +% Al-Rawi M S. Fast computation of pseudo Zernike moments. Journal of Real-Time Image Processing, 2010, 5(1): 3-10. +function [output] = getPZM_RBF(order,repetition,rho) +N=size(rho,1); M=size(rho,2); +repetition=abs(repetition); +rho=rho(:); +output = zeros(order+1, length(rho) ); +if rho==0 + if repetition==0 + output( (0:order)+1,:)= 1; + else + output( (0:order)+1,:) = 0; + end + output=reshape(output,N,M); + return; +end +q=repetition; p = order; +output(q +1,:) = rho.^q; +if q==p + output=output(end,:); + output=reshape(output,N,M); + return; +end +if q == p-1 + Rpp=rho.^p; + output(p +1,:)=(2*p+1)*Rpp - 2*p*rho.^q; + output=output(end,:); + output=reshape(output,N,M); + return; +end +p=q+1; +Rpp=rho.^p; +output(p +1,:)=(2*p+1)*Rpp - 2*p*rho.^q; +q2=q+2; +for p = q2:order + L1 = ((2*p+1)*2*p)/((p+q +1.0)*(p-q)); + L2 = -2*p + L1*((p+q)*(p-q-1))/(2.0*p-1); + L3 = (2*p-1)*(p-1)- L1*(p+q-1)*(p-q-2)/2.0 + 2*(p-1)*L2; + output(p +1,:) = (L1*rho+L2)'.*output(p-1 +1,:) + L3*output(p-2 +1,:); +end +output=output(end,:); +output=reshape(output,N,M); +end \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/getRHFM_RBF.m b/4. AIGC Detection/function/MOMENT/getRHFM_RBF.m new file mode 100644 index 0000000..2a59186 --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getRHFM_RBF.m @@ -0,0 +1,12 @@ +%% REF +% Ren H, Ping Z, Bo W, et al. Multidistortion-invariant image recognition with radial harmonic Fourier moments. Journal of the Optical Society of America A, 2003, 20(4): 631-637. +function [output] = getRHFM_RBF(order,rho) +% compute the radial polynomial +if order==0 + output=sqrt(rho.^(-1)); +elseif mod(order,2)==1 + output=sqrt(rho.^(-1)).*sqrt(2).*sin(pi*(order+1).*rho); +else + output=sqrt(rho.^(-1)).*sqrt(2).*cos(pi*order.*rho); +end +end \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/getZM_RBF.m b/4. AIGC Detection/function/MOMENT/getZM_RBF.m new file mode 100644 index 0000000..e9e5f7f --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/getZM_RBF.m @@ -0,0 +1,48 @@ +%% REF +% Teague M R. Image analysis via the general theory of moments. Journal of the Optical Society of America, 1980, 70(8): 920-930. +% Chong C W, Raveendran P, Mukundan R. A comparative analysis of algorithms for fast computation of Zernike moments. Pattern Recognition, 2003, 36(3): 731-742. +function [output] = getZM_RBF(order,repetition,rho) +rr = rho.^2; +for p=0:1:order+1 + q = p-4; + while q>= 0 + H3mn(p+1,q+1) = -(4*(q + 2)*(q + 1))/((p+q+2)*(p-q)); + H2mn(p+1,q+1) = H3mn(p+1,q+1)*(p+q+4)*(p-q-2)/(4*(q+3))+(q+2); + H1mn(p+1,q+1) = (q+4)*(q+3)/2-H2mn(p+1,q+1)*(q+4)+H3mn(p+1,q+1)*(p+q+6)*(p-q-4)/8; + q = q-2; + end +end + +for p=0:1:order+1 + q = p; + Rn = rho.^p; + if p>1 + Rnm2 = rho.^(p-2); + end + while q>= 0 + if q == p + Rnm = Rn; + Rnmp4 = Rn; + elseif q == p-2 + Rnnm2 = p.*Rn-(p-1).*Rnm2; + Rnm = Rnnm2; + Rnmp2 = Rnnm2; + else + H3 = H3mn(p+1,q+1); + H2 = H2mn(p+1,q+1); + H1 = H1mn(p+1,q+1); + Rnm = H1.*Rnmp4+(H2+H3./rr).*Rnmp2; + Rnmp4 = Rnmp2; + Rnmp2 = Rnm; + end + if p == order && q == abs(repetition) + output = Rnm; + break; + end + q = q-2; + end + if p == order && q == abs(repetition) + break; + end +end +end \ No newline at end of file diff --git a/4. AIGC Detection/function/MOMENT/ro.m b/4. AIGC Detection/function/MOMENT/ro.m new file mode 100644 index 0000000..17021fc --- /dev/null +++ b/4. AIGC Detection/function/MOMENT/ro.m @@ -0,0 +1,36 @@ +function [r,o] = ro(n,m) +r = zeros(n,m); +o = zeros(n,m); +R = max((n-1)/2,(m-1)/2); +for x = 1:n + for y = 1:m + xx = x-1; + yy = y-1; + if (xx<=(n-1)/2) && (yy>=(m-1)/2) + p = yy-(m-1)/2; + q = (n-1)/2-xx; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = asin(q/sqrt(p^2+q^2)); + elseif (xx<=(n-1)/2) && (yy<(m-1)/2) + p = (m-1)/2-yy; + q = (n-1)/2-xx; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = pi-asin(q/sqrt(p^2+q^2)); + elseif (xx>(n-1)/2) && (yy<=(m-1)/2) + p = (m-1)/2-yy; + q = xx-(n-1)/2; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = pi+asin(q/sqrt(p^2+q^2)); + elseif (xx>(n-1)/2) && (yy>(m-1)/2) + p = yy-(m-1)/2; + q = xx-(n-1)/2; + r(x,y) = sqrt(p^2+q^2)/R; + o(x,y) = 2*pi-asin(q/sqrt(p^2+q^2)); + end + if r(x,y)==0 + o(x,y) = 0; + elseif r(x,y)>1 + r(x,y) = 10000; + end + end +end diff --git a/4. AIGC Detection/function/PCAClassifier.m b/4. AIGC Detection/function/PCAClassifier.m new file mode 100644 index 0000000..0450061 --- /dev/null +++ b/4. AIGC Detection/function/PCAClassifier.m @@ -0,0 +1,50 @@ +function labels =PCAClassifier(features,model) +% This function is only to support wavelet image scattering examples in +% Wavelet Toolbox. It may change or be removed in a future release. +% model is a structure array with fields, M, mu, v, and Labels +% features is the matrix of test data which is Ns-by-L, Ns is the number of +% scattering paths and L is the number of test examples. Each column of +% features is a test example. + +% Copyright 2018 MathWorks + +labelIdx = determineClass(features,model); +labels = model.Labels(labelIdx); +% Returns as column vector to agree with imageDatastore Labels +labels = labels(:); + + +%-------------------------------------------------------------------------- +function labelIdx = determineClass(features,model) +% Determine number of classes +Nclasses = numel(model.Labels); +% Initialize error matrix +errMatrix = Inf(Nclasses,size(features,2)); +for nc = 1:Nclasses + % class centroid + mu = model.mu{nc}; + u = model.U{nc}; + % 1-by-L + errMatrix(nc,:) = projectionError(features,mu,u); +end +% Determine minimum along class dimension +[~,labelIdx] = min(errMatrix,[],1); + + +%-------------------------------------------------------------------------- +function totalerr = projectionError(features,mu,u) + % + Npc = size(u,2); + L = size(features,2); + % Subtract class mean: Ns-by-L minus Ns-by-1 + s = features-mu; + % 1-by-L + normSqX = sum(abs(s).^2,1)'; + err = Inf(Npc+1,L); + err(1,:) = normSqX; + err(2:end,:) = -abs(u'*s).^2; + % 1-by-L + totalerr = sqrt(sum(err,1)); +end +end +end \ No newline at end of file diff --git a/4. AIGC Detection/function/PCAModel.m b/4. AIGC Detection/function/PCAModel.m new file mode 100644 index 0000000..e62c4dd --- /dev/null +++ b/4. AIGC Detection/function/PCAModel.m @@ -0,0 +1,47 @@ +function model = PCAModel(features,M,Labels) +% This function is only to support wavelet image scattering examples in +% Wavelet Toolbox. It may change or be removed in a future release. +% model = helperPCAModel(features,M,Labels) + +% Copyright 2018 MathWorks + +% Initialize structure array to hold the affine model +model = struct('Dim',[],'mu',[],'U',[],'Labels',categorical([]),'s',[]); +model.Dim = M; +% Obtain the number of classes +LabelCategories = categories(Labels); +Nclasses = numel(categories(Labels)); +for kk = 1:Nclasses + Class = LabelCategories{kk}; + % Find indices corresponding to each class + idxClass = Labels == Class; + % Extract feature vectors for each class + tmpFeatures = features(:,idxClass); + % Determine the mean for each class + model.mu{kk} = mean(tmpFeatures,2); + [model.U{kk},model.S{kk}] = scatPCA(tmpFeatures); + if size(model.U{kk},2) > M + model.U{kk} = model.U{kk}(:,1:M); + model.S{kk} = model.S{kk}(1:M); + + end + model.Labels(kk) = Class; +end + +function [u,s,v] = scatPCA(x,M) + % Calculate the principal components of x along the second dimension. + + if nargin > 1 && M > 0 + % If M is non-zero, calculate the first M principal components. + [u,s,v] = svds(x-sig_mean(x),M); + s = abs(diag(s)/sqrt(size(x,2)-1)).^2; + else + % Otherwise, calculate all the principal components. + % Each row is an observation, i.e. the number of scattering paths + % Each column is a class observation + [u,d] = eig(cov(x')); + [s,ind] = sort(diag(d),'descend'); + u = u(:,ind); + end +end +end \ No newline at end of file diff --git a/4. AIGC Detection/function/bf_filter.m b/4. AIGC Detection/function/bf_filter.m new file mode 100644 index 0000000..9888e0f --- /dev/null +++ b/4. AIGC Detection/function/bf_filter.m @@ -0,0 +1,17 @@ +function y = bf_filter(x,bfdata) +% filtering bank +% y = bf_filter(x,bfdata) +% +% x is a 2d matrix +% bfdata is the filter bank, it is a structure with the following elements: +% .number number of filters, +% .bf a 3d matrix with the filters, +% .factor factor of the filters. +% + + len = size(bfdata,3); + y = zeros(cat(2,size(x),len)); + for index = 1:len + y(:,:,index) = imfilter(x, conj(bfdata(:,:,index))); + end +end diff --git a/4. AIGC Detection/function/bf_filter_fft.m b/4. AIGC Detection/function/bf_filter_fft.m new file mode 100644 index 0000000..67dc4a3 --- /dev/null +++ b/4. AIGC Detection/function/bf_filter_fft.m @@ -0,0 +1,13 @@ +function y = bf_filter_fft(x,fft_x,bfdata) + + len = size(bfdata,3); + bf = flip(flip(conj(bfdata),1),2); + pbf = single(zeros([size(x),len])); + pbf(1:size(bf,1),1:size(bf,2),:) = bf; + y = ifft2(fft2(pbf).*fft_x); + y = y(size(bf,1):end,size(bf,2):end,:); + +end + + + diff --git a/4. AIGC Detection/function/bf_filter_fft_scale.m b/4. AIGC Detection/function/bf_filter_fft_scale.m new file mode 100644 index 0000000..c0a662b --- /dev/null +++ b/4. AIGC Detection/function/bf_filter_fft_scale.m @@ -0,0 +1,6 @@ +function y = bf_filter_fft_scale(fft_x,fft_pbf_cell,bfdata) + + y = ifft2(single(fft_pbf_cell).*single(fft_x)); + y = y(size(bfdata,1):end,size(bfdata,2):end,:); + +end \ No newline at end of file diff --git a/4. AIGC Detection/function/customreader.m b/4. AIGC Detection/function/customreader.m new file mode 100644 index 0000000..51bf1c7 --- /dev/null +++ b/4. AIGC Detection/function/customreader.m @@ -0,0 +1,9 @@ +function data = customreader(filename,imgsize) +onState = warning('off', 'backtrace'); +c = onCleanup(@() warning(onState)); +data = imread(filename); +data = imresize(data,'OutputSize',[imgsize,imgsize]); +if size(data,3) == 1 + data = repmat(data,[1 1 3]); +end +end \ No newline at end of file diff --git a/4. AIGC Detection/function/customreader_imgeo.m b/4. AIGC Detection/function/customreader_imgeo.m new file mode 100644 index 0000000..218fbbe --- /dev/null +++ b/4. AIGC Detection/function/customreader_imgeo.m @@ -0,0 +1,18 @@ +function data = customreader_imgeo(filename,imgsize) +onState = warning('off', 'backtrace'); +c = onCleanup(@() warning(onState)); +data = imread(filename); +RA = [0,90,180,270]; +i = randi([1,6],1,1); +if i<=4 + data = imrotate(data,RA(i),'bicubic','crop'); +elseif i == 5 + data = flip(data,1); +else + data = flip(data,2); +end +data = imresize(data,'OutputSize',[imgsize,imgsize]); +if size(data,3) == 1 + data = repmat(data,[1 1 3]); +end +end \ No newline at end of file diff --git a/4. AIGC Detection/function/feature_extraction_dct.m b/4. AIGC Detection/function/feature_extraction_dct.m new file mode 100644 index 0000000..c5b5e4b --- /dev/null +++ b/4. AIGC Detection/function/feature_extraction_dct.m @@ -0,0 +1,9 @@ +function [F] =feature_extraction_dct(I,NB) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[512,512]); +X = dct2(I); +F = ring_integral(size(X,1)-1,NB,abs(X)); +F = F'; +end \ No newline at end of file diff --git a/4. AIGC Detection/function/feature_extraction_dwt.m b/4. AIGC Detection/function/feature_extraction_dwt.m new file mode 100644 index 0000000..bc315c5 --- /dev/null +++ b/4. AIGC Detection/function/feature_extraction_dwt.m @@ -0,0 +1,28 @@ +function [F] =feature_extraction_dwt(I,NB,NF) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[512,512]); + +F = zeros(1,NF); +[LoD,HiD] = wfilters('haar','d'); +[cA,cH,cV,cD] = dwt2(I,LoD,HiD,'mode','symh'); + +X = dct2(cA); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(1:NB) = Y; + +X = dct2(cH); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(NB+1:2*NB) = Y; + +X = dct2(cV); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(2*NB+1:3*NB) = Y; + +X = dct2(cD); +Y = ring_integral(size(X,1)-1,NB,abs(X)); +F(3*NB+1:4*NB) = Y; + +F = F'; +end \ No newline at end of file diff --git a/4. AIGC Detection/function/feature_extraction_hi.m b/4. AIGC Detection/function/feature_extraction_hi.m new file mode 100644 index 0000000..4c96719 --- /dev/null +++ b/4. AIGC Detection/function/feature_extraction_hi.m @@ -0,0 +1,15 @@ +function [F] =feature_extraction_hi(I,param) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[param.imgnorsize,param.imgnorsize]); +I = padarray(I,[param.imgpadsize,param.imgpadsize],0,'both'); +[ord,featcell] = HI(I,param); +F=zeros(size(ord,2)*param.binsize,1); +for i = 1:size(ord,2) + X = featcell{i}; + Y = dct2(X)/(size(X,1)*size(X,2)); + Z = ring_integral(size(Y,1)-1,param.binsize,abs(Y)); + F((i-1)*param.binsize+1:(i)*param.binsize) = Z'; +end +end \ No newline at end of file diff --git a/4. AIGC Detection/function/feature_extraction_km.m b/4. AIGC Detection/function/feature_extraction_km.m new file mode 100644 index 0000000..39368cd --- /dev/null +++ b/4. AIGC Detection/function/feature_extraction_km.m @@ -0,0 +1,16 @@ +function [F] =feature_extraction_km(I,K,BF,NP,NB) +if size(I,3) > 1 + I = rgb2gray(I); +end +I = imresize(I,[512,512]); +F=zeros(NP,NB); +for i=1:NP + %% Moments + M = BF{i,2}*double(I)*BF{i,1}'; + %% Ring Integral + [IM] = ring_integral(K,NB,abs(M)); + F(i,:) = IM; +end +F = reshape(F',1,[]); +F = F'; +end \ No newline at end of file diff --git a/4. AIGC Detection/function/feature_extraction_scattering.m b/4. AIGC Detection/function/feature_extraction_scattering.m new file mode 100644 index 0000000..0a825bf --- /dev/null +++ b/4. AIGC Detection/function/feature_extraction_scattering.m @@ -0,0 +1,12 @@ +function features = feature_extraction_scattering(sf,x) +% This function is only to support examples in the Wavelet Toolbox. +% It may change or be removed in a future release. + +% Copyright 2018 MathWorks +if size(x,3) > 1 + x = rgb2gray(x); +end +x = imresize(x,[512 512]); +smat = featureMatrix(sf,x); +features = mean(mean(smat,2),3); +end \ No newline at end of file diff --git a/4. AIGC Detection/function/multiclass_metrics_common.m b/4. AIGC Detection/function/multiclass_metrics_common.m new file mode 100644 index 0000000..179c58a --- /dev/null +++ b/4. AIGC Detection/function/multiclass_metrics_common.m @@ -0,0 +1,93 @@ +function metrics = multiclass_metrics_common(confmat) + +%%***********************************************************************% +%* Multiclass metrics *% +%* Finds the multiclss metrics provided a confusion matrix. *% +%* *% +%* Code author: Preetham Manjunatha *% +%* Github link: https://github.com/preethamam %* +%* Date: 11/24/2021 *% +%************************************************************************% +% +%************************************************************************% +% +% Usage: metrics = multiclass_metrics_common(confmat) +% Inputs: confmat - confusion matrix -- N x N matrix +% +% Outputs: metrics - metrics.Precision = Precision; +% metrics.Recall = Recall; +% metrics.Accuracy = Accuracy; +% metrics.Specificity = Specificity; +% metrics.F1score = F1score; + +% Array initialization +N = size(confmat,1); + +Precision = zeros(1,N); +Recall = zeros(1,N); +Specificity = zeros(1,N); +Accuracy = zeros(1,N); +F1score = zeros(1,N); + + +if size(confmat,1) > 2 + + for i = 1:size(confmat,1) + + TP = confmat(i,i); + FN = sum(confmat(i,:))-confmat(i,i); + FP = sum(confmat(:,i))-confmat(i,i); + TN = sum(confmat(:))-TP -FP-FN; + + Precision(:,i) = TP / (TP+FP); % positive predictive value (PPV) + Recall(:,i) = TP / (TP+FN); % true positive rate (TPR), sensitivity + if ((TN / (TN+FP)) > 1) + Specificity(:,i) = 1; + elseif ((TN / (TN+FP)) < 0) + Specificity(:,i) = 0; + else + Specificity(:,i) = TN / (TN+FP); % (SPC) or true negative rate + end + Accuracy(:,i) = (TP)/(TP+TN+FP+FN); % Accuracy + F1score(:,i) = (2*TP) /(2*TP + FP + FN); + end + + % Remove junks + stats = [Precision', Recall', F1score', Accuracy', Specificity']; + stats(any(isinf(stats),2),:) = 0; + stats(any(isnan(stats),2),:) = 0; + + % Compute averages + Accuracy = sum(stats(:,4)); + Precision = mean(stats(:,1)); + Recall = mean(stats(:,2)); + Specificity = mean(Specificity); + F1score = mean(stats(:,3)); +else + TP = confmat(1, 1); + FP = confmat(2, 1); + FN = confmat(1, 2); + TN = confmat(2,2); + + Precision = TP / (TP+FP); % positive predictive value (PPV) + Recall = TP / (TP+FN); % true positive rate (TPR), sensitivity + if ((TN / (TN+FP)) > 1) + Specificity = 1; + elseif ((TN / (TN+FP)) < 0) + Specificity = 0; + else + Specificity = TN / (TN+FP); % (SPC) or true negative rate + end + Accuracy = (TP+TN)/(TP+TN+FP+FN); % Accuracy + F1score = 2*TP /(2*TP + FP + FN); + +end + +% Output +metrics.Precision = Precision; +metrics.Recall = Recall; +metrics.Accuracy = Accuracy; +metrics.Specificity = Specificity; +metrics.F1score = F1score; + + diff --git a/4. AIGC Detection/function/multiclass_metrics_special.m b/4. AIGC Detection/function/multiclass_metrics_special.m new file mode 100644 index 0000000..2a92807 --- /dev/null +++ b/4. AIGC Detection/function/multiclass_metrics_special.m @@ -0,0 +1,161 @@ +function [Result,ReferenceResult] = multiclass_metrics_special(confMatrix) + +%%***********************************************************************% +%* Multiclass metrics *% +%* Finds the multiclss metrics provided a confusion matrix. *% +%* *% +%* Code author: Preetham Manjunatha *% +%* Github link: https://github.com/preethamam %* +%* Date: 11/24/2021 *% +%************************************************************************% +% +%************************************************************************% +% %confusion matrix for multiple class start +% %Inputs-1.Actual Class Labels,2.Predict Class Labels and 3.Display if need +% %Outputs +% +% %1.Result-Struct Over all output Which has follwing +% %2.RefereceResult indidual output Which has follwing +% %%%%%%%%1.acuuracy +% %%%%%%%%2.error +% %%%%%%%%3.Recall (Recall or True positive rate) +% %%%%%%%%4.Specificity +% %%%%%%%%5.Precision +% %%%%%%%%6.FPR-False positive rate +% %%%%%%%%7.F_score +% %%%%%%%%8.MCC-Matthews correlation coefficient +% %%%%%%%%9.kappa-Cohen's kappa +% +% %%Original Developer Mr.Abbas Manthiri S +% %%Date 25-12-2016 +% %%Mail Id: abbasmanthiribe@gmail.com +% %%http://www.dataschool.io/simple-guide-to-confusion-matrix-terminology/ +% %%https://en.wikipedia.org/wiki/Confusion_matrix +% +% %%Modified by Preetham Manjunatha +% %%Date 02-03-2020 +% %%Note: Fixed Abbas written code where the NaN and Inf values were +% not considered while performaing the class average. +% +% % clc +% % clear all +% % close all +% % %%Multiclass or two class +% % [Result,RefereceResult] = multiclass_metrics(confMatrix) + + % Size of confusion matrix + [row,col]=size(confMatrix); + if row~=col + error('Confusion matrix dimention is wrong') + end + + % Number of classes + n_class=row; + + % Find TP, FN, FP and TN + switch n_class + case 2 + TP=confMatrix(1,1); + FN=confMatrix(1,2); + FP=confMatrix(2,1); + TN=confMatrix(2,2); + + otherwise + TP=zeros(1,n_class); + FN=zeros(1,n_class); + FP=zeros(1,n_class); + TN=zeros(1,n_class); + for i=1:n_class + TP(i)=confMatrix(i,i); + FN(i)=sum(confMatrix(i,:))-confMatrix(i,i); + FP(i)=sum(confMatrix(:,i))-confMatrix(i,i); + TN(i)=sum(confMatrix(:))-TP(i)-FP(i)-FN(i); + end + + end + + %% Calulations + %1.P-Positive + %2.N-Negative + %3.acuuracy + %4.error + %5.Recall (Recall or True positive rate) + %6.Specificity + %7.Precision + %8.FPR-False positive rate + %9.F_score + %10.MCC-Matthews correlation coefficient + %11.kappa-Cohen's kappa + P=TP+FN; + N=FP+TN; + switch n_class + case 2 + accuracy=(TP+TN)/(P+N); + Error=1-accuracy; + Result.Accuracy=(accuracy); + Result.Error=(Error); + otherwise + accuracy=(TP)./(P+N); + Error=(FP)./(P+N); + Result.Accuracy=sum(accuracy); + Result.Error=sum(Error); + end + + ReferenceResult.AccuracyOfSingle=(TP ./ P)'; + ReferenceResult.ErrorOfSingle=1-ReferenceResult.AccuracyOfSingle; + Recall=TP./P; + Specificity=TN./N; + Precision=TP./(TP+FP); + FPR=1-Specificity; + beta=1; + F1_score=( (1+(beta^2))*(Recall.*Precision) ) ./ ( (beta^2)*(Precision+Recall) ); + MCC=[( TP.*TN - FP.*FN ) ./ ( ( (TP+FP).*P.*N.*(TN+FN) ).^(0.5) );... + ( FP.*FN - TP.*TN ) ./ ( ( (TP+FP).*P.*N.*(TN+FN) ).^(0.5) )] ; + MCC=max(MCC); + + %Kappa Calculation BY 2x2 Matrix Shape + pox=sum(accuracy); + Px=sum(P);TPx=sum(TP);FPx=sum(FP);TNx=sum(TN);FNx=sum(FN);Nx=sum(N); + pex=( (Px.*(TPx+FPx))+(Nx.*(FNx+TNx)) ) ./ ( (TPx+TNx+FPx+FNx).^2 ); + kappa_overall=([( pox-pex ) ./ ( 1-pex );( pex-pox ) ./ ( 1-pox )]); + kappa_overall=max(kappa_overall); + + %Kappa Calculation BY n_class x n_class Matrix Shape + po=accuracy; + pe=( (P.*(TP+FP))+(N.*(FN+TN)) ) ./ ( (TP+TN+FP+FN).^2 ); + kappa=([( po-pe ) ./ ( 1-pe );( pe-po ) ./ ( 1-po )]); + kappa=max(kappa); + + + %% + %Output Struct for individual Classes + % RefereceResult.Class=class_ref; + ReferenceResult.AccuracyInTotal=accuracy'; + ReferenceResult.ErrorInTotal=Error'; + ReferenceResult.Recall=Recall'; + ReferenceResult.Specificity=Specificity'; + ReferenceResult.Precision=Precision'; + ReferenceResult.FalsePositiveRate=FPR'; + ReferenceResult.F1_score=F1_score'; + ReferenceResult.MatthewsCorrelationCoefficient=MCC'; + ReferenceResult.Kappa=kappa'; + ReferenceResult.TruePositive=TP'; + ReferenceResult.FalsePositive=FP'; + ReferenceResult.FalseNegative=FN'; + ReferenceResult.TrueNegative=TN'; + + % Remove NANs and INFs + stats = [Precision', Recall', F1_score', MCC']; + stats(any(isinf(stats),2),:) = 0; + stats(any(isnan(stats),2),:) = 0; + + %Output Struct for over all class lists + Result.Recall=mean(stats(:,2)); + Result.Specificity=mean(Specificity); + Result.Precision=mean(stats(:,1)); + Result.FalsePositiveRate=mean(FPR); + Result.F1_score=mean(stats(:,3)); + Result.MatthewsCorrelationCoefficient=mean(stats(:,4)); + Result.Kappa=kappa_overall; + +end \ No newline at end of file diff --git a/4. AIGC Detection/function/ring_integral.m b/4. AIGC Detection/function/ring_integral.m new file mode 100644 index 0000000..da57ab6 --- /dev/null +++ b/4. AIGC Detection/function/ring_integral.m @@ -0,0 +1,17 @@ +function [IM] =ring_integral(K,NB,M) +[Y,X]=meshgrid(1:K+1,1:K+1); +Rad = sqrt(X.^2+Y.^2); +LB=(max(Rad(:))-min(Rad(:)))/NB; +IM=zeros(1,NB); +M=M.*(Rad.^2); +for i=1:NB + minRad=(i-1)*LB; maxRad=(i)*LB; + PZ=(Rad>minRad)&(Rad<=maxRad); + temp=M(PZ); + IM(i)=sum(temp)/sum(PZ(:)); +% IM(i)=sum(temp); +end +% minRad=(60-1)*LB; maxRad=(80)*LB; +% PZ=(Rad>minRad)&(Rad<=maxRad); +% figure;imshow(PZ); +end \ No newline at end of file diff --git a/4. AIGC Detection/function/tight_subplot.m b/4. AIGC Detection/function/tight_subplot.m new file mode 100644 index 0000000..55f3a8d --- /dev/null +++ b/4. AIGC Detection/function/tight_subplot.m @@ -0,0 +1,62 @@ +function ha = tight_subplot(Nh, Nw, gap, marg_h, marg_w) + +% tight_subplot creates "subplot" axes with adjustable gaps and margins +% +% ha = tight_subplot(Nh, Nw, gap, marg_h, marg_w) +% +% in: Nh number of axes in hight (vertical direction) +% Nw number of axes in width (horizontaldirection) +% gap gaps between the axes in normalized units (0...1) +% or [gap_h gap_w] for different gaps in height and width +% marg_h margins in height in normalized units (0...1) +% or [lower upper] for different lower and upper margins +% marg_w margins in width in normalized units (0...1) +% or [left right] for different left and right margins +% +% out: ha array of handles of the axes objects +% starting from upper left corner, going row-wise as in +% going row-wise as in +% +% Example: ha = tight_subplot(3,2,[.01 .03],[.1 .01],[.01 .01]) +% for ii = 1:6; axes(ha(ii)); plot(randn(10,ii)); end +% set(ha(1:4),'XTickLabel',''); set(ha,'YTickLabel','') + +% Pekka Kumpulainen 20.6.2010 @tut.fi +% Tampere University of Technology / Automation Science and Engineering + + +if nargin<3; gap = .02; end +if nargin<4 || isempty(marg_h); marg_h = .05; end +if nargin<5; marg_w = .05; end + +if numel(gap)==1; + gap = [gap gap]; +end +if numel(marg_w)==1; + marg_w = [marg_w marg_w]; +end +if numel(marg_h)==1; + marg_h = [marg_h marg_h]; +end + +axh = (1-sum(marg_h)-(Nh-1)*gap(1))/Nh; +axw = (1-sum(marg_w)-(Nw-1)*gap(2))/Nw; + +py = 1-marg_h(2)-axh; + +ha = zeros(Nh*Nw,1); +ii = 0; +for ih = 1:Nh + px = marg_w(1); + + for ix = 1:Nw + ii = ii+1; + ha(ii) = axes('Units','normalized', ... + 'Position',[px py axw axh], ... + 'XTickLabel','', ... + 'YTickLabel',''); + px = px+axw+gap(2); + end + py = py-axh-gap(1); +end +end \ No newline at end of file diff --git a/4. AIGC Detection/hierarchical_invariants.m b/4. AIGC Detection/hierarchical_invariants.m new file mode 100644 index 0000000..1b06889 --- /dev/null +++ b/4. AIGC Detection/hierarchical_invariants.m @@ -0,0 +1,117 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +param = struct(); +param.type_feat = 10; % type of feature as following: +% '1.ZM';'2.PZM';'3.OFMM';'4.CHFM';'5.PJFM';'6.JFM'; % Classical Jacobi polynomial based moments +% '7.RHFM';'8.EFM';'9.PCET';'10.PCT';'11.PST'; % Classical Harmonic function based moments +% '12.BFM'; % Classical Eigenfunction based moments +% '13.FJFM'; % Fractional-order Jacobi polynomial based moments +% '14.GRHFM';'15.GPCET';'16.GPCT';'17.GPST' % Fractional-order Harmonic function based moments +param.XNM = [0,0;... + 0,1;1,0;... + 0,2;1,1;2,0;... + 3,0;2,1;1,2;0,3;... + 4,0;3,1;2,2;1,3;0,4;... + 5,0;4,1;3,2;2,3;1,4;0,5;... + 6,0;5,1;4,2;3,3;2,4;1,5;0,6;... + 7,0;6,1;5,2;4,3;3,4;2,5;1,6;0,7]; % K = 7 all the n and m for the moments +param.alpha = 1; % parameter for fractional-order moments +param.p = 2; param.q = 2; % parameters for JFM and FJFM +param.scales = 6; % the scale +param.numofscale = size(param.scales,2); % number of scales +param.imgnorsize = 512; % image normaling size +param.imgpadsize = 0; % image pading size +param.binsize = 30; % number of bins for DCT band integration +param.featsize = 500; % compressed feature size +%% Real and Fake Images +RealImds = imageDatastore(fullfile(pwd,'image\Real'),'IncludeSubFolders',true,'LabelSource','foldernames'); +FakeImds = imageDatastore(fullfile(pwd,'image\ALLIN'),'IncludeSubFolders',true,'LabelSource','foldernames'); +rng(100) +RealImds = shuffle(RealImds); +FakeImds = shuffle(FakeImds); +numofimages = 6000; % for ALLIN Fake set +% numofimages = length(FakeImds.Files); % for reset Fake sets +RealImds = subset(RealImds,1:numofimages); +FakeImds = subset(FakeImds,1:numofimages); +Imds = imageDatastore(cat(1, RealImds.Files,FakeImds.Files)); +Imds.Labels = cat(1, RealImds.Labels, FakeImds.Labels); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Image Featuring with Hierarchical Invariants +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_hi(x,param),Ttrain,'Uni',0); +testfeatures = cellfun(@(x)feature_extraction_hi(x,param),Ttest,'Uni',0); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +idx = fscchi2(trainfeatures',trainImds.Labels); +shorttrainfeatures = trainfeatures(idx(1:param.featsize),:); +shorttestfeatures = testfeatures(idx(1:param.featsize),:); +clear trainfeatures testfeatures +Time = toc(t); +%% Image Classification with NN Model +NNmodel = fitcnet(shorttrainfeatures',trainImds.Labels); +predlabels = predict(NNmodel,shorttestfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Hierarchical Invariants, NN, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); +%% Image Classification with SVM Model +SVMmodel = fitcsvm(shorttrainfeatures',trainImds.Labels,'OptimizeHyperparameters','all','HyperparameterOptimizationOptions',struct('UseParallel',true)); +predlabels = predict(SVMmodel,shorttestfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Hierarchical Invariants, SVM, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); +%% Image Classification under Orientation and Flipping Changes +testImds.ReadFcn = @(x)customreader_imgeo(x,param.imgnorsize); +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +Ttest = tall(testImds); +testfeatures = cellfun(@(x)feature_extraction_hi(x,param),Ttest,'Uni',0); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +shorttestfeatures = testfeatures(idx(1:param.featsize),:); +predlabels = predict(SVMmodel,shorttestfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Hierarchical Invariants, SVM, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); diff --git a/4. AIGC Detection/scattering_network.m b/4. AIGC Detection/scattering_network.m new file mode 100644 index 0000000..39fa8b6 --- /dev/null +++ b/4. AIGC Detection/scattering_network.m @@ -0,0 +1,92 @@ +%% +close all; +clear all; +clc; +warning('off'); +addpath(genpath(pwd)); +dbstop if error +%% Parameters +imgsize = 512; +sf = waveletScattering2('ImageSize',[imgsize imgsize],'InvarianceScale',200, ... + 'NumRotations',[8 8]); +%% Real and Fake Images +RealImds = imageDatastore(fullfile(pwd,'image\Real'),'IncludeSubFolders',true,'LabelSource','foldernames'); +FakeImds = imageDatastore(fullfile(pwd,'image\ALLIN'),'IncludeSubFolders',true,'LabelSource','foldernames'); +rng(100) +RealImds = shuffle(RealImds); +FakeImds = shuffle(FakeImds); +numofimages = 6000; % for ALLIN Fake set +% numofimages = length(FakeImds.Files); % for reset Fake sets +RealImds = subset(RealImds,1:numofimages); +FakeImds = subset(FakeImds,1:numofimages); +Imds = imageDatastore(cat(1, RealImds.Files,FakeImds.Files)); +Imds.Labels = cat(1, RealImds.Labels, FakeImds.Labels); +[trainImds,testImds] = splitEachLabel(Imds,0.1); +countEachLabel(trainImds) +countEachLabel(testImds) +%% Image Featuring with Wavelet Scattering +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +t = tic; +Ttrain = tall(trainImds); +Ttest = tall(testImds); +trainfeatures = cellfun(@(x)feature_extraction_scattering(sf,x),Ttrain,'UniformOutput',false); +testfeatures = cellfun(@(x)feature_extraction_scattering(sf,x),Ttest,'UniformOutput',false); +Trainf = gather(trainfeatures); +trainfeatures = cat(2,Trainf{:}); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +Time = toc(t); +%% Image Classification with NN Model +NNmodel = fitcnet(trainfeatures',trainImds.Labels); +predlabels = predict(NNmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Wavelet Scattering, NN, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); +%% Image Classification with SVM Model +SVMmodel = fitcsvm(trainfeatures',trainImds.Labels,'OptimizeHyperparameters','all','HyperparameterOptimizationOptions',struct('UseParallel',true)); +predlabels = predict(SVMmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Wavelet Scattering, SVM, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); +%% Image Classification under Orientation and Flipping Changes +testImds.ReadFcn = @(x)customreader_imgeo(x,imgsize); +reset(testImds); +figure; +for np = 1:20 + subplot(4,5,np) + im = read(testImds); + imagesc(im); + colormap gray; axis off; +end +Ttest = tall(testImds); +testfeatures = cellfun(@(x)feature_extraction_scattering(sf,x),Ttest,'UniformOutput',false); +Testf = gather(testfeatures); +testfeatures = cat(2,Testf{:}); +predlabels = predict(SVMmodel,testfeatures'); +Accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100; +figure; +cchart = confusionchart(testImds.Labels,predlabels); +title(['Wavelet Scattering, SVM, accuracy = ',num2str(Accuracy),'%']); +[metrics, ~] = multiclass_metrics_special(cchart.NormalizedValues); +disp(table(Time,... + 'RowNames',{'Time'},'VariableNames',{'Seconds'})); +disp(table([metrics.Accuracy;metrics.Recall;metrics.Precision;metrics.F1_score]*100,... + 'RowNames',{'Accuracy';'Recall';'Precision';'F1'},'VariableNames',{'Metrics'})); \ No newline at end of file

t-*KBr{>)}o8B`jQtZqslPNU5epS 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