diff --git a/llm/cli_demo.cpp b/llm/cli_demo.cpp new file mode 100644 index 000000000..06c489ec3 --- /dev/null +++ b/llm/cli_demo.cpp @@ -0,0 +1,64 @@ +// +// cli_demo.cpp +// +// Created by MNN on 2023/03/24. +// ZhaodeWang +// + +#include "llm.hpp" +#include +#include + +void benchmark(Llm* llm, std::string prompt_file) { + std::cout << "prompt file is " << prompt_file << std::endl; + std::ifstream prompt_fs(prompt_file); + std::vector prompts; + std::string prompt; + while (std::getline(prompt_fs, prompt)) { + // prompt start with '#' will be ignored + if (prompt.substr(0, 1) == "#") { + continue; + } + prompts.push_back(prompt); + } + int prompt_len = 0; + int decode_len = 0; + int64_t prefill_time = 0; + int64_t decode_time = 0; + // llm->warmup(); + for (int i = 0; i < prompts.size(); i++) { + llm->response(prompts[i]); + prompt_len += llm->prompt_len_; + decode_len += llm->gen_seq_len_; + prefill_time += llm->prefill_us_; + decode_time += llm->decode_us_; + llm->reset(); + } + float prefill_s = prefill_time / 1e6; + float decode_s = decode_time / 1e6; + printf("\n#################################\n"); + printf("prompt tokens num = %d\n", prompt_len); + printf("decode tokens num = %d\n", decode_len); + printf("prefill time = %.2f s\n", prefill_s); + printf(" decode time = %.2f s\n", decode_s); + printf("prefill speed = %.2f tok/s\n", prompt_len / prefill_s); + printf(" decode speed = %.2f tok/s\n", decode_len / decode_s); + printf("##################################\n"); +} + +int main(int argc, const char* argv[]) { + if (argc < 2) { + std::cout << "Usage: " << argv[0] << " model_dir " << std::endl; + return 0; + } + std::string model_dir = argv[1]; + std::cout << "model path is " << model_dir << std::endl; + std::unique_ptr llm(Llm::createLLM(model_dir)); + llm->load(model_dir); + if (argc < 3) { + llm->chat(); + } + std::string prompt_file = argv[2]; + benchmark(llm.get(), prompt_file); + return 0; +} diff --git a/llm/include/llm.hpp b/llm/include/llm.hpp index a77e1be6e..7b7689f79 100644 --- a/llm/include/llm.hpp +++ b/llm/include/llm.hpp @@ -23,6 +23,7 @@ using namespace MNN; using namespace Express; +class Tokenizer; class MNN_PUBLIC Llm { public: @@ -30,15 +31,29 @@ class MNN_PUBLIC Llm { // default tokenier is senrencepiece tokenizer_.reset(new Sentencepiece); } - static Llm* createLLM(const std::string& path); - VARP gen_embedding(const std::vector& input_ids); + virtual ~Llm() = default; + static Llm* createLLM(const std::string& path, std::string model_type = "auto"); + VARP disk_embedding(const std::vector& input_ids); void load(const std::string& model_dir); int forward(const std::vector& input_ids); std::vector tokenizer_encode(const std::string& input_str); std::string decode(int id); - std::string response(const std::string& input_str, std::ostream* os = &std::cout); + void chat(); + void warmup(); + std::string response(const std::string& input_str, std::ostream* os = &std::cout, const char* end_with = nullptr); float load_progress() { return load_progress_; } void reset(); + void print_speed(); +public: + std::vector history_; + // forward info + int max_seq_len_ = 1024; + int prompt_len_ = 0; + int gen_seq_len_ = 0; + int all_seq_len_ = 0; + // time + int64_t prefill_us_ = 0; + int64_t decode_us_ = 0; private: virtual std::vector tokenizer(const std::string& query) = 0; virtual VARP gen_attention_mask(int seq_len) = 0; @@ -52,9 +67,6 @@ class MNN_PUBLIC Llm { std::vector key_value_shape_ = {}; std::string model_name_ = ""; // gen info - int gen_seq_len_ = 0; - int all_seq_len_ = 0; - int max_seq_len_ = 256; float load_progress_ = 0.f; // tokenizer std::unique_ptr tokenizer_; @@ -65,9 +77,6 @@ class MNN_PUBLIC Llm { std::vector past_key_values_; // model dir std::string model_dir_; - // tokenizer - std::vector word_decoder_; - std::unordered_map word_encoder_; }; // some llm models @@ -107,6 +116,7 @@ class Qwen_7b : public Llm { model_name_ = "Qwen_7b"; layer_nums_ = 32; key_value_shape_ = {2, 1, 0, 32, 128}; + hidden_size_ = 4096; tokenizer_.reset(new Tiktoken); } private: @@ -116,6 +126,17 @@ class Qwen_7b : public Llm { virtual bool is_stop(int token_id) override; }; +class Qwen_1_8b : public Qwen_7b { +public: + Qwen_1_8b() { + model_name_ = "Qwen_1.8b"; + layer_nums_ = 24; + key_value_shape_ = {2, 1, 0, 16, 128}; + hidden_size_ = 2048; + tokenizer_.reset(new Tiktoken); + } +}; + class Llama2_7b : public Llm { public: Llama2_7b() { diff --git a/llm/include/tokenizer.hpp b/llm/include/tokenizer.hpp index 059ebf244..8dabd1894 100644 --- a/llm/include/tokenizer.hpp +++ b/llm/include/tokenizer.hpp @@ -18,6 +18,7 @@ class Tokenizer { public: Tokenizer() = default; + virtual ~Tokenizer() = default; virtual bool load(const std::string& filename) = 0; virtual std::vector encode(const std::string& str) = 0; virtual std::string decode(int id) = 0; diff --git a/llm/llm_demo.cpp b/llm/llm_demo.cpp index ab88e0247..41b96b16c 100644 --- a/llm/llm_demo.cpp +++ b/llm/llm_demo.cpp @@ -6,17 +6,59 @@ // #include "llm.hpp" -#include +#include +#include + +void benchmark(Llm* llm, std::string prompt_file) { + std::cout << "prompt file is " << prompt_file << std::endl; + std::ifstream prompt_fs(prompt_file); + std::vector prompts; + std::string prompt; + while (std::getline(prompt_fs, prompt)) { + // prompt start with '#' will be ignored + if (prompt.substr(0, 1) == "#") { + continue; + } + prompts.push_back(prompt); + } + int prompt_len = 0; + int decode_len = 0; + int64_t prefill_time = 0; + int64_t decode_time = 0; + // llm->warmup(); + for (int i = 0; i < prompts.size(); i++) { + llm->response(prompts[i]); + prompt_len += llm->prompt_len_; + decode_len += llm->gen_seq_len_; + prefill_time += llm->prefill_us_; + decode_time += llm->decode_us_; + llm->reset(); + } + float prefill_s = prefill_time / 1e6; + float decode_s = decode_time / 1e6; + printf("\n#################################\n"); + printf("prompt tokens num = %d\n", prompt_len); + printf("decode tokens num = %d\n", decode_len); + printf("prefill time = %.2f s\n", prefill_s); + printf(" decode time = %.2f s\n", decode_s); + printf("prefill speed = %.2f tok/s\n", prompt_len / prefill_s); + printf(" decode speed = %.2f tok/s\n", decode_len / decode_s); + printf("##################################\n"); +} int main(int argc, const char* argv[]) { if (argc < 2) { - std::cout << "Usage: ./llm_demo.out " << std::endl; + std::cout << "Usage: " << argv[0] << " model_dir " << std::endl; return 0; } std::string model_dir = argv[1]; std::cout << "model path is " << model_dir << std::endl; std::unique_ptr llm(Llm::createLLM(model_dir)); llm->load(model_dir); - llm->response("你好"); + if (argc < 3) { + llm->chat(); + } + std::string prompt_file = argv[2]; + benchmark(llm.get(), prompt_file); return 0; -} +} \ No newline at end of file diff --git a/llm/src/llm.cpp b/llm/src/llm.cpp index c80e30b7a..8e690d3ab 100644 --- a/llm/src/llm.cpp +++ b/llm/src/llm.cpp @@ -4,13 +4,18 @@ // Created by MNN on 2023/08/25. // ZhaodeWang // +// #define MNN_OPEN_TIME_TRACE 1 #include #include "llm.hpp" +#include "tokenizer.hpp" #include +#include -Llm* Llm::createLLM(const std::string& path) { +#include + +Llm* Llm::createLLM(const std::string& path, std::string model_type) { auto size = path.size(); // end with '.mnn' is single model file, otherwise split block models bool is_single = (size > 4 && @@ -18,31 +23,74 @@ Llm* Llm::createLLM(const std::string& path) { path[size - 3] == 'm' && path[size - 2] == 'n' && path[size - 1] == 'n'); - // default is chatglm2 - Llm* llm = new Chatglm2_6b; - if (path.find("chatglm2") != std::string::npos) { - // llm = new Chatglm2_6b; - } else if (path.find("chatglm") != std::string::npos) { - llm = new Chatglm_6b; - } else if (path.find("codegeex2") != std::string::npos) { + Llm* llm = nullptr; + if (model_type == "auto") { + model_type = path; + } + if (model_type.find("chatglm") != std::string::npos) { + if (model_type.find("chatglm2") != std::string::npos) { + llm = new Chatglm2_6b; + } else if (model_type.find("chatglm3") != std::string::npos) { + llm = new Chatglm2_6b; + llm->model_name_ = "Chatglm3_6b"; + } else { + llm = new Chatglm_6b; + } + } else if (model_type.find("codegeex2") != std::string::npos) { llm = new Chatglm2_6b; llm->model_name_ = "Codegeex2_6b"; - } else if (path.find("qwen") != std::string::npos) { - llm = new Qwen_7b; - } else if (path.find("llama2") != std::string::npos) { + } else if (model_type.find("qwen") != std::string::npos) { + if (model_type.find("1.8") != std::string::npos) { + llm = new Qwen_1_8b; + } else { + llm = new Qwen_7b; + } + } else if (model_type.find("llama2") != std::string::npos) { llm = new Llama2_7b; - } else if (path.find("baichuan") != std::string::npos) { + } else if (model_type.find("baichuan") != std::string::npos) { llm = new Llama2_7b; llm->model_name_ = "Baichuan2_7b"; } + if (!llm) { + std::cerr << "model type can't judge!" << std::endl; + return llm; + } llm->is_single_ = is_single; + std::cout << "### model name : "<< llm->model_name_ << std::endl; return llm; } -std::string Llm::response(const std::string& query, std::ostream* os) { +void Llm::chat() { + while (true) { + std::cout << "\nQ: "; + std::string input_str; + std::cin >> input_str; + if (input_str == "/exit") { + break; + } + if (input_str == "/reset") { + reset(); + std::cout << "\nA: reset done." << std::endl; + continue; + } + std::cout << "\nA: " << std::flush; + response(input_str); + std::cout << std::endl; + } + reset(); +} + +std::string Llm::response(const std::string& query, std::ostream* os, const char* end_with) { + if (!end_with) { + end_with = "\n"; + } // init status + gen_seq_len_ = 0; + all_seq_len_ = 0; + prefill_us_ = 0; + decode_us_ = 0; + past_key_values_.clear(); if (is_single_) { - key_value_shape_.insert(key_value_shape_.begin(), layer_nums_); past_key_values_.push_back(_Input(key_value_shape_, NCHW)); } else { for (int i = 0; i < layer_nums_; i++) { @@ -50,29 +98,66 @@ std::string Llm::response(const std::string& query, std::ostream* os) { } } // response - auto st = std::chrono::system_clock::now(); auto input_ids = tokenizer(query); + if (!history_.empty()) { + std::copy(input_ids.begin(), input_ids.end(), std::back_inserter(history_)); + input_ids = history_; + } else { + history_ = input_ids; + } + + prompt_len_ = input_ids.size(); + // printf("token_num : %lu\n", input_ids.size()); + auto st = std::chrono::system_clock::now(); int token = forward(input_ids); + auto et = std::chrono::system_clock::now(); + history_.push_back(token); std::string output_str = decode(token); + prefill_us_ = std::chrono::duration_cast(et - st).count(); *os << output_str << std::flush; while (gen_seq_len_ < max_seq_len_) { + st = std::chrono::system_clock::now(); token = forward({token}); + et = std::chrono::system_clock::now(); + decode_us_ += std::chrono::duration_cast(et - st).count(); if (is_stop(token)) { - *os << std::endl << std::flush; + *os << end_with << std::flush; break; } + history_.push_back(token); auto word = decode(token); *os << word << std::flush; output_str += word; } - auto et = std::chrono::system_clock::now(); - auto duration = std::chrono::duration_cast(et - st); - printf("\n[speed: %f tok/s]\n", gen_seq_len_ / (duration.count() * 1e-6)); +#ifdef DUMP_PROFILE_INFO + print_speed(); +#endif + // update Cache + // runtime_manager_->updateCache(); + // reset forward info return output_str; } +void Llm::print_speed() { + auto prefill_s = prefill_us_ * 1e-6; + auto decode_s = decode_us_ * 1e-6; + auto total_s = prefill_s + decode_s; + printf("\n#################################\n"); + printf(" total tokens num = %d\n", prompt_len_ + gen_seq_len_); + printf("prompt tokens num = %d\n", prompt_len_); + printf("output tokens num = %d\n", gen_seq_len_); + printf(" total time = %.2f s\n", total_s); + printf("prefill time = %.2f s\n", prefill_s); + printf(" decode time = %.2f s\n", decode_s); + printf(" total speed = %.2f tok/s\n", (prompt_len_ + gen_seq_len_) / total_s); + printf("prefill speed = %.2f tok/s\n", prompt_len_ / prefill_s); + printf(" decode speed = %.2f tok/s\n", gen_seq_len_ / decode_s); + printf(" chat speed = %.2f tok/s\n", gen_seq_len_ / total_s); + printf("##################################\n"); +} + void Llm::reset() { - // TODO + history_.clear(); } void Llm::load(const std::string& model_dir) { @@ -81,60 +166,87 @@ void Llm::load(const std::string& model_dir) { ScheduleConfig config; BackendConfig cpuBackendConfig; config.type = MNN_FORWARD_CPU; - // config.type = MNN_FORWARD_CUDA; + // config.type = MNN_FORWARD_OPENCL; config.numThread = 4; - cpuBackendConfig.precision = BackendConfig::Precision_Low; + // cpuBackendConfig.precision = BackendConfig::Precision_Low; cpuBackendConfig.memory = BackendConfig::Memory_Low; config.backendConfig = &cpuBackendConfig; runtime_manager_.reset(Executor::RuntimeManager::createRuntimeManager(config)); + if (config.type == MNN_FORWARD_OPENCL) { + const char* cacheFileName = ".tempcache"; + runtime_manager_->setCache(cacheFileName); + } + load_progress_ = 0.f; // 1. load vocab - // std::string tokenizer_path = model_dir + "/tokenizer.model"; std::string tokenizer_path = model_dir + "/tokenizer.txt"; + load_progress_ += 5.f; tokenizer_->load(tokenizer_path); + load_progress_ += 5.f; // 2. load model Module::Config module_config; module_config.shapeMutable = true; module_config.rearrange = true; - load_progress_ = 0.f; if (is_single_) { + key_value_shape_.insert(key_value_shape_.begin(), layer_nums_); modules_.resize(1); std::string model_path = model_dir; std::string external_path = model_dir + ".weight"; - printf("load %s ... ", model_path.c_str()); + MNN_PRINT("load %s ... ", model_path.c_str()); runtime_manager_->setExternalFile(external_path); modules_[0].reset(Module::load( {"input_ids", "attention_mask", "position_ids", "past_key_values"}, {"token_id", "presents"}, model_path.c_str(), runtime_manager_, &module_config)); - printf("Done!\n"); - fflush(stdout); + MNN_PRINT("Done!\n"); + load_progress_ += 90.f; } else { // 2. load models modules_.resize(layer_nums_ + 2); - float step = 100.0 / modules_.size(); + float step = 90.0 / modules_.size(); char buffer[50]; // load lm model std::string lm_model_path = model_dir + "/lm.mnn"; std::string embedding_model_path = model_dir + "/embedding.mnn"; - printf("[%3.0f%% ] load %s model ... ", load_progress_, lm_model_path.c_str()); + MNN_PRINT("[%3.0f%% ] load %s model ... ", load_progress_, lm_model_path.c_str()); modules_[layer_nums_].reset(Module::load({}, {}, lm_model_path.c_str(), runtime_manager_, &module_config)); - printf("Done!\n"); + MNN_PRINT("Done!\n"); load_progress_ += step; - printf("[%3.0f%% ] load %s model ... ", load_progress_, embedding_model_path.c_str());fflush(stdout); +#ifndef USING_DISK_EMBED + MNN_PRINT("[%3.0f%% ] load %s model ... ", load_progress_, embedding_model_path.c_str());fflush(stdout); modules_[layer_nums_ + 1].reset(Module::load({}, {}, embedding_model_path.c_str(), runtime_manager_, &module_config)); - printf("Done!\n"); + MNN_PRINT("Done!\n"); load_progress_ += step; +#endif // load glm_block models for (int i = 0; i < layer_nums_; i++) { load_progress_ += step; std::string model_path = model_dir + "/block_" + std::to_string(i) + ".mnn"; - printf("[%3.0f%% ] load %s model ... ", load_progress_, model_path.c_str()); + MNN_PRINT("[%3.0f%% ] load %s model ... ", load_progress_, model_path.c_str()); modules_[i].reset(Module::load( {"inputs_embeds", "attention_mask", "position_ids", "past_key_values"}, {"hidden_states", "presents"}, model_path.c_str(), runtime_manager_, &module_config)); - printf("Done!\n"); - fflush(stdout); + MNN_PRINT("Done!\n"); + } + } + if (config.type == MNN_FORWARD_OPENCL) { + warmup(); + } +} + +void Llm::warmup() { + // warmup + MNN_PRINT("### warmup ... "); + if (is_single_) { + past_key_values_.push_back(_Input(key_value_shape_, NCHW)); + } else { + for (int i = 0; i < layer_nums_; i++) { + past_key_values_.push_back(_Input(key_value_shape_, NCHW)); } } + std::vector tmp(1, 0); + forward(tmp); + all_seq_len_ = 0; + gen_seq_len_ = 0; + printf("Done\n"); } int Llm::forward(const std::vector& input_ids) { @@ -150,27 +262,36 @@ int Llm::forward(const std::vector& input_ids) { past_key_values_[0] = outputs[1]; } else { // split block models +#ifdef USING_DISK_EMBED + auto hidden_states = disk_embedding(input_ids); +#else auto hidden_states = modules_[layer_nums_ + 1]->onForward({inputs_ids_})[0]; +#endif for (int i = 0; i < layer_nums_; i++) { + AUTOTIME; auto outputs = modules_[i]->onForward({hidden_states, attention_mask, position_ids, past_key_values_[i]}); hidden_states = outputs[0]; past_key_values_[i] = outputs[1]; } - auto outputs = modules_[layer_nums_]->onForward({hidden_states}); - id = outputs[0]->readMap()[0]; + { + AUTOTIME; + auto outputs = modules_[layer_nums_]->onForward({hidden_states}); + id = outputs[0]->readMap()[0]; + } + } all_seq_len_ += seq_len; gen_seq_len_++; return id; } -VARP Llm::gen_embedding(const std::vector& input_ids) { +VARP Llm::disk_embedding(const std::vector& input_ids) { + AUTOTIME; // disk embedding save memory size_t seq_len = input_ids.size(); auto embedding = _Input({static_cast(seq_len), 1, hidden_size_}, NCHW); - // auto embedding = _Input({1, static_cast(seq_len), hidden_size_}, NCHW); size_t size = hidden_size_ * sizeof(int16_t); - std::string file_path = model_dir_ + "/slim_word_embeddings_bf16.bin"; + std::string file_path = model_dir_ + "/embeddings_bf16.bin"; FILE* file = fopen(file_path.c_str(), "rb"); std::unique_ptr buffer(new int16_t[hidden_size_]); for (size_t i = 0; i < seq_len; i++) { @@ -372,4 +493,4 @@ VARP Llama2_7b::gen_position_ids(int seq_len) { bool Llama2_7b::is_stop(int token_id) { return token_id == 2; -} \ No newline at end of file +} diff --git a/llm/src/tokenizer.cpp b/llm/src/tokenizer.cpp index 0fee3e87e..9aa4439d4 100644 --- a/llm/src/tokenizer.cpp +++ b/llm/src/tokenizer.cpp @@ -339,6 +339,8 @@ bool Tiktoken::load(const std::string& filename) { } tokens_.resize(start + CHARACTER_VOCABULARY_SIZE); token_ids_.resize(start + CHARACTER_VOCABULARY_SIZE); + tokens_.shrink_to_fit(); + token_ids_.shrink_to_fit(); return true; } diff --git a/pymnn/src/expr.h b/pymnn/src/expr.h index 729a41a9e..3cca6b648 100644 --- a/pymnn/src/expr.h +++ b/pymnn/src/expr.h @@ -439,11 +439,6 @@ static void dealSlice(PyObject* slice, std::vector& begin, std::vector Py_ssize_t startl = 0, stopl = 0, stepl = 1; auto slice_res = PySlice_Unpack(item, &startl, &stopl, &stepl); // py2 don't check return value. -#if PY_MAJOR_VERSION >= 3 - if (!slice_res) { - PyMNN_ERROR_LOG("slice is invalid."); - } -#endif int start = static_cast(startl); int stop = static_cast(stopl); int step = static_cast(stepl); diff --git a/pymnn/src/nn.h b/pymnn/src/nn.h index e0b345279..e096e1ffc 100644 --- a/pymnn/src/nn.h +++ b/pymnn/src/nn.h @@ -374,6 +374,7 @@ static PyObject* PyMNNNN_create_runtime_manager(PyObject *self, PyObject *args) return Py_None; } for (auto i = 0; i < PySequence_Size(dicts); ++i) { + backendConfig[i].sharedContext = nullptr; config[i].backendConfig = &backendConfig[i]; bool ret = getScheduleConfig(PySequence_GetItem(dicts, i), config[i]); if (!ret) { diff --git a/pymnn/src/util.h b/pymnn/src/util.h index 0630292e6..156a3e87e 100644 --- a/pymnn/src/util.h +++ b/pymnn/src/util.h @@ -19,7 +19,7 @@ using namespace std; typedef vector INTS; -#define PyMNN_ERROR_LOG(x) PyErr_SetString(PyExc_TypeError, x); +#define PyMNN_ERROR_LOG(x) PyErr_SetString(PyExc_TypeError, x);MNN_PRINT(x); #define PyMNN_ERROR(x) PyMNN_ERROR_LOG(x) \ Py_RETURN_NONE #if PY_MAJOR_VERSION < 3 diff --git a/source/backend/arm82/Arm82Functions.cpp b/source/backend/arm82/Arm82Functions.cpp index a44f6451f..7ed86d8b0 100644 --- a/source/backend/arm82/Arm82Functions.cpp +++ b/source/backend/arm82/Arm82Functions.cpp @@ -45,8 +45,12 @@ void MNNAbsMaxFP16(const float* source, float* absmax, size_t src_depth_quad, si void MNNQuantScaleFP16(float* sum, float* absmax, float* quant_scale, float* dequant_scale, size_t thread, size_t batch); void MNNDynamicQuantFP16(const float* src, int8_t* dst, const float* scale, size_t src_depth_quad, size_t realSize, int pack); void MNNQuantSumFP16(float* sum, const float* dequant_scale, size_t thread, size_t batch); +#if defined(__aarch64__) void MNNGemmHybridInt8FP16_sdot(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); void MNNGemmHybridInt4FP16_sdot(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); +void MNNGemmHybridInt4FP16_smmla(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); +void MNNGemmHybridInt8FP16_smmla(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); +#endif #endif void MNNConvDwF23MulTransUnitFP16(FLOAT16 **cacheLine, const FLOAT16 *weight, FLOAT16 *dest, size_t ow); @@ -671,6 +675,7 @@ bool Arm82Functions::init() { gInstance->supportFp16arith = gCPUInfo.fp16arith; gInstance->supportSDot = gCPUInfo.dot; gInstance->supportI8mm = gCPUInfo.i8mm; + #if defined(__aarch64__) if (gInstance->supportSDot) { gInstance->MNNGemmHybridInt8 = MNNGemmHybridInt8FP16_sdot; gInstance->MNNGemmHybridInt4 = MNNGemmHybridInt4FP16_sdot; @@ -679,6 +684,7 @@ bool Arm82Functions::init() { gInstance->MNNGemmHybridInt8 = MNNGemmHybridInt8FP16_smmla; gInstance->MNNGemmHybridInt4 = MNNGemmHybridInt4FP16_smmla; } + #endif #endif FUNC_PTR_ASSIGN(gInstance->MNNPackC4ForMatMul_A, Arm82MNNPackForMatMul_A); FUNC_PTR_ASSIGN(gInstance->MNNGetMatMulPackMode, Arm82MNNGetMatMulPackMode); diff --git a/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt4FP16_sdot.S b/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt4FP16_sdot.S index 74004e409..f2ad2dfd1 100644 --- a/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt4FP16_sdot.S +++ b/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt4FP16_sdot.S @@ -82,9 +82,9 @@ TILE_4: blt TILE_1 mov x14, x4 // dst_step lsr x15, x4, #1 // src_step = dst_step / 2 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -94,7 +94,7 @@ LoopDz_TILE_4: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -114,11 +114,9 @@ LoopDz_TILE_4: dup v30.4s, wzr dup v31.4s, wzr // mask - mov w27, #0x0f - dup v14.16b, w27 + movi v14.16b, #15 // offset - mov w27, #8 - dup v15.16b, w27 + movi v15.16b, #8 LoopSz_TILE_4: // src : 2 x [2 x 8] : v4-5 // weight : 4 x [2 x 8] : v0-3 @@ -176,8 +174,8 @@ LoopSz_TILE_4: addp v23.4s, v23.4s, v31.4s LoopSzEnd_TILE_4: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 Int32ToFloat v16, v17, v18, v19 Int32ToFloat v20, v21, v22, v23 // using float scale dequant for precison @@ -220,8 +218,8 @@ Tile4Dequant: Dequant v13, v1, v2, v3, 1 Dequant v14, v1, v2, v3, 2 Dequant v15, v1, v2, v3, 3 - st1 {v12.8h, v13.8h, v14.8h, v15.8h}, [x17], x14 - cmp x16, #1 + st1 {v12.8h, v13.8h, v14.8h, v15.8h}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_4 Tile4End: sub x6, x6, #4 // bach -= 4 @@ -236,9 +234,9 @@ TILE_1: blt End mov x14, x4 // dst_step lsr x15, x4, #1 // src_step = dst_step / 2 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -247,7 +245,7 @@ LoopDz_TILE_1: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init movi v6.4s, #0 @@ -259,11 +257,9 @@ LoopDz_TILE_1: movi v12.4s, #0 movi v13.4s, #0 // mask - mov w27, #0x0f - dup v14.16b, w27 + movi v14.16b, #15 // offset - mov w27, #8 - dup v15.16b, w27 + movi v15.16b, #8 LoopSz_TILE_1: // src : 1 x [1 x 8] : v4 // weight : 4 x [2 x 8] : v0-3 @@ -310,8 +306,8 @@ LoopSz_TILE_1: addp v19.4s, v12.4s, v13.4s LoopSzEnd_TILE_1: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 uzp1 v15.4s, v16.4s, v17.4s uzp1 v16.4s, v18.4s, v19.4s scvtf v15.4s, v15.4s @@ -335,8 +331,8 @@ Tile1Dequant: // sum + (zero * sumx) + bias fadd v2.8h, v2.8h, v17.8h fmla v2.8h, v1.8h, v3.h[0] - st1 {v2.8h}, [x17], x14 - cmp x16, #1 + st1 {v2.8h}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_1 Tile1End: sub x6, x6, #1 // batch -= 1 diff --git a/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt4FP16_smmla.S b/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt4FP16_smmla.S index ae221123c..e20c47f40 100644 --- a/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt4FP16_smmla.S +++ b/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt4FP16_smmla.S @@ -80,9 +80,9 @@ TILE_12: blt TILE_10 sub x14, x4, #128 // dst_step lsr x15, x14, #1 // src_step = dst_step / 2 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -92,7 +92,7 @@ LoopDz_TILE_12: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v8.4s, wzr @@ -120,11 +120,9 @@ LoopDz_TILE_12: dup v30.4s, wzr dup v31.4s, wzr // mask - mov w27, #0x0f - dup v6.16b, w27 + movi v6.16b, #15 // offset - mov w27, #8 - dup v7.16b, w27 + movi v7.16b, #8 LoopSz_TILE_12: // src : 6 x [2 x 8] : (v4-5) * 3 // weight : 4 x [2 x 8] : v0-3 @@ -175,8 +173,8 @@ LoopSz_TILE_12: bne LoopSz_TILE_12 LoopSzEnd_TILE_12: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 Int32ToFloat v8, v9, v10, v11 Int32ToFloat v12, v13, v14, v15 Int32ToFloat v16, v17, v18, v19 @@ -251,10 +249,10 @@ Tile12Dequant: Dequant v14, v0, v1, v2, v4, 1 Dequant v15, v0, v1, v2, v4, 2 Dequant v16, v0, v1, v2, v4, 3 - st1 { v5.8h, v6.8h, v7.8h, v8.8h}, [x17], #64 - st1 { v9.8h, v10.8h, v11.8h, v12.8h}, [x17], #64 - st1 {v13.8h, v14.8h, v15.8h, v16.8h}, [x17], x14 - cmp x16, #1 + st1 { v5.8h, v6.8h, v7.8h, v8.8h}, [x28], #64 + st1 { v9.8h, v10.8h, v11.8h, v12.8h}, [x28], #64 + st1 {v13.8h, v14.8h, v15.8h, v16.8h}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_12 Tile12End: sub x6, x6, #12 // bach -= 12 @@ -269,9 +267,9 @@ TILE_10: blt TILE_8 sub x14, x4, #128 // dst_step lsr x15, x14, #1 // src_step = dst_step / 2 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -281,7 +279,7 @@ LoopDz_TILE_10: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v12.4s, wzr @@ -305,11 +303,9 @@ LoopDz_TILE_10: dup v30.4s, wzr dup v31.4s, wzr // mask - mov w27, #0x0f - dup v10.16b, w27 + movi v10.16b, #15 // offset - mov w27, #8 - dup v11.16b, w27 + movi v11.16b, #8 LoopSz_TILE_10: // src : 5 x [2 x 8] : v4-8 // weight : 4 x [2 x 8] : v0-3 @@ -355,8 +351,8 @@ LoopSz_TILE_10: bne LoopSz_TILE_10 LoopSzEnd_TILE_10: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 Int32ToFloat v12, v13, v14, v15 Int32ToFloat v16, v17, v18, v19 Int32ToFloat v20, v21, v22, v23 @@ -421,10 +417,10 @@ Tile10Dequant: Dequant v16, v0, v1, v2, v3, 7 Dequant v17, v0, v1, v2, v4, 0 Dequant v18, v0, v1, v2, v4, 1 - st1 { v9.8h, v10.8h, v11.8h, v12.8h}, [x17], #64 - st1 {v13.8h, v14.8h, v15.8h, v16.8h}, [x17], #64 - st1 {v17.8h, v18.8h}, [x17], x14 - cmp x16, #1 + st1 { v9.8h, v10.8h, v11.8h, v12.8h}, [x28], #64 + st1 {v13.8h, v14.8h, v15.8h, v16.8h}, [x28], #64 + st1 {v17.8h, v18.8h}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_10 Tile10End: sub x6, x6, #10 // bach -= 10 @@ -439,9 +435,9 @@ TILE_8: blt TILE_1 sub x14, x4, #64 // dst_step lsr x15, x4, #1 // src_step = dst_step / 2 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -451,7 +447,7 @@ LoopDz_TILE_8: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -471,11 +467,9 @@ LoopDz_TILE_8: dup v30.4s, wzr dup v31.4s, wzr // mask - mov w27, #0x0f - dup v10.16b, w27 + movi v10.16b, #15 // offset - mov w27, #8 - dup v11.16b, w27 + movi v11.16b, #8 LoopSz_TILE_8: // src : 4 x [2 x 8] : v4-7 // weight : 4 x [2 x 8] : v0-3 @@ -515,8 +509,8 @@ LoopSz_TILE_8: bne LoopSz_TILE_8 LoopSzEnd_TILE_8: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 Int32ToFloat v16, v17, v18, v19 Int32ToFloat v20, v21, v22, v23 Int32ToFloat v24, v25, v26, v27 @@ -567,9 +561,9 @@ Tile8Dequant: Dequant v16, v0, v1, v2, v3, 5 Dequant v17, v0, v1, v2, v3, 6 Dequant v18, v0, v1, v2, v3, 7 - st1 {v11.8h, v12.8h, v13.8h, v14.8h}, [x17], #64 - st1 {v15.8h, v16.8h, v17.8h, v18.8h}, [x17], x14 - cmp x16, #1 + st1 {v11.8h, v12.8h, v13.8h, v14.8h}, [x28], #64 + st1 {v15.8h, v16.8h, v17.8h, v18.8h}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_8 Tile8End: sub x6, x6, #8 // bach -= 8 @@ -584,9 +578,9 @@ TILE_4: blt TILE_2 mov x14, x4 // dst_step lsr x15, x4, #1 // src_step = dst_step / 2 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -596,7 +590,7 @@ LoopDz_TILE_4: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -616,11 +610,9 @@ LoopDz_TILE_4: dup v30.4s, wzr dup v31.4s, wzr // mask - mov w27, #0x0f - dup v10.16b, w27 + movi v10.16b, #15 // offset - mov w27, #8 - dup v11.16b, w27 + movi v11.16b, #8 LoopSz_TILE_4: // src : 2 x [2 x 8] : v4-5 // weight : 4 x [2 x 8] : v0-3 @@ -652,8 +644,8 @@ LoopSz_TILE_4: bne LoopSz_TILE_4 LoopSzEnd_TILE_4: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 Int32ToFloat v16, v17, v18, v19 Int32ToFloat v20, v21, v22, v23 // using float scale dequant for precison @@ -683,8 +675,8 @@ Tile4Dequant: Dequant v12, v0, v1, v2, v3, 1 Dequant v13, v0, v1, v2, v3, 2 Dequant v14, v0, v1, v2, v3, 3 - st1 {v11.8h, v12.8h, v13.8h, v14.8h}, [x17], x14 - cmp x16, #1 + st1 {v11.8h, v12.8h, v13.8h, v14.8h}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_4 Tile4End: sub x6, x6, #4 // bach -= 4 @@ -699,9 +691,9 @@ TILE_2: blt TILE_1 mov x14, x4 // dst_step lsr x15, x4, #1 // src_step = dst_step / 2 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -710,7 +702,7 @@ LoopDz_TILE_2: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -718,11 +710,9 @@ LoopDz_TILE_2: dup v18.4s, wzr dup v19.4s, wzr // mask - mov w27, #0x0f - dup v14.16b, w27 + movi v14.16b, #15 // offset - mov w27, #8 - dup v15.16b, w27 + movi v15.16b, #8 LoopSz_TILE_2: // src : 1 x [2 x 8] : v4 // weight : 4 x [2 x 8] : v0-3 @@ -750,8 +740,8 @@ LoopSz_TILE_2: bne LoopSz_TILE_2 LoopSzEnd_TILE_2: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 uzp1 v13.2d, v16.2d, v17.2d uzp1 v14.2d, v18.2d, v19.2d uzp2 v15.2d, v16.2d, v17.2d @@ -776,8 +766,8 @@ Tile2Dequant: // alpha * sum + (zero * sumx) + bias Dequant v12, v0, v1, v2, v3, 0 Dequant v13, v0, v1, v2, v3, 1 - st1 {v12.8h, v13.8h}, [x17], x14 - cmp x16, #1 + st1 {v12.8h, v13.8h}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_2 Tile2End: sub x6, x6, #2 // batch -= 2 @@ -793,9 +783,9 @@ TILE_1: blt End mov x14, x4 // dst_step lsr x15, x4, #1 // src_step = dst_step / 2 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -804,7 +794,7 @@ LoopDz_TILE_1: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -812,11 +802,9 @@ LoopDz_TILE_1: dup v18.4s, wzr dup v19.4s, wzr // mask - mov w27, #0x0f - dup v14.16b, w27 + movi v14.16b, #15 // offset - mov w27, #8 - dup v15.16b, w27 + movi v15.16b, #8 LoopSz_TILE_1: // src : 1 x [1 x 8] : v4 @@ -847,8 +835,8 @@ LoopSz_TILE_1: bne LoopSz_TILE_1 LoopSzEnd_TILE_1: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 uzp1 v15.4s, v16.4s, v17.4s uzp1 v16.4s, v18.4s, v19.4s scvtf v15.4s, v15.4s @@ -868,8 +856,8 @@ Tile1Dequant: // alpha * sum + (zero * sumx) + bias fmla v2.8h, v0.8h, v17.8h fmla v2.8h, v1.8h, v3.h[0] - st1 {v2.8h}, [x17], x14 - cmp x16, #1 + st1 {v2.8h}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_1 Tile1End: sub x6, x6, #1 // batch -= 1 diff --git a/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt8FP16_sdot.S b/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt8FP16_sdot.S index bfb1158a1..72fcbb719 100644 --- a/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt8FP16_sdot.S +++ b/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt8FP16_sdot.S @@ -82,9 +82,9 @@ TILE_4: blt TILE_1 mov x14, x4 // dst_step lsr x15, x4, #1 // src_step = dst_step / 2 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -94,7 +94,7 @@ LoopDz_TILE_4: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -157,8 +157,8 @@ LoopSz_TILE_4: addp v23.4s, v23.4s, v31.4s LoopSzEnd_TILE_4: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 Int32ToFloat v16, v17, v18, v19 Int32ToFloat v20, v21, v22, v23 // using float scale dequant for precison @@ -201,8 +201,8 @@ Tile4Dequant: Dequant v13, v1, v2, v3, 1 Dequant v14, v1, v2, v3, 2 Dequant v15, v1, v2, v3, 3 - st1 {v12.8h, v13.8h, v14.8h, v15.8h}, [x17], x14 - cmp x16, #1 + st1 {v12.8h, v13.8h, v14.8h, v15.8h}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_4 Tile4End: sub x6, x6, #4 // bach -= 4 @@ -217,9 +217,9 @@ TILE_1: blt End mov x14, x4 // dst_step lsr x15, x4, #1 // src_step = dst_step / 2 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -228,7 +228,7 @@ LoopDz_TILE_1: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init movi v6.4s, #0 @@ -272,8 +272,8 @@ LoopSz_TILE_1: addp v19.4s, v12.4s, v13.4s LoopSzEnd_TILE_1: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 uzp1 v15.4s, v16.4s, v17.4s uzp1 v16.4s, v18.4s, v19.4s scvtf v15.4s, v15.4s @@ -297,8 +297,8 @@ Tile1Dequant: // sum + (zero * sumx) + bias fadd v2.8h, v2.8h, v17.8h fmla v2.8h, v1.8h, v3.h[0] - st1 {v2.8h}, [x17], x14 - cmp x16, #1 + st1 {v2.8h}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_1 Tile1End: sub x6, x6, #1 // batch -= 1 diff --git a/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt8FP16_smmla.S b/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt8FP16_smmla.S index f886a0b27..5f339725c 100644 --- a/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt8FP16_smmla.S +++ b/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt8FP16_smmla.S @@ -85,9 +85,9 @@ TILE_8: //mov x14, x4 // dst_step lsr x15, x4, #1 // src_step = dst_step / 2 sub x14, x4, #64 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -97,7 +97,7 @@ LoopDz_TILE_8: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -143,8 +143,8 @@ LoopSz_TILE_8: bne LoopSz_TILE_8 LoopSzEnd_TILE_8: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 Int32ToFloat v16, v17, v18, v19 Int32ToFloat v20, v21, v22, v23 Int32ToFloat v24, v25, v26, v27 @@ -199,9 +199,9 @@ Tile8Dequant: Dequant v25, v1, v2, v3, 5 Dequant v26, v1, v2, v3, 6 Dequant v27, v1, v2, v3, 7 - st1 {v20.8h, v21.8h, v22.8h, v23.8h}, [x17], #64 - st1 {v24.8h, v25.8h, v26.8h, v27.8h}, [x17], x14 - cmp x16, #1 + st1 {v20.8h, v21.8h, v22.8h, v23.8h}, [x28], #64 + st1 {v24.8h, v25.8h, v26.8h, v27.8h}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_8 Tile8End: sub x6, x6, #8 // bach -= 8 @@ -216,9 +216,9 @@ TILE_4: blt TILE_2 mov x14, x4 // dst_step lsr x15, x4, #1 // src_step = dst_step / 2 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -228,7 +228,7 @@ LoopDz_TILE_4: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -257,8 +257,8 @@ LoopSz_TILE_4: bne LoopSz_TILE_4 LoopSzEnd_TILE_4: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 Int32ToFloat v16, v17, v18, v19 Int32ToFloat v20, v21, v22, v23 // using float scale dequant for precison @@ -290,8 +290,8 @@ Tile4Dequant: Dequant v13, v1, v2, v3, 1 Dequant v14, v1, v2, v3, 2 Dequant v15, v1, v2, v3, 3 - st1 {v12.8h, v13.8h, v14.8h, v15.8h}, [x17], x14 - cmp x16, #1 + st1 {v12.8h, v13.8h, v14.8h, v15.8h}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_4 Tile4End: sub x6, x6, #4 // bach -= 4 @@ -306,9 +306,9 @@ TILE_2: blt TILE_1 mov x14, x4 // dst_step lsr x15, x4, #1 // src_step = dst_step / 2 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -317,7 +317,7 @@ LoopDz_TILE_2: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -338,8 +338,8 @@ LoopSz_TILE_2: bne LoopSz_TILE_2 LoopSzEnd_TILE_2: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 uzp1 v13.2d, v16.2d, v17.2d uzp1 v14.2d, v18.2d, v19.2d uzp2 v15.2d, v16.2d, v17.2d @@ -364,8 +364,8 @@ Tile2Dequant: // alpha * sum + (zero * sumx) + bias Dequant v11, v1, v2, v3, 0 Dequant v12, v1, v2, v3, 1 - st1 {v11.8h, v12.8h}, [x17], x14 - cmp x16, #1 + st1 {v11.8h, v12.8h}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_2 Tile2End: sub x6, x6, #2 // batch -= 2 @@ -381,9 +381,9 @@ TILE_1: blt End mov x14, x4 // dst_step lsr x15, x4, #1 // src_step = dst_step / 2 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -392,7 +392,7 @@ LoopDz_TILE_1: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad ld1 {v29.8h}, [x20], #16 // zero ld1 {v30.8h}, [x21], #16 // bias @@ -419,8 +419,8 @@ LoopSz_TILE_1: bne LoopSz_TILE_1 LoopSzEnd_TILE_1: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 uzp1 v22.4s, v16.4s, v17.4s uzp1 v23.4s, v18.4s, v19.4s scvtf v22.4s, v22.4s @@ -441,8 +441,8 @@ LoopSzEnd_TILE_1: Tile1Dequant: // sum + (zero * sumx) + bias fadd v30.8h, v30.8h, v17.8h - st1 {v30.8h}, [x17], x14 - cmp x16, #1 + st1 {v30.8h}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_1 Tile1End: sub x6, x6, #1 // batch -= 1 @@ -456,9 +456,9 @@ TILE_EQ_1: mov x14, x4 // dst_step lsr x15, x4, #1 // src_step = dst_step / 2 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -467,7 +467,7 @@ LoopDz: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad ld1 {v29.8h}, [x20], #16 // zero ld1 {v30.8h}, [x21], #16 // bias @@ -520,8 +520,8 @@ LoopSz_1: bne LoopSz_1 LoopSzEnd: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 trn1 v26.2d, v14.2d, v15.2d trn1 v27.2d, v16.2d, v17.2d @@ -547,8 +547,8 @@ LoopSzEnd: Int8ToFP16: // sum + (zero * sumx) + bias fadd v30.8h, v30.8h, v17.8h - st1 {v30.8h}, [x17], x14 - cmp x16, #1 + st1 {v30.8h}, [x28], x14 + cmp x27, #1 bge LoopDz End: diff --git a/source/backend/arm82/asm/arm64/low_memory/MNNPackedMatMulRemainFP16_int4.S b/source/backend/arm82/asm/arm64/low_memory/MNNPackedMatMulRemainFP16_int4.S index d1f8ffb30..8431ef578 100644 --- a/source/backend/arm82/asm/arm64/low_memory/MNNPackedMatMulRemainFP16_int4.S +++ b/source/backend/arm82/asm/arm64/low_memory/MNNPackedMatMulRemainFP16_int4.S @@ -19,13 +19,14 @@ asm_function MNNPackedMatMulRemainFP16_int4 //Auto x0: C, x1:A, x2:B, x3:eSize, x4:parameter, x5:postParameters, x6:bias, x7: k, x8: b // parameter: {aStride, l, h, cStride, bExtraStride} ldr x8, [sp] // bias -stp d14, d15, [sp, #-112]! +stp d14, d15, [sp, #(-16 * 8)]! stp d12, d13, [sp, #16] stp d10, d11, [sp, #32] stp d8, d9, [sp, #48] stp x19, x20, [sp, #64] stp x21, x22, [sp, #80] stp x23, x24, [sp, #96] +stp x25, x26, [sp, #(16 * 7)] mov x22, x7 // alpha mov x23, x8 // bias @@ -58,7 +59,7 @@ LoopE8: mov x21, x0 mov x13, x2 mov x14, x22 - mov x16, x23 + mov x25, x23 LH8: cmp x8, #2 @@ -71,7 +72,7 @@ LoopE8: dup v3.16b, w17 mov w17, #8 dup v4.16b, w17 - ld1 {v14.8h, v15.8h}, [x16], #32 // bias + ld1 {v14.8h, v15.8h}, [x25], #32 // bias subs x12, x9, #2 ld1 {v0.8h}, [x13], #16 ushr v1.16b, v0.16b, #4 @@ -371,7 +372,7 @@ blt E1 mov x21, x0 mov x13, x2 mov x14, x22 - mov x16, x23 + mov x25, x23 cmp x8, #2 blt E4LH4 @@ -384,7 +385,7 @@ blt E1 dup v30.16b, w17 mov w17, #8 dup v31.16b, w17 - ld1 {v26.8h, v27.8h}, [x16], #32 // bias + ld1 {v26.8h, v27.8h}, [x25], #32 // bias subs x12, x9, #2 ld1 {v0.8h}, [x13], #16 ushr v1.16b, v0.16b, #4 @@ -567,7 +568,7 @@ blt E1 dup v30.8b, w17 mov w17, #8 dup v31.8b, w17 - ld1 {v14.8h}, [x16], #16 // bias + ld1 {v14.8h}, [x25], #16 // bias // mov v14.d[1], v14.d[0] subs x12, x9, #2 // load 16xint4 to 16xfloat @@ -679,7 +680,7 @@ LoopE1: mov x21, x0 mov x13, x2 mov x14, x22 - mov x16, x23 + mov x25, x23 cmp x8, #2 blt E1LH4 @@ -692,7 +693,7 @@ LoopE1: dup v30.16b, w17 mov w17, #8 dup v31.16b, w17 - ld1 {v26.8h, v27.8h}, [x16], #32 // bias + ld1 {v26.8h, v27.8h}, [x25], #32 // bias subs x12, x9, #2 ld1 {v0.8h}, [x13], #16 ushr v1.16b, v0.16b, #4 @@ -830,13 +831,14 @@ LoopE1: End: +ldp x25, x26, [sp, #(16 * 7)] ldp x23, x24, [sp, #96] ldp x21, x22, [sp, #80] ldp x19, x20, [sp, #64] ldp d8, d9, [sp, #48] ldp d10, d11, [sp, #32] ldp d12, d13, [sp, #16] -ldp d14, d15, [sp], #112 +ldp d14, d15, [sp], #128 ret diff --git a/source/backend/cpu/CPUUnary.cpp b/source/backend/cpu/CPUUnary.cpp index 4f3514859..f0b10f794 100644 --- a/source/backend/cpu/CPUUnary.cpp +++ b/source/backend/cpu/CPUUnary.cpp @@ -226,8 +226,8 @@ static void _SignInt8(void* out, const void* inp, int realSize, QuanPrePostParam #ifdef MNN_USE_NEON int8_t* outPtr = (int8_t*)out; int8_t* inPtr = (int8_t*)inp; - int16x8_t one = vdupq_n_s8(1); - int16x8_t negone = vdupq_n_s8(-1); + int16x8_t one = vdupq_n_s16(1); + int16x8_t negone = vdupq_n_s16(-1); int16x8_t zero = vdupq_n_s16(0); int8x8_t inZeroPoint = vdup_n_s8(params->inputZeroPoint[0]); int8x8_t outZeroPoint = vdup_n_s8(params->outputZeroPoint[0]); diff --git a/source/backend/cpu/arm/arm64/MNNGelu.S b/source/backend/cpu/arm/arm64/MNNGelu.S index 55dcae8a9..f7d7dba00 100644 --- a/source/backend/cpu/arm/arm64/MNNGelu.S +++ b/source/backend/cpu/arm/arm64/MNNGelu.S @@ -45,12 +45,15 @@ dup v10.4s, w9 // v10: [28.f]x4 dup v9.4s, w10 // v9: [3150.f]x4 dup v8.4s, w11 // v8: [62370.f]x4 -mov w4, #5.0 -mov w5, #-5.0 +mov w4, #5 +mov w5, #-5 dup v30.4s, w4 dup v31.4s, w5 +scvtf v30.4s, v30.4s +scvtf v31.4s, v31.4s + GeluZLoop: ld1 {v0.4s, v1.4s}, [x1], #32 // v0, v1: fp32x4 diff --git a/source/backend/cpu/arm/arm64/MNNGemmInt8AddBiasScale_ARMV82_Unit.S b/source/backend/cpu/arm/arm64/MNNGemmInt8AddBiasScale_ARMV82_Unit.S index 02c13110c..943e5655f 100644 --- a/source/backend/cpu/arm/arm64/MNNGemmInt8AddBiasScale_ARMV82_Unit.S +++ b/source/backend/cpu/arm/arm64/MNNGemmInt8AddBiasScale_ARMV82_Unit.S @@ -67,7 +67,7 @@ asm_function MNNGemmInt8AddBiasScale_ARMV82_Unit //Auto: x0:dst, x1:src, x2:weight, x3:src_depth_quad, x4:dst_step //x5:dst_depth_quad, x6: parameters, x7: realDstCount -//Load from x7: x8: scale, x9: bias, w12: maxValue, w13: minValue, w17: useInt8 +//Load from x7: x8: scale, x9: bias, w12: maxValue, w13: minValue, w28: useInt8 ldr x8, [x6, #0] ldr x9, [x6, #8] ldr w12, [x6, #16] @@ -79,11 +79,11 @@ stp d10, d11, [sp, #(16 * 2)] stp d8, d9, [sp, #(16 * 3)] stp x21, x22, [sp, #(16 * 4)] stp x19, x20, [sp, #(16 * 5)] -stp x17, x18, [sp, #(16 * 6)] -ldr w17, [x6, #24] // useInt8 +stp x27, x28, [sp, #(16 * 6)] +ldr w28, [x6, #24] // useInt8 mov x21, #4 // sizeof(int8_t) * UNIT -cbnz w17, Start +cbnz w28, Start mov x21, #16 // sizeof(float) * UNIT Start: lsl x15, x3, #4 // x15 = src_depth_quad * UNIT * SRC_UNIT @@ -158,7 +158,7 @@ L8LoopDz_TILE_12: MUL_SCALE v1, v20, v21, v22, v23 MUL_SCALE v1, v24, v25, v26, v27 MUL_SCALE v1, v28, v29, v30, v31 - cmp w17, #1 + cmp w28, #1 beq L8Tile12QuanUseInt8 sub x4, x4, #128 st1 {v8.4s, v9.4s, v10.4s, v11.4s}, [x0], #64 @@ -241,7 +241,7 @@ L4LoopDz_TILE_12: MUL_SCALE v0, v8, v9, v10, v11 MUL_SCALE v0, v12, v13, v14, v15 MUL_SCALE v0, v16, v17, v18, v19 - cmp w17, #1 + cmp w28, #1 beq L4Tile12QuanUseInt8 sub x4, x4, #128 st1 {v8.4s, v9.4s, v10.4s, v11.4s}, [x0], #64 @@ -326,7 +326,7 @@ L8LoopDz_TILE_8: MUL_SCALE v0, v12, v13, v14, v15 MUL_SCALE v1, v16, v17, v18, v19 MUL_SCALE v1, v20, v21, v22, v23 - cmp w17, #1 + cmp w28, #1 beq L8Tile8QuanUseInt8 sub x4, x4, #64 st1 {v8.4s, v9.4s, v10.4s, v11.4s}, [x10], #64 @@ -393,7 +393,7 @@ L4LoopDz_TILE_8: Int32ToFloat v12, v13, v14, v15 MUL_SCALE v0, v8, v9, v10, v11 MUL_SCALE v0, v12, v13, v14, v15 - cmp w17, #1 + cmp w28, #1 beq L4Tile8QuanUseInt8 sub x4, x4, #64 st1 {v8.4s, v9.4s, v10.4s, v11.4s}, [x10], #64 @@ -462,7 +462,7 @@ L8LoopDz_TILE_4: Int32ToFloat v12, v13, v14, v15 MUL_SCALE v0, v8, v9, v10, v11 MUL_SCALE v1, v12, v13, v14, v15 - cmp w17, #1 + cmp w28, #1 beq L8Tile4QuanUseInt8 st1 {v8.4s, v9.4s, v10.4s, v11.4s}, [x10], x4 st1 {v12.4s, v13.4s, v14.4s, v15.4s}, [x10], x4 @@ -508,7 +508,7 @@ L4LoopDz_TILE_4: ld1 {v0.4s}, [x19], #16 // scale Int32ToFloat v8, v9, v10, v11 MUL_SCALE v0, v8, v9, v10, v11 - cmp w17, #1 + cmp w28, #1 beq L4Tile4QuanUseInt8 st1 {v8.4s, v9.4s, v10.4s, v11.4s}, [x10], x4 b Tile4End @@ -561,7 +561,7 @@ L8LoopDz_TILE_1: scvtf v9.4s, v9.4s fmul v8.4s, v8.4s, v0.4s fmul v9.4s, v9.4s, v1.4s - cmp w17, #1 + cmp w28, #1 beq L8Tile1QuanUseInt8 st1 {v8.4s}, [x10], x4 st1 {v9.4s}, [x10], x4 @@ -601,7 +601,7 @@ L4LoopDz_TILE_1: ld1 {v0.4s}, [x19], #16 // scale scvtf v8.4s, v8.4s fmul v8.4s, v8.4s, v0.4s - cmp w17, #1 + cmp w28, #1 beq L4Tile1QuanUseInt8 st1 {v8.4s}, [x10], x4 b Tile1End @@ -621,7 +621,7 @@ Tile1End: b TILE_1 End: -ldp x17, x18, [sp, #(16 * 6)] +ldp x27, x28, [sp, #(16 * 6)] ldp x19, x20, [sp, #(16 * 5)] ldp x21, x22, [sp, #(16 * 4)] ldp d8, d9, [sp, #(16 * 3)] diff --git a/source/backend/cpu/arm/arm64/MNNGemmInt8AddBiasScale_ARMV86_Unit.S b/source/backend/cpu/arm/arm64/MNNGemmInt8AddBiasScale_ARMV86_Unit.S index 97eb1ac04..5115c41fa 100644 --- a/source/backend/cpu/arm/arm64/MNNGemmInt8AddBiasScale_ARMV86_Unit.S +++ b/source/backend/cpu/arm/arm64/MNNGemmInt8AddBiasScale_ARMV86_Unit.S @@ -73,13 +73,14 @@ ldr x9, [x6, #8] ldr w10, [x6, #16] ldr w14, [x6, #20] -stp d14, d15, [sp, #(-16 * 7)]! +stp d14, d15, [sp, #(-16 * 8)]! stp d12, d13, [sp, #(16 * 1)] stp d10, d11, [sp, #(16 * 2)] stp d8, d9, [sp, #(16 * 3)] stp x21, x22, [sp, #(16 * 4)] stp x19, x20, [sp, #(16 * 5)] stp x23, x24, [sp, #(16 * 6)] +stp x25, x26, [sp, #(16 * 7)] ldr w23, [x6, #24] mov x21, #4 // sizeof(int8_t) * UNIT @@ -227,14 +228,14 @@ TILE_16: cmp x7, #16 blt TILE_8 mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x26, x0 // dst + mov x25, x2 // weight mov x19, x8 // scale mov x20, x9 // bias LoopDz_TILE_16: // while (dz = dst_depth_quad) ld1 {v0.4s}, [x20], #16 // bias mov x11, x1 // src - mov x12, x18 // weight + mov x12, x25 // weight mov x13, x3 // src_depth_quad mov v1.16b, v0.16b uzp1 v2.2d, v0.2d, v1.2d // bias_0, bias_1, bias_0, bias_1 @@ -269,7 +270,7 @@ LoopSz_TILE_16: .inst 0x4e81a53f // smmla v31.4s, v9.16b, v1.16b bne LoopSz_TILE_16 LoopSzEnd_TILE_16: - add x18, x18, x15 // weight += dz * src_depth_quad * (GEMM_INT8_UNIT * GEMM_INT8_SRC_UNIT); + add x25, x25, x15 // weight += dz * src_depth_quad * (GEMM_INT8_UNIT * GEMM_INT8_SRC_UNIT); sub x16, x16, #1 // dz-- // transpose uzp1 v15.2d, v16.2d, v17.2d @@ -302,10 +303,10 @@ Tile16Quan: cmp w23, #1 beq Tile16QuanUseInt8 sub x4, x4, #192 - st1 {v15.4s, v16.4s, v17.4s, v18.4s}, [x17], #64 - st1 {v19.4s, v20.4s, v21.4s, v22.4s}, [x17], #64 - st1 {v23.4s, v24.4s, v25.4s, v26.4s}, [x17], #64 - st1 {v27.4s, v28.4s, v29.4s, v30.4s}, [x17], x4 + st1 {v15.4s, v16.4s, v17.4s, v18.4s}, [x26], #64 + st1 {v19.4s, v20.4s, v21.4s, v22.4s}, [x26], #64 + st1 {v23.4s, v24.4s, v25.4s, v26.4s}, [x26], #64 + st1 {v27.4s, v28.4s, v29.4s, v30.4s}, [x26], x4 add x4, x4, #192 b Tile16LoopCheck @@ -328,7 +329,7 @@ Tile16Quan: smin v17.16b, v11.16b, v17.16b smin v18.16b, v11.16b, v18.16b smin v19.16b, v11.16b, v19.16b - st1 {v16.16b, v17.16b, v18.16b, v19.16b}, [x17], x4 // dst += dz * dst_step; + st1 {v16.16b, v17.16b, v18.16b, v19.16b}, [x26], x4 // dst += dz * dst_step; Tile16LoopCheck: cmp x16, #1 bge LoopDz_TILE_16 @@ -341,14 +342,14 @@ TILE_8: cmp x7, #8 blt TILE_4 mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x26, x0 // dst + mov x25, x2 // weight mov x19, x8 // scale mov x20, x9 // bias LoopDz_TILE_8: ld1 {v0.4s}, [x20], #16 // bias mov x11, x1 // src - mov x12, x18 // weight + mov x12, x25 // weight mov x13, x3 // src_depth_quad mov v1.16b, v0.16b uzp1 v2.2d, v0.2d, v1.2d // bias_0, bias_1, bias_0, bias_1 @@ -372,7 +373,7 @@ LoopSz_TILE_8: subs x13, x13, #1 bne LoopSz_TILE_8 LoopSzEnd_TILE_8: - add x18, x18, x15 + add x25, x25, x15 sub x16, x16, #1 uzp1 v23.2d, v24.2d, v25.2d uzp2 v24.2d, v24.2d, v25.2d @@ -392,8 +393,8 @@ Tile8Quan: cmp w23, #1 beq Tile8QuanUseInt8 sub x4, x4, #64 - st1 {v23.4s, v24.4s, v25.4s, v26.4s}, [x17], #64 - st1 {v27.4s, v28.4s, v29.4s, v30.4s}, [x17], x4 + st1 {v23.4s, v24.4s, v25.4s, v26.4s}, [x26], #64 + st1 {v27.4s, v28.4s, v29.4s, v30.4s}, [x26], x4 add x4, x4, #64 b Tile8LoopCheck @@ -407,7 +408,7 @@ Tile8Quan: smax v19.16b, v10.16b, v19.16b smin v18.16b, v11.16b, v18.16b smin v19.16b, v11.16b, v19.16b - st1 {v18.16b, v19.16b}, [x17], x4 // dst += dz * dst_step + st1 {v18.16b, v19.16b}, [x26], x4 // dst += dz * dst_step Tile8LoopCheck: cmp x16, #1 bge LoopDz_TILE_8 @@ -420,14 +421,14 @@ TILE_4: cmp x7, #4 blt TILE_2 mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x26, x0 // dst + mov x25, x2 // weight mov x19, x8 // scale mov x20, x9 // bias LoopDz_TILE_4: ld1 {v0.4s}, [x20], #16 // bias mov x11, x1 // src - mov x12, x18 // weight + mov x12, x25 // weight mov x13, x3 // src_depth_quad mov v1.16b, v0.16b uzp1 v28.2d, v0.2d, v1.2d // bias_0, bias_1, bias_0, bias_1 @@ -447,7 +448,7 @@ LoopSz_TILE_4: subs x13, x13, #1 bne LoopSz_TILE_4 LoopSzEnd_TILE_4: - add x18, x18, x15 + add x25, x25, x15 sub x16, x16, #1 uzp1 v27.2d, v28.2d, v29.2d uzp2 v28.2d, v28.2d, v29.2d @@ -460,7 +461,7 @@ Tile4Quan: MUL_SCALE v0, v27, v28, v29, v30 cmp w23, #1 beq Tile4QuanUseInt8 - st1 {v27.4s, v28.4s, v29.4s, v30.4s}, [x17], x4 + st1 {v27.4s, v28.4s, v29.4s, v30.4s}, [x26], x4 b Tile4LoopCheck Tile4QuanUseInt8: @@ -469,7 +470,7 @@ Tile4Quan: Int16ToInt8_ONE v6, v7, v19 smax v19.16b, v10.16b, v19.16b smin v19.16b, v11.16b, v19.16b - st1 {v19.16b}, [x17], x4 // dst += dz * dst_step + st1 {v19.16b}, [x26], x4 // dst += dz * dst_step Tile4LoopCheck: cmp x16, #1 bge LoopDz_TILE_4 @@ -482,14 +483,14 @@ TILE_2: cmp x7, #2 blt TILE_1 mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x26, x0 // dst + mov x25, x2 // weight mov x19, x8 // scale mov x20, x9 // bias LoopDz_TILE_2: ld1 {v0.4s}, [x20], #16 // bias mov x11, x1 // src - mov x12, x18 // weight + mov x12, x25 // weight mov x13, x3 // src_depth_quad mov v1.16b, v0.16b uzp1 v30.2d, v0.2d, v1.2d // bias_0, bias_1, bias_0, bias_1 @@ -505,7 +506,7 @@ LoopSz_TILE_2: subs x13, x13, #1 bne LoopSz_TILE_2 LoopSzEnd_TILE_2: - add x18, x18, x15 + add x25, x25, x15 sub x16, x16, #1 uzp1 v29.2d, v30.2d, v31.2d uzp2 v30.2d, v30.2d, v31.2d @@ -518,7 +519,7 @@ Tile2Quan: fmul v30.4s, v30.4s, v0.4s cmp w23, #1 beq Tile2QuanUseInt8 - st1 {v29.4s, v30.4s}, [x17], x4 + st1 {v29.4s, v30.4s}, [x26], x4 b Tile2LoopCheck Tile2QuanUseInt8: fcvtas v29.4s, v29.4s @@ -528,7 +529,7 @@ Tile2Quan: sqxtn v19.8b, v6.8h smax v19.16b, v10.16b, v19.16b smin v19.16b, v11.16b, v19.16b - st1 {v19.8b}, [x17], x4 // dst += dz * dst_step + st1 {v19.8b}, [x26], x4 // dst += dz * dst_step Tile2LoopCheck: cmp x16, #1 @@ -542,14 +543,14 @@ TILE_1: cmp x7, #1 blt End mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x26, x0 // dst + mov x25, x2 // weight mov x19, x8 // scale mov x20, x9 // bias LoopDz_TILE_1: ld1 {v0.4s}, [x20], #16 // bias mov x11, x1 // src - mov x12, x18 // weight + mov x12, x25 // weight mov x13, x3 // src_depth_quad mov v1.16b, v0.16b uzp1 v30.2d, v0.2d, v1.2d // bias_0, bias_1, bias_0, bias_1 @@ -565,7 +566,7 @@ LoopSz_TILE_1: subs x13, x13, #1 bne LoopSz_TILE_1 LoopSzEnd_TILE_1: - add x18, x18, x15 + add x25, x25, x15 sub x16, x16, #1 uzp1 v29.2d, v30.2d, v31.2d uzp2 v30.2d, v30.2d, v31.2d @@ -578,7 +579,7 @@ Tile1Quan: fmul v30.4s, v30.4s, v0.4s cmp w23, #1 beq Tile1QuanUseInt8 - st1 {v29.4s, v30.4s}, [x17], x4 + st1 {v29.4s, v30.4s}, [x26], x4 b Tile1LoopEnd Tile1QuanUseInt8: fcvtas v29.4s, v29.4s @@ -588,20 +589,21 @@ Tile1Quan: sqxtn v19.8b, v6.8h smax v19.16b, v10.16b, v19.16b smin v19.16b, v11.16b, v19.16b - st1 {v19.s}[0], [x17], x4 // dst += dz * dst_step + st1 {v19.s}[0], [x26], x4 // dst += dz * dst_step Tile1LoopEnd: cmp x16, #1 bge LoopDz_TILE_1 End: +ldp x25, x26, [sp, #(16 * 7)] ldp x23, x24, [sp, #(16 * 6)] ldp x19, x20, [sp, #(16 * 5)] ldp x21, x22, [sp, #(16 * 4)] ldp d8, d9, [sp, #(16 * 3)] ldp d10, d11, [sp, #(16 * 2)] ldp d12, d13, [sp, #(16 * 1)] -ldp d14, d15, [sp], #(16 * 7) +ldp d14, d15, [sp], #(16 * 8) ret #endif // __aarch64__ diff --git a/source/backend/cpu/arm/arm64/bf16/MNNGelu_BF16.S b/source/backend/cpu/arm/arm64/bf16/MNNGelu_BF16.S index 90022da85..e1ea64b81 100644 --- a/source/backend/cpu/arm/arm64/bf16/MNNGelu_BF16.S +++ b/source/backend/cpu/arm/arm64/bf16/MNNGelu_BF16.S @@ -45,12 +45,15 @@ dup v10.4s, w9 // v10: [28.f]x4 dup v9.4s, w10 // v9: [3150.f]x4 dup v8.4s, w11 // v8: [62370.f]x4 -mov w4, #5.0 -mov w5, #-5.0 +mov w4, #5 +mov w5, #-5 dup v30.4s, w4 dup v31.4s, w5 +scvtf v30.4s, v30.4s +scvtf v31.4s, v31.4s + GeluZLoop: ld1 {v0.4h, v1.4h}, [x1], #16 // v0, v1: 4xint16_t diff --git a/source/backend/cpu/arm/arm64/low_memory/MNNAbsMaxFP32.S b/source/backend/cpu/arm/arm64/low_memory/MNNAbsMaxFP32.S index 3bf272567..59e1b8211 100644 --- a/source/backend/cpu/arm/arm64/low_memory/MNNAbsMaxFP32.S +++ b/source/backend/cpu/arm/arm64/low_memory/MNNAbsMaxFP32.S @@ -11,13 +11,6 @@ .text .align 5 -.macro Add d0, d1, d2, d3, z0, z1, z2, z3 - fadd \d0\().4s, \d0\().4s, \z0\().4s - fadd \d1\().4s, \d1\().4s, \z1\().4s - fadd \d2\().4s, \d2\().4s, \z2\().4s - fadd \d3\().4s, \d3\().4s, \z3\().4s -.endm - .macro Abs z0, z1, z2, z3 fabs \z0\().4s, \z0\().4s fabs \z1\().4s, \z1\().4s diff --git a/source/backend/cpu/arm/arm64/low_memory/MNNDynamicQuantFP32.S b/source/backend/cpu/arm/arm64/low_memory/MNNDynamicQuantFP32.S index 2bc8984f0..059951403 100644 --- a/source/backend/cpu/arm/arm64/low_memory/MNNDynamicQuantFP32.S +++ b/source/backend/cpu/arm/arm64/low_memory/MNNDynamicQuantFP32.S @@ -31,7 +31,7 @@ trn2 \z3\().2d, \t2\().2d, \t3\().2d .endm -.macro Add d0, d1, d2, d3 +.macro Add_4x4 d0, d1, d2, d3 add \d0\().4s, \d1\().4s, \d0\().4s add \d2\().4s, \d3\().4s, \d2\().4s add \d0\().4s, \d0\().4s, \d2\().4s @@ -88,7 +88,7 @@ sqxtn2 v6.16b, v5.8h st1 {v6.16b}, [x10], x6 // sum Transpose v0, v1, v2, v3, v14, v15, v16, v17 -Add v0, v1, v2, v3 +Add_4x4 v0, v1, v2, v3 add v10.4s, v0.4s, v10.4s subs x12, x12, #1 @@ -129,7 +129,7 @@ sqxtn v7.4h, v0.4s sqxtn v7.8b, v7.8h // sum -Add v0, v1, v2, v3 +Add_4x4 v0, v1, v2, v3 add v4.4s, v0.4s, v4.4s st1 {v7.s}[0], [x10], x6 diff --git a/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32.S b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32.S new file mode 100644 index 000000000..2a3b61d48 --- /dev/null +++ b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32.S @@ -0,0 +1,312 @@ +// +// MNNGemmHybridInt4_sdot.S +// MNN +// +// Created by MNN on 2023/11/09. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#ifdef __aarch64__ + +#include "MNNAsmGlobal.h" + +.text +.align 5 + +.macro Int32ToFloat z0, z1, z2, z3 + scvtf \z0\().4s, \z0\().4s + scvtf \z1\().4s, \z1\().4s + scvtf \z2\().4s, \z2\().4s + scvtf \z3\().4s, \z3\().4s +.endm + +.macro MulScale d0, d1, d2, d3, s + fmul \d0\().4s, \d0\().4s, \s\().s[0] + fmul \d1\().4s, \d1\().4s, \s\().s[1] + fmul \d2\().4s, \d2\().4s, \s\().s[2] + fmul \d3\().4s, \d3\().4s, \s\().s[3] +.endm + +.macro Dequant c0, a0, z0, b0, s0, idx + fmul \c0\().4s, \c0\().4s, \a0\().4s + fmla \c0\().4s, \z0\().4s, \s0\().s[\idx] + fadd \c0\().4s, \c0\().4s, \b0\().4s +.endm + +asm_function MNNGemmHybridInt4FP32 + +//struct QuanPostTreatParameters { +// const float* scale; +// const int32_t* bias; +// int32_t maxValue; +// int32_t minValue; +// int32_t useInt8; +//}; + +//void MNNGemmHybridInt4FP32(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, float** param); + + +// Auto: x0: C*, x1: A*, x2:B*, x3: src_depth_quad, x4: dst_step, x5: dst_depth_quad, x6: realSize, x7: param +// load from param: x7: alpha*, x8: zero*, x9: bias*, x10: sums*, x11: scales* +stp d14, d15, [sp, #(-16 * 9)]! +stp d12, d13, [sp, #(16 * 1)] +stp d10, d11, [sp, #(16 * 2)] +stp d8, d9, [sp, #(16 * 3)] +stp x21, x22, [sp, #(16 * 4)] +stp x19, x20, [sp, #(16 * 5)] +stp x23, x24, [sp, #(16 * 6)] +stp x25, x26, [sp, #(16 * 7)] +stp x27, x28, [sp, #(16 * 8)] + +ldr x8, [x7, #0] +ldr x9, [x7, #8] +ldr x10, [x7, #16] +ldr x11, [x7, #24] +ldr x12, [x7, #32] + +Start: +lsl x13, x3, #3 // x13 = src_depth_quad * UNIT * UNIT_SRC / 2(int4) = src_depth_quad * 8 = src_depth_quad << 3 + +TILE_4: + cmp x6, #4 + blt TILE_1 + mov x14, x4 // dst_step + lsr x15, x4, #2 // src_step = dst_step / 4 + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight + // dequant info + mov x19, x8 // alpha + mov x20, x9 // zero + mov x21, x10 // bias +LoopDz_TILE_4: + // dequant info for batch + mov x22, x11 // sums + mov x23, x12 // scales + mov x24, x1 // src + mov x25, x7 // weight + mov x26, x3 // src_depth_quad + // init + // batch=0,oc=0-3 + movi v10.4s, #0 //ic=0-3 + movi v11.4s, #0 + movi v12.4s, #0 + movi v13.4s, #0 + // batch=1,oc=0-3 + movi v16.4s, #0 + movi v17.4s, #0 + movi v18.4s, #0 + movi v19.4s, #0 + // batch=2,oc=0-3 + movi v20.4s, #0 + movi v21.4s, #0 + movi v22.4s, #0 + movi v23.4s, #0 + // batch=3,oc=0-3 + movi v24.4s, #0 + movi v25.4s, #0 + movi v26.4s, #0 + movi v27.4s, #0 + // mask + movi v14.16b, #15 + // offset + movi v15.16b, #8 +LoopSz_TILE_4: + // src : 4(batch) x [1 x 4] : v4 + // weight : 4(oc) x [1 x 4] : v0 + // dst : 4 x 4 x [1] : v16-v19 + ld1 {v0.8b}, [x25], #8 // weight + ld1 {v4.16b}, [x24], x15 // src + // int4->int8 + ushr v8.16b, v0.16b, #4 + and v9.16b, v0.16b, v14.16b + sub v8.16b, v8.16b, v15.16b + sub v9.16b, v9.16b, v15.16b + zip1 v0.16b, v8.16b, v9.16b + + Unit_TILE_4: + sxtl v5.8h, v4.8b // src batch=0,1 + sxtl2 v6.8h, v4.16b // batch=2,3 + sxtl v1.8h, v0.8b // weight oc=0,1 + sxtl2 v2.8h, v0.16b // oc=2,3 + dup v28.2d, v1.d[0] // oc=0,0 + dup v29.2d, v1.d[1] // oc=1,1 + dup v30.2d, v2.d[0] // oc=2,2 + dup v31.2d, v2.d[1] // oc=3,3 + // batch=0 + smlal v10.4s, v5.4h, v28.4h + smlal v11.4s, v5.4h, v29.4h + smlal v12.4s, v5.4h, v30.4h + smlal v13.4s, v5.4h, v31.4h + // batch=1 + smlal2 v16.4s, v5.8h, v28.8h + smlal2 v17.4s, v5.8h, v29.8h + smlal2 v18.4s, v5.8h, v30.8h + smlal2 v19.4s, v5.8h, v31.8h + // batch=2 + smlal v20.4s, v6.4h, v28.4h + smlal v21.4s, v6.4h, v29.4h + smlal v22.4s, v6.4h, v30.4h + smlal v23.4s, v6.4h, v31.4h + // batch=3 + smlal2 v24.4s, v6.8h, v28.8h + smlal2 v25.4s, v6.8h, v29.8h + smlal2 v26.4s, v6.8h, v30.8h + smlal2 v27.4s, v6.8h, v31.8h + // .inst 0x4f84e010 // sdot v16.4s, v0.16b, v4.4b[0] // batch0 + // .inst 0x4fa4e011 // sdot v17.4s, v0.16b, v4.4b[1] // batch1 + // .inst 0x4f84e812 // sdot v18.4s, v0.16b, v4.4b[2] // batch2 + // .inst 0x4fa4e813 // sdot v19.4s, v0.16b, v4.4b[3] // batch3 + + subs x26, x26, #1 + bne LoopSz_TILE_4 + +LoopSzEnd_TILE_4: + // add 4 ic + addp v10.4s, v10.4s, v11.4s + addp v12.4s, v12.4s, v13.4s + addp v16.4s, v16.4s, v17.4s + addp v18.4s, v18.4s, v19.4s + addp v20.4s, v20.4s, v21.4s + addp v22.4s, v22.4s, v23.4s + addp v24.4s, v24.4s, v25.4s + addp v26.4s, v26.4s, v27.4s + + addp v10.4s, v10.4s, v12.4s // batch=0,oc=0-3 + addp v11.4s, v16.4s, v18.4s + addp v12.4s, v20.4s, v22.4s + addp v13.4s, v24.4s, v26.4s + + add x7, x7, x13 + sub x27, x27, #1 + Int32ToFloat v10, v11, v12, v13 + // Int32ToFloat v20, v21, v22, v23 + // using float scale dequant for precison + ld1 {v5.4s}, [x23] // scales, 4 batch,so 4 scale + + MulScale v10, v11, v12, v13, v5 + +Tile4Dequant: + ld1 {v0.4s}, [x19], #16 // alpha + ld1 {v1.4s}, [x20], #16 // zero + ld1 {v2.4s}, [x21], #16 // bias + ld1 {v3.4s}, [x22] // sums + // alpha * sum + (zero * sums) + bias + Dequant v10, v0, v1, v2, v3, 0 + Dequant v11, v0, v1, v2, v3, 1 + Dequant v12, v0, v1, v2, v3, 2 + Dequant v13, v0, v1, v2, v3, 3 + st1 {v10.4s, v11.4s, v12.4s, v13.4s}, [x28], x14 + cmp x27, #1 + bge LoopDz_TILE_4 +Tile4End: + sub x6, x6, #4 // bach -= 4 + add x0, x0, #64 // dst += 4 * 4 * sizeof(float32_t) + add x1, x1, #16 // src += 4 * 4 * sizeof(int8_t) + add x11, x11, #16 // sum += 4 * sizeof(float32_t) + add x12, x12, #16 // scale += 4 * sizeof(float32_t) + b TILE_4 + +TILE_1: + cmp x6, #1 + blt End + mov x14, x4 // dst_step + lsr x15, x4, #2 // src_step = dst_step / 4, sizeof(float32_t)/4=sizeof(int8_t) + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight + // dequant info + mov x19, x8 // alpha + mov x20, x9 // zero + mov x21, x10 // bias +LoopDz_TILE_1: + mov x22, x11 // sums + mov x23, x12 // scales + mov x24, x1 // src + mov x25, x7 // weight + mov x26, x3 // src_depth_quad + // init + // batch=0,oc=0-3 + movi v10.4s, #0 //ic=0-3 + movi v11.4s, #0 + movi v12.4s, #0 + movi v13.4s, #0 + // mask + movi v14.16b, #15 + // offset + movi v15.16b, #8 +LoopSz_TILE_1: + // src : 1(batch) x [1 x 4] : v4 + // weight : 4(oc) x [1 x 4] : v0 + // dst : 1 x 4 x [1] : v16 + ld1 {v0.8b}, [x25], #8 // weight pack*pack*0.5 + ld1 {v4.s}[0], [x24], x15 // src + // int4->int8 + ushr v8.16b, v0.16b, #4 + and v9.16b, v0.16b, v14.16b + sub v8.16b, v8.16b, v15.16b + sub v9.16b, v9.16b, v15.16b + zip1 v0.16b, v8.16b, v9.16b + + Unit_TILE_1: + sxtl v5.8h, v4.8b // src batch=0 + sxtl v1.8h, v0.8b // weight oc=0,1 + sxtl2 v2.8h, v0.16b // oc=2,3 + dup v28.2d, v1.d[0] // oc=0,0 + dup v29.2d, v1.d[1] // oc=1,1 + dup v30.2d, v2.d[0] // oc=2,2 + dup v31.2d, v2.d[1] // oc=3,3 + // batch=0 + smlal v10.4s, v5.4h, v28.4h + smlal v11.4s, v5.4h, v29.4h + smlal v12.4s, v5.4h, v30.4h + smlal v13.4s, v5.4h, v31.4h + + //.inst 0x4f84e010 // sdot v16.4s, v0.16b, v4.4b[0] + + subs x26, x26, #1 + bne LoopSz_TILE_1 + +LoopSzEnd_TILE_1: + // add 4 ic + addp v10.4s, v10.4s, v11.4s + addp v12.4s, v12.4s, v13.4s + addp v16.4s, v10.4s, v12.4s + add x7, x7, x13 + sub x27, x27, #1 + scvtf v16.4s, v16.4s + // using float scale dequant for precison + ld1 {v4.s}[0], [x23] // scales + fmul v16.4s, v16.4s, v4.s[0] +Tile1Dequant: + ld1 {v0.4s}, [x19], #16 // alpha + ld1 {v1.4s}, [x20], #16 // zero + ld1 {v2.4s}, [x21], #16 // bias + ld1 {v3.s}[0], [x22] // sums + // alpha * sum + (zero * sumx) + bias + fmla v2.4s, v0.4s, v16.4s + fmla v2.4s, v1.4s, v3.s[0] + st1 {v2.4s}, [x28], x14 + cmp x27, #1 + bge LoopDz_TILE_1 +Tile1End: + subs x6, x6, #1 // batch -= 1 + add x0, x0, #16 // dst += 1 * 4 * sizeof(float32_t) + add x1, x1, #4 // src += 1 * 4 * sizeof(int8_t) + add x11, x11, #4 // sum += 1 * sizeof(float32_t) + add x12, x12, #4 // scale += 1 * sizeof(float32_t) + bne TILE_1 + +End: +ldp x27, x28, [sp, #(16 * 8)] +ldp x25, x26, [sp, #(16 * 7)] +ldp x23, x24, [sp, #(16 * 6)] +ldp x19, x20, [sp, #(16 * 5)] +ldp x21, x22, [sp, #(16 * 4)] +ldp d8, d9, [sp, #(16 * 3)] +ldp d10, d11, [sp, #(16 * 2)] +ldp d12, d13, [sp, #(16 * 1)] +ldp d14, d15, [sp], #(16 * 9) +ret + +#endif \ No newline at end of file diff --git a/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32_sdot.S b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32_sdot.S index edc8e4992..52b99efd8 100644 --- a/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32_sdot.S +++ b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32_sdot.S @@ -72,9 +72,9 @@ TILE_4: blt TILE_1 mov x14, x4 // dst_step lsr x15, x4, #2 // src_step = dst_step / 4 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -84,7 +84,7 @@ LoopDz_TILE_4: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -92,11 +92,9 @@ LoopDz_TILE_4: dup v18.4s, wzr dup v19.4s, wzr // mask - mov w27, #0x0f - dup v14.16b, w27 + movi v14.16b, #15 // offset - mov w27, #8 - dup v15.16b, w27 + movi v15.16b, #8 LoopSz_TILE_4: // src : 4(batch) x [1 x 4] : v4 // weight : 4(oc) x [1 x 4] : v0 @@ -117,8 +115,8 @@ LoopSz_TILE_4: bne LoopSz_TILE_4 LoopSzEnd_TILE_4: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 Int32ToFloat v16, v17, v18, v19 // Int32ToFloat v20, v21, v22, v23 // using float scale dequant for precison @@ -136,8 +134,8 @@ Tile4Dequant: Dequant v17, v0, v1, v2, v3, 1 Dequant v18, v0, v1, v2, v3, 2 Dequant v19, v0, v1, v2, v3, 3 - st1 {v16.4s, v17.4s, v18.4s, v19.4s}, [x17], x14 - cmp x16, #1 + st1 {v16.4s, v17.4s, v18.4s, v19.4s}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_4 Tile4End: sub x6, x6, #4 // bach -= 4 @@ -152,9 +150,9 @@ TILE_1: blt End mov x14, x4 // dst_step lsr x15, x4, #2 // src_step = dst_step / 4, sizeof(float32_t)/4=sizeof(int8_t) - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -163,16 +161,14 @@ LoopDz_TILE_1: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr // mask - mov w27, #0x0f - dup v14.16b, w27 + movi v14.16b, #15 // offset - mov w27, #8 - dup v15.16b, w27 + movi v15.16b, #8 LoopSz_TILE_1: // src : 1(batch) x [1 x 4] : v4 // weight : 4(oc) x [1 x 4] : v0 @@ -192,8 +188,8 @@ LoopSz_TILE_1: bne LoopSz_TILE_1 LoopSzEnd_TILE_1: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 scvtf v16.4s, v16.4s // using float scale dequant for precison ld1 {v4.s}[0], [x23] // scales @@ -206,8 +202,8 @@ Tile1Dequant: // alpha * sum + (zero * sumx) + bias fmla v2.4s, v0.4s, v16.4s fmla v2.4s, v1.4s, v3.s[0] - st1 {v2.4s}, [x17], x14 - cmp x16, #1 + st1 {v2.4s}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_1 Tile1End: subs x6, x6, #1 // batch -= 1 diff --git a/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32_smmla.S b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32_smmla.S index e7e12bff6..17a6c031f 100644 --- a/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32_smmla.S +++ b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32_smmla.S @@ -73,9 +73,9 @@ TILE_4: mov x14, x4 // dst_step lsr x15, x4, #2 // src_step = dst_step / 4 sub x14, x14, #64 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -85,7 +85,7 @@ LoopDz_TILE_4: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -97,11 +97,9 @@ LoopDz_TILE_4: dup v22.4s, wzr dup v23.4s, wzr // mask - mov w27, #0x0f - dup v10.16b, w27 + movi v10.16b, #15 // offset - mov w27, #8 - dup v11.16b, w27 + movi v11.16b, #8 LoopSz_TILE_4: // src : 2 x [2 x 8] : v4-5 // weight : 4 x [2 x 8] : v0-3 @@ -134,8 +132,8 @@ LoopSz_TILE_4: bne LoopSz_TILE_4 LoopSzEnd_TILE_4: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 trn1 v24.2d, v16.2d, v17.2d // batch:0 oc:0-3 trn1 v25.2d, v18.2d, v19.2d // batch:0 oc:4-7 @@ -165,9 +163,9 @@ Tile4Dequant: Dequant v29, v1, v3, v9, v6, 2 Dequant v30, v0, v2, v8, v6, 3 // Batch3 Dequant v31, v1, v3, v9, v6, 3 - st1 {v24.4s, v25.4s, v26.4s, v27.4s}, [x17], #64 - st1 {v28.4s, v29.4s, v30.4s, v31.4s}, [x17], x14 - cmp x16, #1 + st1 {v24.4s, v25.4s, v26.4s, v27.4s}, [x28], #64 + st1 {v28.4s, v29.4s, v30.4s, v31.4s}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_4 Tile4End: sub x6, x6, #4 // bach -= 4 @@ -182,9 +180,9 @@ TILE_2: blt TILE_1 mov x14, x4 // dst_step lsr x15, x4, #2 // src_step = dst_step / 4 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -193,7 +191,7 @@ LoopDz_TILE_2: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -201,11 +199,9 @@ LoopDz_TILE_2: dup v18.4s, wzr dup v19.4s, wzr // mask - mov w27, #0x0f - dup v14.16b, w27 + movi v14.16b, #15 // offset - mov w27, #8 - dup v15.16b, w27 + movi v15.16b, #8 LoopSz_TILE_2: // src : 1 x [2 x 8] : v4 // weight : 4 x [2 x 8] : v0-3 @@ -234,8 +230,8 @@ LoopSz_TILE_2: bne LoopSz_TILE_2 LoopSzEnd_TILE_2: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 trn1 v20.2d, v16.2d, v17.2d trn1 v21.2d, v18.2d, v19.2d trn2 v22.2d, v16.2d, v17.2d @@ -257,8 +253,8 @@ Tile2Dequant: Dequant v21, v1, v3, v9, v10, 0 Dequant v22, v0, v2, v8, v10, 1 Dequant v23, v1, v3, v9, v10, 1 - st1 {v20.4s, v21.4s, v22.4s, v23.4s}, [x17], x14 - cmp x16, #1 + st1 {v20.4s, v21.4s, v22.4s, v23.4s}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_2 Tile2End: sub x6, x6, #2 // batch -= 2 @@ -273,9 +269,9 @@ TILE_1: blt End mov x14, x4 // dst_step lsr x15, x4, #2 // src_step = dst_step / 4, sizeof(float32_t)/4=sizeof(int8_t) - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -284,7 +280,7 @@ LoopDz_TILE_1: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -292,11 +288,9 @@ LoopDz_TILE_1: dup v18.4s, wzr dup v19.4s, wzr // mask - mov w27, #0x0f - dup v14.16b, w27 + movi v14.16b, #15 // offset - mov w27, #8 - dup v15.16b, w27 + movi v15.16b, #8 LoopSz_TILE_1: // src : 1 x [1 x 8] : v4 @@ -327,8 +321,8 @@ LoopSz_TILE_1: bne LoopSz_TILE_1 LoopSzEnd_TILE_1: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 uzp1 v20.4s, v16.4s, v17.4s uzp1 v21.4s, v18.4s, v19.4s scvtf v20.4s, v20.4s @@ -347,8 +341,8 @@ Tile1Dequant: fmla v13.4s, v21.4s, v1.4s fmla v12.4s, v2.4s, v6.s[0] fmla v13.4s, v3.4s, v6.s[0] - st1 {v12.4s, v13.4s}, [x17], x14 - cmp x16, #1 + st1 {v12.4s, v13.4s}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_1 Tile1End: sub x6, x6, #1 // batch -= 1 diff --git a/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt8FP32.S b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt8FP32.S new file mode 100644 index 000000000..418638fce --- /dev/null +++ b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt8FP32.S @@ -0,0 +1,293 @@ +// +// MNNGemmHybridInt4_sdot.S +// MNN +// +// Created by MNN on 2023/11/09. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#ifdef __aarch64__ + +#include "MNNAsmGlobal.h" + +.text +.align 5 + +.macro Int32ToFloat z0, z1, z2, z3 + scvtf \z0\().4s, \z0\().4s + scvtf \z1\().4s, \z1\().4s + scvtf \z2\().4s, \z2\().4s + scvtf \z3\().4s, \z3\().4s +.endm + +.macro MulScale d0, d1, d2, d3, s + fmul \d0\().4s, \d0\().4s, \s\().s[0] + fmul \d1\().4s, \d1\().4s, \s\().s[1] + fmul \d2\().4s, \d2\().4s, \s\().s[2] + fmul \d3\().4s, \d3\().4s, \s\().s[3] +.endm + +.macro Dequant c0, a0, z0, b0, s0, idx + fmul \c0\().4s, \c0\().4s, \a0\().4s + fmla \c0\().4s, \z0\().4s, \s0\().s[\idx] + fadd \c0\().4s, \c0\().4s, \b0\().4s +.endm + +asm_function MNNGemmHybridInt8FP32 + +//struct QuanPostTreatParameters { +// const float* scale; +// const int32_t* bias; +// int32_t maxValue; +// int32_t minValue; +// int32_t useInt8; +//}; + +//void MNNGemmHybridInt8FP32(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, float** param); + + +// Auto: x0: C*, x1: A*, x2:B*, x3: src_depth_quad, x4: dst_step, x5: dst_depth_quad, x6: realSize, x7: param +// load from param: x7: alpha*, x8: zero*, x9: bias*, x10: sums*, x11: scales* +stp d14, d15, [sp, #(-16 * 9)]! +stp d12, d13, [sp, #(16 * 1)] +stp d10, d11, [sp, #(16 * 2)] +stp d8, d9, [sp, #(16 * 3)] +stp x21, x22, [sp, #(16 * 4)] +stp x19, x20, [sp, #(16 * 5)] +stp x23, x24, [sp, #(16 * 6)] +stp x25, x26, [sp, #(16 * 7)] +stp x27, x28, [sp, #(16 * 8)] + +ldr x8, [x7, #0] +ldr x9, [x7, #8] +ldr x10, [x7, #16] +ldr x11, [x7, #24] +ldr x12, [x7, #32] + +Start: +lsl x13, x3, #4 // x13 = src_depth_quad * UNIT * UNIT_SRC / 1(int8) = src_depth_quad * 16 = src_depth_quad << 4 + +TILE_4: + cmp x6, #4 + blt TILE_1 + mov x14, x4 // dst_step + lsr x15, x4, #2 // src_step = dst_step / 4 + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight + // dequant info + mov x19, x8 // alpha + mov x20, x9 // zero + mov x21, x10 // bias +LoopDz_TILE_4: + // dequant info for batch + mov x22, x11 // sums + mov x23, x12 // scales + mov x24, x1 // src + mov x25, x7 // weight + mov x26, x3 // src_depth_quad + // init + // batch=0,oc=0-3 + movi v10.4s, #0 //ic=0-3 + movi v11.4s, #0 + movi v12.4s, #0 + movi v13.4s, #0 + // batch=1,oc=0-3 + movi v16.4s, #0 + movi v17.4s, #0 + movi v18.4s, #0 + movi v19.4s, #0 + // batch=2,oc=0-3 + movi v20.4s, #0 + movi v21.4s, #0 + movi v22.4s, #0 + movi v23.4s, #0 + // batch=3,oc=0-3 + movi v24.4s, #0 + movi v25.4s, #0 + movi v26.4s, #0 + movi v27.4s, #0 + +LoopSz_TILE_4: + // src : 4(batch) x [1 x 4] : v4 + // weight : 4(oc) x [1 x 4] : v0 + ld1 {v0.16b}, [x25], #16 // weight + ld1 {v4.16b}, [x24], x15 // src + + Unit_TILE_4: + sxtl v5.8h, v4.8b // src batch=0,1 + sxtl2 v6.8h, v4.16b // batch=2,3 + sxtl v1.8h, v0.8b // weight oc=0,1 + sxtl2 v2.8h, v0.16b // oc=2,3 + dup v28.2d, v1.d[0] // oc=0,0 + dup v29.2d, v1.d[1] // oc=1,1 + dup v30.2d, v2.d[0] // oc=2,2 + dup v31.2d, v2.d[1] // oc=3,3 + // batch=0 + smlal v10.4s, v5.4h, v28.4h + smlal v11.4s, v5.4h, v29.4h + smlal v12.4s, v5.4h, v30.4h + smlal v13.4s, v5.4h, v31.4h + // batch=1 + smlal2 v16.4s, v5.8h, v28.8h + smlal2 v17.4s, v5.8h, v29.8h + smlal2 v18.4s, v5.8h, v30.8h + smlal2 v19.4s, v5.8h, v31.8h + // batch=2 + smlal v20.4s, v6.4h, v28.4h + smlal v21.4s, v6.4h, v29.4h + smlal v22.4s, v6.4h, v30.4h + smlal v23.4s, v6.4h, v31.4h + // batch=3 + smlal2 v24.4s, v6.8h, v28.8h + smlal2 v25.4s, v6.8h, v29.8h + smlal2 v26.4s, v6.8h, v30.8h + smlal2 v27.4s, v6.8h, v31.8h + // .inst 0x4f84e010 // sdot v16.4s, v0.16b, v4.4b[0] // batch0 + // .inst 0x4fa4e011 // sdot v17.4s, v0.16b, v4.4b[1] // batch1 + // .inst 0x4f84e812 // sdot v18.4s, v0.16b, v4.4b[2] // batch2 + // .inst 0x4fa4e813 // sdot v19.4s, v0.16b, v4.4b[3] // batch3 + + subs x26, x26, #1 + bne LoopSz_TILE_4 + +LoopSzEnd_TILE_4: + // add 4 ic + addp v10.4s, v10.4s, v11.4s + addp v12.4s, v12.4s, v13.4s + addp v16.4s, v16.4s, v17.4s + addp v18.4s, v18.4s, v19.4s + addp v20.4s, v20.4s, v21.4s + addp v22.4s, v22.4s, v23.4s + addp v24.4s, v24.4s, v25.4s + addp v26.4s, v26.4s, v27.4s + + addp v10.4s, v10.4s, v12.4s // batch=0,oc=0-3 + addp v11.4s, v16.4s, v18.4s + addp v12.4s, v20.4s, v22.4s + addp v13.4s, v24.4s, v26.4s + + add x7, x7, x13 + sub x27, x27, #1 + Int32ToFloat v10, v11, v12, v13 + // Int32ToFloat v20, v21, v22, v23 + // using float scale dequant for precison + ld1 {v5.4s}, [x23] // scales, 4 batch,so 4 scale + + MulScale v10, v11, v12, v13, v5 + +Tile4Dequant: + ld1 {v0.4s}, [x19], #16 // alpha + ld1 {v1.4s}, [x20], #16 // zero + ld1 {v2.4s}, [x21], #16 // bias + ld1 {v3.4s}, [x22] // sums + // alpha * sum + (zero * sums) + bias + Dequant v10, v0, v1, v2, v3, 0 + Dequant v11, v0, v1, v2, v3, 1 + Dequant v12, v0, v1, v2, v3, 2 + Dequant v13, v0, v1, v2, v3, 3 + st1 {v10.4s, v11.4s, v12.4s, v13.4s}, [x28], x14 + cmp x27, #1 + bge LoopDz_TILE_4 +Tile4End: + sub x6, x6, #4 // bach -= 4 + add x0, x0, #64 // dst += 4 * 4 * sizeof(float32_t) + add x1, x1, #16 // src += 4 * 4 * sizeof(int8_t) + add x11, x11, #16 // sum += 4 * sizeof(float32_t) + add x12, x12, #16 // scale += 4 * sizeof(float32_t) + b TILE_4 + +TILE_1: + cmp x6, #1 + blt End + mov x14, x4 // dst_step + lsr x15, x4, #2 // src_step = dst_step / 4, sizeof(float32_t)/4=sizeof(int8_t) + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight + // dequant info + mov x19, x8 // alpha + mov x20, x9 // zero + mov x21, x10 // bias +LoopDz_TILE_1: + mov x22, x11 // sums + mov x23, x12 // scales + mov x24, x1 // src + mov x25, x7 // weight + mov x26, x3 // src_depth_quad + // init + // batch=0,oc=0-3 + movi v10.4s, #0 //ic=0-3 + movi v11.4s, #0 + movi v12.4s, #0 + movi v13.4s, #0 + +LoopSz_TILE_1: + // src : 1(batch) x [1 x 4] : v4 + // weight : 4(oc) x [1 x 4] : v0 + // dst : 1 x 4 x [1] : v16 + ld1 {v0.16b}, [x25], #16 // weight pack*pack + ld1 {v4.s}[0], [x24], x15 // src + + Unit_TILE_1: + sxtl v5.8h, v4.8b // src batch=0 + sxtl v1.8h, v0.8b // weight oc=0,1 + sxtl2 v2.8h, v0.16b // oc=2,3 + dup v28.2d, v1.d[0] // oc=0,0 + dup v29.2d, v1.d[1] // oc=1,1 + dup v30.2d, v2.d[0] // oc=2,2 + dup v31.2d, v2.d[1] // oc=3,3 + // batch=0 + smlal v10.4s, v5.4h, v28.4h + smlal v11.4s, v5.4h, v29.4h + smlal v12.4s, v5.4h, v30.4h + smlal v13.4s, v5.4h, v31.4h + + //.inst 0x4f84e010 // sdot v16.4s, v0.16b, v4.4b[0] + + subs x26, x26, #1 + bne LoopSz_TILE_1 + +LoopSzEnd_TILE_1: + // add 4 ic + addp v10.4s, v10.4s, v11.4s + addp v12.4s, v12.4s, v13.4s + addp v16.4s, v10.4s, v12.4s + add x7, x7, x13 + sub x27, x27, #1 + scvtf v16.4s, v16.4s + // using float scale dequant for precison + ld1 {v4.s}[0], [x23] // scales + fmul v16.4s, v16.4s, v4.s[0] +Tile1Dequant: + ld1 {v0.4s}, [x19], #16 // alpha + ld1 {v1.4s}, [x20], #16 // zero + ld1 {v2.4s}, [x21], #16 // bias + ld1 {v3.s}[0], [x22] // sums + // alpha * sum + (zero * sumx) + bias + fmla v2.4s, v0.4s, v16.4s + fmla v2.4s, v1.4s, v3.s[0] + st1 {v2.4s}, [x28], x14 + cmp x27, #1 + bge LoopDz_TILE_1 +Tile1End: + subs x6, x6, #1 // batch -= 1 + add x0, x0, #16 // dst += 1 * 4 * sizeof(float32_t) + add x1, x1, #4 // src += 1 * 4 * sizeof(int8_t) + add x11, x11, #4 // sum += 1 * sizeof(float32_t) + add x12, x12, #4 // scale += 1 * sizeof(float32_t) + bne TILE_1 + +End: +ldp x27, x28, [sp, #(16 * 8)] +ldp x25, x26, [sp, #(16 * 7)] +ldp x23, x24, [sp, #(16 * 6)] +ldp x19, x20, [sp, #(16 * 5)] +ldp x21, x22, [sp, #(16 * 4)] +ldp d8, d9, [sp, #(16 * 3)] +ldp d10, d11, [sp, #(16 * 2)] +ldp d12, d13, [sp, #(16 * 1)] +ldp d14, d15, [sp], #(16 * 9) +ret + +#endif \ No newline at end of file diff --git a/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt8FP32_sdot.S b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt8FP32_sdot.S index 38817ad4b..18612346c 100644 --- a/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt8FP32_sdot.S +++ b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt8FP32_sdot.S @@ -72,9 +72,9 @@ TILE_4: blt TILE_1 mov x14, x4 // dst_step lsr x15, x4, #2 // src_step = dst_step / 4 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -84,7 +84,7 @@ LoopDz_TILE_4: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -106,8 +106,8 @@ LoopSz_TILE_4: bne LoopSz_TILE_4 LoopSzEnd_TILE_4: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 Int32ToFloat v16, v17, v18, v19 // Int32ToFloat v20, v21, v22, v23 // using float scale dequant for precison @@ -125,8 +125,8 @@ Tile4Dequant: Dequant v17, v0, v1, v2, v3, 1 Dequant v18, v0, v1, v2, v3, 2 Dequant v19, v0, v1, v2, v3, 3 - st1 {v16.4s, v17.4s, v18.4s, v19.4s}, [x17], x14 - cmp x16, #1 + st1 {v16.4s, v17.4s, v18.4s, v19.4s}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_4 Tile4End: sub x6, x6, #4 // bach -= 4 @@ -141,9 +141,9 @@ TILE_1: blt End mov x14, x4 // dst_step lsr x15, x4, #2 // src_step = dst_step / 4, sizeof(float32_t)/4=sizeof(int8_t) - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -152,7 +152,7 @@ LoopDz_TILE_1: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -169,8 +169,8 @@ LoopSz_TILE_1: bne LoopSz_TILE_1 LoopSzEnd_TILE_1: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 scvtf v16.4s, v16.4s // using float scale dequant for precison ld1 {v4.s}[0], [x23] // scales @@ -183,8 +183,8 @@ Tile1Dequant: // alpha * sum + (zero * sumx) + bias fmla v2.4s, v0.4s, v16.4s fmla v2.4s, v1.4s, v3.s[0] - st1 {v2.4s}, [x17], x14 - cmp x16, #1 + st1 {v2.4s}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_1 Tile1End: sub x6, x6, #1 // batch -= 1 diff --git a/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt8FP32_smmla.S b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt8FP32_smmla.S index 82a416a06..5be4586d3 100644 --- a/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt8FP32_smmla.S +++ b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt8FP32_smmla.S @@ -73,9 +73,9 @@ TILE_4: mov x14, x4 // dst_step lsr x15, x4, #2 // src_step = dst_step / 4 sub x14, x14, #64 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -85,7 +85,7 @@ LoopDz_TILE_4: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -114,8 +114,8 @@ LoopSz_TILE_4: bne LoopSz_TILE_4 LoopSzEnd_TILE_4: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 trn1 v24.2d, v16.2d, v17.2d // batch:0 oc:0-3 trn1 v25.2d, v18.2d, v19.2d // batch:0 oc:4-7 @@ -145,9 +145,9 @@ Tile4Dequant: Dequant v29, v1, v3, v9, v6, 2 Dequant v30, v0, v2, v8, v6, 3 // Batch3 Dequant v31, v1, v3, v9, v6, 3 - st1 {v24.4s, v25.4s, v26.4s, v27.4s}, [x17], #64 - st1 {v28.4s, v29.4s, v30.4s, v31.4s}, [x17], x14 - cmp x16, #1 + st1 {v24.4s, v25.4s, v26.4s, v27.4s}, [x28], #64 + st1 {v28.4s, v29.4s, v30.4s, v31.4s}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_4 Tile4End: sub x6, x6, #4 // bach -= 4 @@ -162,9 +162,9 @@ TILE_2: blt TILE_1 mov x14, x4 // dst_step lsr x15, x4, #2 // src_step = dst_step / 4 - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -173,7 +173,7 @@ LoopDz_TILE_2: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -194,8 +194,8 @@ LoopSz_TILE_2: bne LoopSz_TILE_2 LoopSzEnd_TILE_2: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 trn1 v20.2d, v16.2d, v17.2d trn1 v21.2d, v18.2d, v19.2d trn2 v22.2d, v16.2d, v17.2d @@ -217,8 +217,8 @@ Tile2Dequant: Dequant v21, v1, v3, v9, v10, 0 Dequant v22, v0, v2, v8, v10, 1 Dequant v23, v1, v3, v9, v10, 1 - st1 {v20.4s, v21.4s, v22.4s, v23.4s}, [x17], x14 - cmp x16, #1 + st1 {v20.4s, v21.4s, v22.4s, v23.4s}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_2 Tile2End: sub x6, x6, #2 // batch -= 2 @@ -234,9 +234,9 @@ TILE_1: blt End mov x14, x4 // dst_step lsr x15, x4, #2 // src_step = dst_step / 4, sizeof(float32_t)/4=sizeof(int8_t) - mov x16, x5 // dst_depth_quad - mov x17, x0 // dst - mov x18, x2 // weight + mov x27, x5 // dst_depth_quad + mov x28, x0 // dst + mov x7, x2 // weight // dequant info mov x19, x8 // alpha mov x20, x9 // zero @@ -245,7 +245,7 @@ LoopDz_TILE_1: mov x22, x11 // sums mov x23, x12 // scales mov x24, x1 // src - mov x25, x18 // weight + mov x25, x7 // weight mov x26, x3 // src_depth_quad // init dup v16.4s, wzr @@ -268,8 +268,8 @@ LoopSz_TILE_1: bne LoopSz_TILE_1 LoopSzEnd_TILE_1: - add x18, x18, x13 - sub x16, x16, #1 + add x7, x7, x13 + sub x27, x27, #1 uzp1 v20.4s, v16.4s, v17.4s uzp1 v21.4s, v18.4s, v19.4s scvtf v20.4s, v20.4s @@ -288,8 +288,8 @@ Tile1Dequant: fmla v11.4s, v21.4s, v1.4s fmla v10.4s, v2.4s, v8.s[0] fmla v11.4s, v3.4s, v8.s[0] - st1 {v10.4s, v11.4s}, [x17], x14 - cmp x16, #1 + st1 {v10.4s, v11.4s}, [x28], x14 + cmp x27, #1 bge LoopDz_TILE_1 Tile1End: sub x6, x6, #1 // batch -= 1 diff --git a/source/backend/cpu/compute/CommonOptFunction.cpp b/source/backend/cpu/compute/CommonOptFunction.cpp index ba8bb5f08..abb6523dd 100644 --- a/source/backend/cpu/compute/CommonOptFunction.cpp +++ b/source/backend/cpu/compute/CommonOptFunction.cpp @@ -35,6 +35,16 @@ void MNNInt8ToInt16(int16_t* dest, const int8_t* source, size_t count) { } #endif +#if defined(__aarch64__) +#ifdef MNN_LOW_MEMORY +extern "C" { +void MNNGemmHybridInt4FP32_smmla(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); +void MNNGemmHybridInt8FP32_smmla(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); +void MNNGemmHybridInt4FP32_sdot(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); +void MNNGemmHybridInt8FP32_sdot(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); +} +#endif +#endif template void MNNPackC4Common(T* dst, const T* src, size_t area, size_t depth, int* areaOffset) { @@ -758,7 +768,7 @@ void MNNDynamicQuantFP32(const float* src, int8_t* dst, const float* scale, floa ((int32_t*)sum)[i] = acc; } } -void MNNGemmHybridInt8FP32_smmla(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param) { +void MNNGemmHybridInt8FP32(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param) { // C:(oc/4,N,4) A:(ic/4,N,4) B:(oc/4,ic/4,4,4) int pack = 4; size_t weight_step = src_depth_quad * pack * pack; @@ -801,7 +811,7 @@ void MNNGemmHybridInt8FP32_smmla(float* C, const int8_t* A, const int8_t* B, siz } } } -void MNNGemmHybridInt4FP32_smmla(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param) { +void MNNGemmHybridInt4FP32(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param) { // C:(oc/4,N,4) A:(ic/4,N,4) B:(oc/4,ic/4,4,4) int pack = 4; size_t weight_step = src_depth_quad * pack * pack * 0.5; @@ -851,12 +861,6 @@ void MNNGemmHybridInt4FP32_smmla(float* C, const int8_t* A, const int8_t* B, siz } } } -void MNNGemmHybridInt8FP32_sdot(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param) { - MNNGemmHybridInt8FP32_smmla(C, A, B, src_depth_quad, dst_step, dst_depth_quad, realSize, param); -} -void MNNGemmHybridInt4FP32_sdot(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param) { - MNNGemmHybridInt4FP32_smmla(C, A, B, src_depth_quad, dst_step, dst_depth_quad, realSize, param); -} #endif void MNNPackC4ForMatMul_A(float* destOrigin, float const** sourceGroup, const int32_t* info, const int32_t* el) { @@ -3401,8 +3405,9 @@ void MNNCoreFunctionInit() { gCoreFunction->supportSDot = gCPUInfo.dot; gCoreFunction->supportI8mm = gCPUInfo.i8mm; #ifdef MNN_LOW_MEMORY - gCoreFunction->MNNGemmHybridInt8 = MNNGemmHybridInt8FP32_sdot; - gCoreFunction->MNNGemmHybridInt4 = MNNGemmHybridInt4FP32_sdot; + gCoreFunction->MNNGemmHybridInt8 = MNNGemmHybridInt8FP32; + gCoreFunction->MNNGemmHybridInt4 = MNNGemmHybridInt4FP32; +#if defined(__aarch64__) if (gCoreFunction->supportSDot) { gCoreFunction->MNNGemmHybridInt8 = MNNGemmHybridInt8FP32_sdot; gCoreFunction->MNNGemmHybridInt4 = MNNGemmHybridInt4FP32_sdot; @@ -3411,6 +3416,7 @@ void MNNCoreFunctionInit() { gCoreFunction->MNNGemmHybridInt8 = MNNGemmHybridInt8FP32_smmla; gCoreFunction->MNNGemmHybridInt4 = MNNGemmHybridInt4FP32_smmla; } +#endif #endif MNNCoreInt8FunctionInit(); MNNFunctionInit(); diff --git a/source/backend/cpu/compute/CommonOptFunction.h b/source/backend/cpu/compute/CommonOptFunction.h index b2474a3da..84d8c50a6 100644 --- a/source/backend/cpu/compute/CommonOptFunction.h +++ b/source/backend/cpu/compute/CommonOptFunction.h @@ -167,14 +167,8 @@ void MNNSourceTransformCommonF23(const float *source, float *dest, int unit, int void MNNConvDwF23MulTransUnit(float **cacheLine, const float *weigth, float *dest, size_t ow, const float* bias, const float* postParameter); void MNNMultiAndDestTransformCommon23(float **cacheLine, const float *weigth, float *dest, int cacheLineSize, int ow); void MNNInt8ToInt16(int16_t* dest, const int8_t* source, size_t count); -void MNNGemmHybridInt4FP32_smmla(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); -void MNNGemmHybridInt8FP32_smmla(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); -void MNNGemmHybridInt4FP32_sdot(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); -void MNNGemmHybridInt8FP32_sdot(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); -void MNNGemmHybridInt4FP16_smmla(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); -void MNNGemmHybridInt8FP16_smmla(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); -void MNNGemmHybridInt4FP16_sdot(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); -void MNNGemmHybridInt8FP16_sdot(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); +void MNNGemmHybridInt4FP32(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); +void MNNGemmHybridInt8FP32(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, const float** param); } typedef void(*MNNBinaryExecute)(void* outputRaw, const void* inputRaw0, const void* inputRaw1, int elementSize, int broadcastIndex); diff --git a/source/backend/cpu/compute/Convolution1x1Strassen.cpp b/source/backend/cpu/compute/Convolution1x1Strassen.cpp index 6e732a0b7..31f11ea24 100644 --- a/source/backend/cpu/compute/Convolution1x1Strassen.cpp +++ b/source/backend/cpu/compute/Convolution1x1Strassen.cpp @@ -34,9 +34,7 @@ Convolution1x1Strassen::Convolution1x1Strassen(const Convolution2DCommon *common return; } #ifdef MNN_LOW_MEMORY - if (originWeightSize == 0 || nullptr == originWeight) { // Use Int8 Weight. - MNN_ASSERT(nullptr != quantInfo.get()); - + if ((originWeightSize == 0 || nullptr == originWeight) && nullptr != quantInfo.get()) { // Use Int8 Weight. originWeightSize = quantInfo->weight.size(); int lSize = (int)originWeightSize / (int)biasSize * common->kernelX() * common->kernelY(); auto hU = UP_DIV(outputCount, hPack); diff --git a/source/backend/cpu/compute/ConvolutionFloatFactory.cpp b/source/backend/cpu/compute/ConvolutionFloatFactory.cpp index b494ed8fc..77abed7fb 100644 --- a/source/backend/cpu/compute/ConvolutionFloatFactory.cpp +++ b/source/backend/cpu/compute/ConvolutionFloatFactory.cpp @@ -51,8 +51,7 @@ static Execution* _createUnit(const Tensor* input, const Tensor* output, Backend && common->strideX() == 1 && common->strideY() == 1; if (lowMemory) { - if (fastWay) { - // return new DenseConvolutionTiledExecutor(common, backend, originWeight, originWeightSize, bias, biasSize, weightQuantInfo); + if (fastWay && nullptr != weightQuantInfo.get()) { return new ConvolutionHybrid(common, backend, originWeight, originWeightSize, bias, biasSize, weightQuantInfo); } else { return new DenseConvolutionTiledExecutor(common, backend, originWeight, originWeightSize, bias, biasSize, weightQuantInfo); diff --git a/source/backend/cuda/core/runtime/CUDARuntime.cpp b/source/backend/cuda/core/runtime/CUDARuntime.cpp index 76749affb..931322185 100644 --- a/source/backend/cuda/core/runtime/CUDARuntime.cpp +++ b/source/backend/cuda/core/runtime/CUDARuntime.cpp @@ -33,9 +33,11 @@ CUDARuntime::CUDARuntime(int device_id) { int version; cuda_check(cudaRuntimeGetVersion(&version)); int id = device_id; - if (id < 0) { + cuda_check(cudaGetDeviceCount(&mDeviceCount)); + if (id < 0 || id >= mDeviceCount) { cuda_check(cudaGetDevice(&id)); } + // printf("use GPU device id:%d\n", id); // id = selectDeviceMaxFreeMemory(); cuda_check(cudaSetDevice(id)); @@ -59,8 +61,6 @@ CUDARuntime::~CUDARuntime() { int CUDARuntime::selectDeviceMaxFreeMemory() { cudaDeviceProp deviceProp; - int deviceCount; - cuda_check(cudaGetDeviceCount(&deviceCount)); // Check id:0 card info int id = 0; @@ -70,7 +70,7 @@ int CUDARuntime::selectDeviceMaxFreeMemory() { cuda_check(memStatus); // printf("card:0, free:%zu, total:%zu, memStatusSuccess:%d\n", free_size_max, total_size, memStatus == cudaSuccess); - for(int i = 1; i < deviceCount; i++) { + for(int i = 1; i < mDeviceCount; i++) { cuda_check(cudaSetDevice(i)); size_t free_size; cuda_check(cudaMemGetInfo(&free_size, &total_size)); diff --git a/source/backend/cuda/core/runtime/CUDARuntime.hpp b/source/backend/cuda/core/runtime/CUDARuntime.hpp index e5c2204e2..7d83f73ad 100644 --- a/source/backend/cuda/core/runtime/CUDARuntime.hpp +++ b/source/backend/cuda/core/runtime/CUDARuntime.hpp @@ -132,6 +132,7 @@ class CUDARuntime { private: cudaDeviceProp mProp; int mDeviceId; + int mDeviceCount; bool mIsSupportedFP16 = false; bool mSupportDotInt8 = false; diff --git a/source/backend/opencl/execution/cl/grid_sample.cl b/source/backend/opencl/execution/cl/grid_sample.cl index e77dc5bd8..6a41f0050 100644 --- a/source/backend/opencl/execution/cl/grid_sample.cl +++ b/source/backend/opencl/execution/cl/grid_sample.cl @@ -169,10 +169,10 @@ __kernel void bilinear(GLOBAL_SIZE_3_DIMS __read_only image2d_t input, FLOAT4 i11 = sample(in_h1, in_w1, inp_w_offset,inp_h_offset, input, input_height, input_width, paddingMode); // bilinear interpolation - FLOAT4 value = CONVERT_FLOAT4(((float4)x_weight * CONVERT_FLOAT4(i00) + (float4)(1.0f - x_weight) * CONVERT_FLOAT4(i01)) * (float4)y_weight + - ((float4)x_weight * CONVERT_FLOAT4(i10) + (float4)(1.0f - x_weight) * CONVERT_FLOAT4(i11)) * (float4)(1.0f- y_weight)); + FLOAT4 value = CONVERT_FLOAT4(((FLOAT4)x_weight * CONVERT_FLOAT4(i00) + (FLOAT4)(1.0f - x_weight) * CONVERT_FLOAT4(i01)) * (FLOAT4)y_weight + + ((FLOAT4)x_weight * CONVERT_FLOAT4(i10) + (FLOAT4)(1.0f - x_weight) * CONVERT_FLOAT4(i11)) * (FLOAT4)(1.0f- y_weight)); const int output_w_offset = mad24(output_channel_block_idx, output_width, output_width_block_idx); const int output_h_offset = mad24(output_batch_idx, output_height, output_height_idx); WI_F(output, (int2)(output_w_offset, output_h_offset), value); -} \ No newline at end of file +} diff --git a/source/backend/opencl/execution/cl/grid_sample_buf.cl b/source/backend/opencl/execution/cl/grid_sample_buf.cl index ea4b9e75d..9d78bad19 100644 --- a/source/backend/opencl/execution/cl/grid_sample_buf.cl +++ b/source/backend/opencl/execution/cl/grid_sample_buf.cl @@ -35,7 +35,7 @@ static int CLAMP(int v, int min, int max) { FLOAT4 sample(int h, int w, const int offset_base, - __global const float *buffer, + __global const FLOAT *buffer, int height, int width, enum BorderMode paddingMode){ @@ -170,9 +170,9 @@ __kernel void bilinear_buf(GLOBAL_SIZE_3_DIMS __global const FLOAT* input, FLOAT4 i10 = sample(in_h1, in_w0, inp_offset_base, input, input_height, input_width, paddingMode); FLOAT4 i11 = sample(in_h1, in_w1, inp_offset_base, input, input_height, input_width, paddingMode); - FLOAT4 value = CONVERT_FLOAT4(((float4)x_weight * CONVERT_FLOAT4(i00) + (float4)(1.0f - x_weight) * CONVERT_FLOAT4(i01)) * (float4)y_weight + - ((float4)x_weight * CONVERT_FLOAT4(i10) + (float4)(1.0f - x_weight) * CONVERT_FLOAT4(i11)) * (float4)(1.0f- y_weight)); + FLOAT4 value = CONVERT_FLOAT4(((FLOAT4)x_weight * CONVERT_FLOAT4(i00) + (FLOAT4)(1.0f - x_weight) * CONVERT_FLOAT4(i01)) * (FLOAT4)y_weight + + ((FLOAT4)x_weight * CONVERT_FLOAT4(i10) + (FLOAT4)(1.0f - x_weight) * CONVERT_FLOAT4(i11)) * (FLOAT4)(1.0f- y_weight)); const int output_offset = ((output_batch_idx * channelBlocks + output_channel_block_idx ) * output_height + output_height_idx) * output_width + output_width_block_idx; vstore4(value, output_offset, output); -} \ No newline at end of file +} diff --git a/source/backend/opencl/execution/cl/opencl_program.cc b/source/backend/opencl/execution/cl/opencl_program.cc index fff27bded..64584877a 100644 --- a/source/backend/opencl/execution/cl/opencl_program.cc +++ b/source/backend/opencl/execution/cl/opencl_program.cc @@ -21,7 +21,7 @@ extern const std::map> OpenCLProgramMap #ifndef MNN_OPENCL_BUFFER_CLOSED { "grid_sample_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x7b,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x20,0x3d,0x20,0x30,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x3d,0x20,0x31,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0x20,0x3d,0x20,0x32,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x4d,0x49,0x4e,0x20,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x4d,0x41,0x58,0x20,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0xa,0x7d,0x3b,0xa,0xa,0x66,0x6c,0x6f,0x61,0x74,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x2c,0x20,0x69,0x6e,0x74,0x20,0x72,0x61,0x6e,0x67,0x65,0x2c,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x20,0x3d,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x20,0x3d,0x3d,0x20,0x31,0x3f,0x20,0x31,0x2e,0x30,0x66,0x20,0x3a,0x20,0x30,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x62,0x20,0x3d,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x20,0x3d,0x3d,0x20,0x31,0x3f,0x20,0x30,0x2e,0x30,0x66,0x20,0x3a,0x20,0x31,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x28,0x28,0x31,0x2e,0x30,0x66,0x20,0x2b,0x20,0x78,0x29,0x20,0x2a,0x20,0x28,0x72,0x61,0x6e,0x67,0x65,0x20,0x2d,0x20,0x61,0x29,0x20,0x2d,0x20,0x62,0x29,0x20,0x2f,0x20,0x32,0x2e,0x30,0x66,0x3b,0xa,0x7d,0xa,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x69,0x6e,0x74,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x69,0x6e,0x74,0x20,0x76,0x2c,0x20,0x69,0x6e,0x74,0x20,0x6d,0x69,0x6e,0x2c,0x20,0x69,0x6e,0x74,0x20,0x6d,0x61,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x76,0x29,0x20,0x3c,0x20,0x6d,0x69,0x6e,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x76,0x29,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x28,0x76,0x29,0x20,0x3e,0x20,0x6d,0x61,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x76,0x29,0x20,0x3d,0x20,0x6d,0x61,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x76,0x3b,0xa,0x7d,0xa,0xa,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x74,0x20,0x68,0x2c,0x20,0x69,0x6e,0x74,0x20,0x77,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x62,0x75,0x66,0x66,0x65,0x72,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x68,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x68,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x7c,0x7c,0x20,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x77,0x20,0x3e,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x20,0x3d,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x30,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x43,0x6c,0x65,0x61,0x72,0x6c,0x79,0x2c,0x20,0x43,0x4c,0x41,0x4d,0x50,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,0x72,0x69,0x67,0x68,0x74,0x20,0x77,0x61,0x79,0x20,0x74,0x6f,0x20,0x67,0x6f,0x20,0x66,0x6f,0x72,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x42,0x4f,0x52,0x44,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x46,0x6f,0x72,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0x2c,0x20,0x73,0x69,0x6e,0x63,0x65,0x20,0x77,0x65,0x20,0x68,0x61,0x76,0x65,0x20,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x65,0x64,0x20,0x74,0x68,0x65,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x69,0x6e,0x74,0x6f,0x20,0x28,0x2d,0x31,0x2c,0x20,0x31,0x29,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x74,0x68,0x65,0x20,0x6c,0x65,0x66,0x74,0x6f,0x76,0x65,0x72,0x20,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x73,0x20,0x64,0x65,0x67,0x72,0x61,0x64,0x65,0x20,0x74,0x6f,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x42,0x4f,0x52,0x44,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x20,0x3d,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x68,0x2c,0x20,0x30,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2d,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x20,0x3d,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x77,0x2c,0x20,0x30,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2d,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x68,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x65,0x61,0x72,0x65,0x73,0x74,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x67,0x72,0x69,0x64,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x72,0x69,0x64,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x6f,0x72,0x6d,0x61,0x74,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x65,0x64,0x20,0x66,0x72,0x6f,0x6d,0x20,0x6e,0x63,0x68,0x77,0x20,0x74,0x6f,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x29,0x20,0x28,0x79,0x31,0x2c,0x79,0x32,0x2c,0x79,0x33,0x2c,0x79,0x34,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x73,0x6c,0x69,0x63,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x79,0x31,0x29,0x2e,0x2e,0x2e,0x28,0x78,0x6e,0x2c,0x79,0x31,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x29,0x20,0x28,0x79,0x31,0x2c,0x79,0x32,0x2c,0x79,0x33,0x2c,0x79,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x3c,0x2d,0x3e,0x20,0x20,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x29,0x20,0x28,0x79,0x35,0x2c,0x79,0x36,0x2c,0x79,0x37,0x2c,0x79,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x79,0x6d,0x29,0x2e,0x2e,0x2e,0x28,0x78,0x6e,0x2c,0x79,0x6d,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x73,0x6c,0x69,0x63,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x29,0x20,0x28,0x79,0x35,0x2c,0x79,0x36,0x2c,0x79,0x37,0x2c,0x79,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0xa,0x20,0x20,0x20,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x6d,0x65,0x61,0x6e,0x73,0x20,0x67,0x69,0x72,0x64,0x20,0x79,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x32,0x20,0x6d,0x65,0x61,0x6e,0x73,0x20,0x67,0x72,0x69,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x6c,0x69,0x63,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x73,0x6c,0x69,0x63,0x65,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x67,0x72,0x69,0x64,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x67,0x72,0x69,0x64,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x72,0x72,0x5b,0x38,0x5d,0x20,0x3d,0x20,0x7b,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x77,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x77,0x7d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0x20,0x74,0x6f,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x78,0x2c,0x79,0x20,0x63,0x6f,0x6f,0x72,0x64,0x69,0x6e,0x61,0x74,0x65,0x20,0x72,0x61,0x6e,0x67,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x6e,0x65,0x61,0x72,0x65,0x73,0x74,0x20,0x70,0x6f,0x69,0x6e,0x74,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6e,0x77,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x2b,0x20,0x30,0x2e,0x35,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6e,0x68,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x2b,0x20,0x30,0x2e,0x35,0x66,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x6e,0x68,0x2c,0x20,0x6e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6c,0x69,0x6e,0x65,0x61,0x72,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x67,0x72,0x69,0x64,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x6d,0x65,0x61,0x6e,0x73,0x20,0x67,0x69,0x72,0x64,0x20,0x79,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x32,0x20,0x6d,0x65,0x61,0x6e,0x73,0x20,0x67,0x72,0x69,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x6c,0x69,0x63,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x73,0x6c,0x69,0x63,0x65,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x67,0x72,0x69,0x64,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x67,0x72,0x69,0x64,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x72,0x72,0x5b,0x38,0x5d,0x20,0x3d,0x20,0x7b,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x77,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x77,0x7d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0x20,0x74,0x6f,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x78,0x2c,0x79,0x20,0x63,0x6f,0x6f,0x72,0x64,0x69,0x6e,0x61,0x74,0x65,0x20,0x72,0x61,0x6e,0x67,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x20,0x3d,0x20,0x63,0x65,0x69,0x6c,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x20,0x3d,0x20,0x63,0x65,0x69,0x6c,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x20,0x2d,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x20,0x2d,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x62,0x69,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x69,0x6e,0x74,0x65,0x72,0x70,0x6f,0x6c,0x61,0x74,0x69,0x6f,0x6e,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x30,0x30,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x30,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x30,0x31,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x30,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x31,0x30,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x31,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x31,0x31,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x31,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x30,0x30,0x29,0x20,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x20,0x2d,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x30,0x31,0x29,0x29,0x20,0x2a,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x20,0x2b,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x31,0x30,0x29,0x20,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x20,0x2d,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x31,0x31,0x29,0x29,0x20,0x2a,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x2d,0x20,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x29,0x3b,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x7d, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x7b,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x20,0x3d,0x20,0x30,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x3d,0x20,0x31,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0x20,0x3d,0x20,0x32,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x4d,0x49,0x4e,0x20,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x4d,0x41,0x58,0x20,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0xa,0x7d,0x3b,0xa,0xa,0x66,0x6c,0x6f,0x61,0x74,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x2c,0x20,0x69,0x6e,0x74,0x20,0x72,0x61,0x6e,0x67,0x65,0x2c,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x20,0x3d,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x20,0x3d,0x3d,0x20,0x31,0x3f,0x20,0x31,0x2e,0x30,0x66,0x20,0x3a,0x20,0x30,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x62,0x20,0x3d,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x20,0x3d,0x3d,0x20,0x31,0x3f,0x20,0x30,0x2e,0x30,0x66,0x20,0x3a,0x20,0x31,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x28,0x28,0x31,0x2e,0x30,0x66,0x20,0x2b,0x20,0x78,0x29,0x20,0x2a,0x20,0x28,0x72,0x61,0x6e,0x67,0x65,0x20,0x2d,0x20,0x61,0x29,0x20,0x2d,0x20,0x62,0x29,0x20,0x2f,0x20,0x32,0x2e,0x30,0x66,0x3b,0xa,0x7d,0xa,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x69,0x6e,0x74,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x69,0x6e,0x74,0x20,0x76,0x2c,0x20,0x69,0x6e,0x74,0x20,0x6d,0x69,0x6e,0x2c,0x20,0x69,0x6e,0x74,0x20,0x6d,0x61,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x76,0x29,0x20,0x3c,0x20,0x6d,0x69,0x6e,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x76,0x29,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x28,0x76,0x29,0x20,0x3e,0x20,0x6d,0x61,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x76,0x29,0x20,0x3d,0x20,0x6d,0x61,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x76,0x3b,0xa,0x7d,0xa,0xa,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x74,0x20,0x68,0x2c,0x20,0x69,0x6e,0x74,0x20,0x77,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x75,0x66,0x66,0x65,0x72,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x68,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x68,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x7c,0x7c,0x20,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x77,0x20,0x3e,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x20,0x3d,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x30,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x43,0x6c,0x65,0x61,0x72,0x6c,0x79,0x2c,0x20,0x43,0x4c,0x41,0x4d,0x50,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,0x72,0x69,0x67,0x68,0x74,0x20,0x77,0x61,0x79,0x20,0x74,0x6f,0x20,0x67,0x6f,0x20,0x66,0x6f,0x72,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x42,0x4f,0x52,0x44,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x46,0x6f,0x72,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0x2c,0x20,0x73,0x69,0x6e,0x63,0x65,0x20,0x77,0x65,0x20,0x68,0x61,0x76,0x65,0x20,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x65,0x64,0x20,0x74,0x68,0x65,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x69,0x6e,0x74,0x6f,0x20,0x28,0x2d,0x31,0x2c,0x20,0x31,0x29,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x74,0x68,0x65,0x20,0x6c,0x65,0x66,0x74,0x6f,0x76,0x65,0x72,0x20,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x73,0x20,0x64,0x65,0x67,0x72,0x61,0x64,0x65,0x20,0x74,0x6f,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x42,0x4f,0x52,0x44,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x20,0x3d,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x68,0x2c,0x20,0x30,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2d,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x20,0x3d,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x77,0x2c,0x20,0x30,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2d,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x68,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x65,0x61,0x72,0x65,0x73,0x74,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x67,0x72,0x69,0x64,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x72,0x69,0x64,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x6f,0x72,0x6d,0x61,0x74,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x65,0x64,0x20,0x66,0x72,0x6f,0x6d,0x20,0x6e,0x63,0x68,0x77,0x20,0x74,0x6f,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x29,0x20,0x28,0x79,0x31,0x2c,0x79,0x32,0x2c,0x79,0x33,0x2c,0x79,0x34,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x73,0x6c,0x69,0x63,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x79,0x31,0x29,0x2e,0x2e,0x2e,0x28,0x78,0x6e,0x2c,0x79,0x31,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x29,0x20,0x28,0x79,0x31,0x2c,0x79,0x32,0x2c,0x79,0x33,0x2c,0x79,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x3c,0x2d,0x3e,0x20,0x20,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x29,0x20,0x28,0x79,0x35,0x2c,0x79,0x36,0x2c,0x79,0x37,0x2c,0x79,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x79,0x6d,0x29,0x2e,0x2e,0x2e,0x28,0x78,0x6e,0x2c,0x79,0x6d,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x73,0x6c,0x69,0x63,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x29,0x20,0x28,0x79,0x35,0x2c,0x79,0x36,0x2c,0x79,0x37,0x2c,0x79,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0xa,0x20,0x20,0x20,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x6d,0x65,0x61,0x6e,0x73,0x20,0x67,0x69,0x72,0x64,0x20,0x79,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x32,0x20,0x6d,0x65,0x61,0x6e,0x73,0x20,0x67,0x72,0x69,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x6c,0x69,0x63,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x73,0x6c,0x69,0x63,0x65,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x67,0x72,0x69,0x64,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x67,0x72,0x69,0x64,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x72,0x72,0x5b,0x38,0x5d,0x20,0x3d,0x20,0x7b,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x77,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x77,0x7d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0x20,0x74,0x6f,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x78,0x2c,0x79,0x20,0x63,0x6f,0x6f,0x72,0x64,0x69,0x6e,0x61,0x74,0x65,0x20,0x72,0x61,0x6e,0x67,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x6e,0x65,0x61,0x72,0x65,0x73,0x74,0x20,0x70,0x6f,0x69,0x6e,0x74,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6e,0x77,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x2b,0x20,0x30,0x2e,0x35,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6e,0x68,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x2b,0x20,0x30,0x2e,0x35,0x66,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x6e,0x68,0x2c,0x20,0x6e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6c,0x69,0x6e,0x65,0x61,0x72,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x67,0x72,0x69,0x64,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x6d,0x65,0x61,0x6e,0x73,0x20,0x67,0x69,0x72,0x64,0x20,0x79,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x32,0x20,0x6d,0x65,0x61,0x6e,0x73,0x20,0x67,0x72,0x69,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x6c,0x69,0x63,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x73,0x6c,0x69,0x63,0x65,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x67,0x72,0x69,0x64,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x67,0x72,0x69,0x64,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x72,0x72,0x5b,0x38,0x5d,0x20,0x3d,0x20,0x7b,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x77,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x77,0x7d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0x20,0x74,0x6f,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x78,0x2c,0x79,0x20,0x63,0x6f,0x6f,0x72,0x64,0x69,0x6e,0x61,0x74,0x65,0x20,0x72,0x61,0x6e,0x67,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x20,0x3d,0x20,0x63,0x65,0x69,0x6c,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x20,0x3d,0x20,0x63,0x65,0x69,0x6c,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x20,0x2d,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x20,0x2d,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x62,0x69,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x69,0x6e,0x74,0x65,0x72,0x70,0x6f,0x6c,0x61,0x74,0x69,0x6f,0x6e,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x30,0x30,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x30,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x30,0x31,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x30,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x31,0x30,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x31,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x31,0x31,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x31,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x30,0x30,0x29,0x20,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x20,0x2d,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x30,0x31,0x29,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x31,0x30,0x29,0x20,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x20,0x2d,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x31,0x31,0x29,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x2d,0x20,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x7d,0xa, } }, #endif { @@ -152,7 +152,7 @@ extern const std::map> OpenCLProgramMap #endif { "grid_sample", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0xa,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x7b,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x20,0x3d,0x20,0x30,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x3d,0x20,0x31,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0x20,0x3d,0x20,0x32,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x4d,0x49,0x4e,0x20,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x4d,0x41,0x58,0x20,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0xa,0x7d,0x3b,0xa,0xa,0x66,0x6c,0x6f,0x61,0x74,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x2c,0x20,0x69,0x6e,0x74,0x20,0x72,0x61,0x6e,0x67,0x65,0x2c,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x20,0x3d,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x20,0x3d,0x3d,0x20,0x31,0x3f,0x20,0x31,0x2e,0x30,0x66,0x20,0x3a,0x20,0x30,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x62,0x20,0x3d,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x20,0x3d,0x3d,0x20,0x31,0x3f,0x20,0x30,0x2e,0x30,0x66,0x20,0x3a,0x20,0x31,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x28,0x28,0x31,0x20,0x2b,0x20,0x78,0x29,0x20,0x2a,0x20,0x28,0x72,0x61,0x6e,0x67,0x65,0x20,0x2d,0x20,0x61,0x29,0x20,0x2d,0x20,0x62,0x29,0x20,0x2f,0x20,0x32,0x2e,0x30,0x66,0x3b,0xa,0x7d,0xa,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x69,0x6e,0x74,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x69,0x6e,0x74,0x20,0x76,0x2c,0x20,0x69,0x6e,0x74,0x20,0x6d,0x69,0x6e,0x2c,0x20,0x69,0x6e,0x74,0x20,0x6d,0x61,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x76,0x29,0x20,0x3c,0x20,0x6d,0x69,0x6e,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x76,0x29,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x28,0x76,0x29,0x20,0x3e,0x20,0x6d,0x61,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x76,0x29,0x20,0x3d,0x20,0x6d,0x61,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x76,0x3b,0xa,0x7d,0xa,0xa,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x74,0x20,0x68,0x2c,0x20,0x69,0x6e,0x74,0x20,0x77,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x74,0x6d,0x70,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x68,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x68,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x7c,0x7c,0x20,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x77,0x20,0x3e,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x20,0x3d,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x30,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x43,0x6c,0x65,0x61,0x72,0x6c,0x79,0x2c,0x20,0x43,0x4c,0x41,0x4d,0x50,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,0x72,0x69,0x67,0x68,0x74,0x20,0x77,0x61,0x79,0x20,0x74,0x6f,0x20,0x67,0x6f,0x20,0x66,0x6f,0x72,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x42,0x4f,0x52,0x44,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x46,0x6f,0x72,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0x2c,0x20,0x73,0x69,0x6e,0x63,0x65,0x20,0x77,0x65,0x20,0x68,0x61,0x76,0x65,0x20,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x65,0x64,0x20,0x74,0x68,0x65,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x69,0x6e,0x74,0x6f,0x20,0x28,0x2d,0x31,0x2c,0x20,0x31,0x29,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x74,0x68,0x65,0x20,0x6c,0x65,0x66,0x74,0x6f,0x76,0x65,0x72,0x20,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x73,0x20,0x64,0x65,0x67,0x72,0x61,0x64,0x65,0x20,0x74,0x6f,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x42,0x4f,0x52,0x44,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x20,0x3d,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x68,0x2c,0x20,0x30,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2d,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x20,0x3d,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x77,0x2c,0x20,0x30,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2d,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x52,0x49,0x5f,0x46,0x28,0x74,0x6d,0x70,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x77,0x2c,0x20,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x68,0x29,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x65,0x61,0x72,0x65,0x73,0x74,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x67,0x72,0x69,0x64,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x72,0x69,0x64,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x6f,0x72,0x6d,0x61,0x74,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x65,0x64,0x20,0x66,0x72,0x6f,0x6d,0x20,0x6e,0x63,0x68,0x77,0x20,0x74,0x6f,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x6c,0x69,0x63,0x65,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x6c,0x69,0x63,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x79,0x31,0x29,0x2e,0x2e,0x2e,0x28,0x78,0x6e,0x2c,0x79,0x31,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x29,0x20,0x28,0x79,0x31,0x2c,0x79,0x32,0x2c,0x79,0x33,0x2c,0x79,0x34,0x29,0x20,0x7c,0x20,0x28,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x29,0x20,0x28,0x79,0x35,0x2c,0x79,0x36,0x2c,0x79,0x37,0x2c,0x79,0x38,0x29,0x20,0x7c,0x20,0x2e,0x2e,0x2e,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x7c,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x7c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x3c,0x2d,0x3e,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x7c,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x7c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x7c,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x7c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x79,0x6d,0x29,0x2e,0x2e,0x2e,0x28,0x78,0x6e,0x2c,0x79,0x6d,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x29,0x20,0x28,0x79,0x31,0x2c,0x79,0x32,0x2c,0x79,0x33,0x2c,0x79,0x34,0x29,0x20,0x7c,0x20,0x28,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x29,0x20,0x28,0x79,0x35,0x2c,0x79,0x36,0x2c,0x79,0x37,0x2c,0x79,0x38,0x29,0x20,0x7c,0x20,0x2e,0x2e,0x2e,0xa,0x20,0x20,0x20,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x72,0x69,0x64,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x72,0x69,0x64,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x67,0x72,0x69,0x64,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x72,0x69,0x64,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x20,0x2a,0x20,0x73,0x6c,0x69,0x63,0x65,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x67,0x72,0x69,0x64,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x72,0x69,0x64,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x20,0x2b,0x20,0x32,0x20,0x2a,0x20,0x73,0x6c,0x69,0x63,0x65,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x72,0x72,0x5b,0x38,0x5d,0x20,0x3d,0x20,0x7b,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x77,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x77,0x7d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0x20,0x74,0x6f,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x63,0x6f,0x6f,0x72,0x64,0x69,0x6e,0x61,0x74,0x65,0x20,0x72,0x61,0x6e,0x67,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x6e,0x65,0x61,0x72,0x65,0x73,0x74,0x20,0x70,0x6f,0x69,0x6e,0x74,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6e,0x77,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x2b,0x20,0x30,0x2e,0x35,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6e,0x68,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x2b,0x20,0x30,0x2e,0x35,0x66,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x6e,0x68,0x2c,0x20,0x6e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x76,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6c,0x69,0x6e,0x65,0x61,0x72,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x67,0x72,0x69,0x64,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x72,0x69,0x64,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x72,0x69,0x64,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x67,0x72,0x69,0x64,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x72,0x69,0x64,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x20,0x2a,0x20,0x73,0x6c,0x69,0x63,0x65,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x67,0x72,0x69,0x64,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x72,0x69,0x64,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x20,0x2b,0x20,0x32,0x20,0x2a,0x20,0x73,0x6c,0x69,0x63,0x65,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x72,0x72,0x5b,0x38,0x5d,0x20,0x3d,0x20,0x7b,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x77,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x77,0x7d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0x20,0x74,0x6f,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x63,0x6f,0x6f,0x72,0x64,0x69,0x6e,0x61,0x74,0x65,0x20,0x72,0x61,0x6e,0x67,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x20,0x3d,0x20,0x63,0x65,0x69,0x6c,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x20,0x3d,0x20,0x63,0x65,0x69,0x6c,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x20,0x2d,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x20,0x2d,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x30,0x30,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x30,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x69,0x6e,0x70,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x30,0x31,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x30,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x69,0x6e,0x70,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x31,0x30,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x31,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x69,0x6e,0x70,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x31,0x31,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x31,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x69,0x6e,0x70,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x62,0x69,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x69,0x6e,0x74,0x65,0x72,0x70,0x6f,0x6c,0x61,0x74,0x69,0x6f,0x6e,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x30,0x30,0x29,0x20,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x20,0x2d,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x30,0x31,0x29,0x29,0x20,0x2a,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x20,0x2b,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x31,0x30,0x29,0x20,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x20,0x2d,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x31,0x31,0x29,0x29,0x20,0x2a,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x2d,0x20,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x29,0x3b,0x20,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x76,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x7d, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0xa,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x7b,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x20,0x3d,0x20,0x30,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x3d,0x20,0x31,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0x20,0x3d,0x20,0x32,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x4d,0x49,0x4e,0x20,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x4d,0x41,0x58,0x20,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0xa,0x7d,0x3b,0xa,0xa,0x66,0x6c,0x6f,0x61,0x74,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x2c,0x20,0x69,0x6e,0x74,0x20,0x72,0x61,0x6e,0x67,0x65,0x2c,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x20,0x3d,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x20,0x3d,0x3d,0x20,0x31,0x3f,0x20,0x31,0x2e,0x30,0x66,0x20,0x3a,0x20,0x30,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x62,0x20,0x3d,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x20,0x3d,0x3d,0x20,0x31,0x3f,0x20,0x30,0x2e,0x30,0x66,0x20,0x3a,0x20,0x31,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x28,0x28,0x31,0x20,0x2b,0x20,0x78,0x29,0x20,0x2a,0x20,0x28,0x72,0x61,0x6e,0x67,0x65,0x20,0x2d,0x20,0x61,0x29,0x20,0x2d,0x20,0x62,0x29,0x20,0x2f,0x20,0x32,0x2e,0x30,0x66,0x3b,0xa,0x7d,0xa,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x69,0x6e,0x74,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x69,0x6e,0x74,0x20,0x76,0x2c,0x20,0x69,0x6e,0x74,0x20,0x6d,0x69,0x6e,0x2c,0x20,0x69,0x6e,0x74,0x20,0x6d,0x61,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x76,0x29,0x20,0x3c,0x20,0x6d,0x69,0x6e,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x76,0x29,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x28,0x76,0x29,0x20,0x3e,0x20,0x6d,0x61,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x76,0x29,0x20,0x3d,0x20,0x6d,0x61,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x76,0x3b,0xa,0x7d,0xa,0xa,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x74,0x20,0x68,0x2c,0x20,0x69,0x6e,0x74,0x20,0x77,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x74,0x6d,0x70,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x68,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x68,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x7c,0x7c,0x20,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x77,0x20,0x3e,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x20,0x3d,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x30,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x43,0x6c,0x65,0x61,0x72,0x6c,0x79,0x2c,0x20,0x43,0x4c,0x41,0x4d,0x50,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,0x72,0x69,0x67,0x68,0x74,0x20,0x77,0x61,0x79,0x20,0x74,0x6f,0x20,0x67,0x6f,0x20,0x66,0x6f,0x72,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x42,0x4f,0x52,0x44,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x46,0x6f,0x72,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0x2c,0x20,0x73,0x69,0x6e,0x63,0x65,0x20,0x77,0x65,0x20,0x68,0x61,0x76,0x65,0x20,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x65,0x64,0x20,0x74,0x68,0x65,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x69,0x6e,0x74,0x6f,0x20,0x28,0x2d,0x31,0x2c,0x20,0x31,0x29,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x74,0x68,0x65,0x20,0x6c,0x65,0x66,0x74,0x6f,0x76,0x65,0x72,0x20,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x73,0x20,0x64,0x65,0x67,0x72,0x61,0x64,0x65,0x20,0x74,0x6f,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x42,0x4f,0x52,0x44,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x20,0x3d,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x68,0x2c,0x20,0x30,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2d,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x20,0x3d,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x77,0x2c,0x20,0x30,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2d,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x52,0x49,0x5f,0x46,0x28,0x74,0x6d,0x70,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x77,0x2c,0x20,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x68,0x29,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x65,0x61,0x72,0x65,0x73,0x74,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x67,0x72,0x69,0x64,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x72,0x69,0x64,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x6f,0x72,0x6d,0x61,0x74,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x65,0x64,0x20,0x66,0x72,0x6f,0x6d,0x20,0x6e,0x63,0x68,0x77,0x20,0x74,0x6f,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x6c,0x69,0x63,0x65,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x6c,0x69,0x63,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x79,0x31,0x29,0x2e,0x2e,0x2e,0x28,0x78,0x6e,0x2c,0x79,0x31,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x29,0x20,0x28,0x79,0x31,0x2c,0x79,0x32,0x2c,0x79,0x33,0x2c,0x79,0x34,0x29,0x20,0x7c,0x20,0x28,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x29,0x20,0x28,0x79,0x35,0x2c,0x79,0x36,0x2c,0x79,0x37,0x2c,0x79,0x38,0x29,0x20,0x7c,0x20,0x2e,0x2e,0x2e,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x7c,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x7c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x3c,0x2d,0x3e,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x7c,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x7c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x7c,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x7c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x79,0x6d,0x29,0x2e,0x2e,0x2e,0x28,0x78,0x6e,0x2c,0x79,0x6d,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x29,0x20,0x28,0x79,0x31,0x2c,0x79,0x32,0x2c,0x79,0x33,0x2c,0x79,0x34,0x29,0x20,0x7c,0x20,0x28,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x29,0x20,0x28,0x79,0x35,0x2c,0x79,0x36,0x2c,0x79,0x37,0x2c,0x79,0x38,0x29,0x20,0x7c,0x20,0x2e,0x2e,0x2e,0xa,0x20,0x20,0x20,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x72,0x69,0x64,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x72,0x69,0x64,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x67,0x72,0x69,0x64,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x72,0x69,0x64,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x20,0x2a,0x20,0x73,0x6c,0x69,0x63,0x65,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x67,0x72,0x69,0x64,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x72,0x69,0x64,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x20,0x2b,0x20,0x32,0x20,0x2a,0x20,0x73,0x6c,0x69,0x63,0x65,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x72,0x72,0x5b,0x38,0x5d,0x20,0x3d,0x20,0x7b,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x77,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x77,0x7d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0x20,0x74,0x6f,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x63,0x6f,0x6f,0x72,0x64,0x69,0x6e,0x61,0x74,0x65,0x20,0x72,0x61,0x6e,0x67,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x6e,0x65,0x61,0x72,0x65,0x73,0x74,0x20,0x70,0x6f,0x69,0x6e,0x74,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6e,0x77,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x2b,0x20,0x30,0x2e,0x35,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6e,0x68,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x2b,0x20,0x30,0x2e,0x35,0x66,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x6e,0x68,0x2c,0x20,0x6e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x76,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6c,0x69,0x6e,0x65,0x61,0x72,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x67,0x72,0x69,0x64,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x72,0x69,0x64,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x72,0x69,0x64,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x67,0x72,0x69,0x64,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x72,0x69,0x64,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x20,0x2a,0x20,0x73,0x6c,0x69,0x63,0x65,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x67,0x72,0x69,0x64,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x72,0x69,0x64,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x20,0x2b,0x20,0x32,0x20,0x2a,0x20,0x73,0x6c,0x69,0x63,0x65,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x72,0x72,0x5b,0x38,0x5d,0x20,0x3d,0x20,0x7b,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x77,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x77,0x7d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0x20,0x74,0x6f,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x63,0x6f,0x6f,0x72,0x64,0x69,0x6e,0x61,0x74,0x65,0x20,0x72,0x61,0x6e,0x67,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x20,0x3d,0x20,0x63,0x65,0x69,0x6c,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x20,0x3d,0x20,0x63,0x65,0x69,0x6c,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x20,0x2d,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x20,0x2d,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x30,0x30,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x30,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x69,0x6e,0x70,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x30,0x31,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x30,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x69,0x6e,0x70,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x31,0x30,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x31,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x69,0x6e,0x70,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x31,0x31,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x31,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x69,0x6e,0x70,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x62,0x69,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x69,0x6e,0x74,0x65,0x72,0x70,0x6f,0x6c,0x61,0x74,0x69,0x6f,0x6e,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x30,0x30,0x29,0x20,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x20,0x2d,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x30,0x31,0x29,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x31,0x30,0x29,0x20,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x20,0x2d,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x31,0x31,0x29,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x2d,0x20,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x76,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x7d,0xa, } }, #ifndef MNN_OPENCL_BUFFER_CLOSED { @@ -240,6 +240,10 @@ extern const std::map> OpenCLProgramMap { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x45,0x58,0x50,0x20,0x65,0x78,0x70,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x73,0x6f,0x66,0x74,0x6d,0x61,0x78,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x29,0x20,0x7b,0x2f,0x2f,0x4e,0x43,0x48,0x57,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x68,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x77,0x2c,0x20,0x62,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x68,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x68,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x30,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2b,0x77,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x20,0x3e,0x3d,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x79,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x20,0x2d,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x79,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x20,0x2d,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x73,0x6f,0x66,0x74,0x6d,0x61,0x78,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x20,0x2f,0x2f,0x20,0x4e,0x43,0x48,0x57,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x63,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x77,0x63,0x2c,0x20,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x77,0x63,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x20,0x3d,0x20,0x77,0x63,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x63,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x30,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2b,0x77,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x20,0x3e,0x3d,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x4d,0x61,0x78,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x45,0x78,0x70,0x20,0x53,0x75,0x6d,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x52,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x4d,0x61,0x78,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x45,0x78,0x70,0x20,0x53,0x75,0x6d,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x52,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x73,0x6f,0x66,0x74,0x6d,0x61,0x78,0x5f,0x77,0x69,0x64,0x74,0x68,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x20,0x2f,0x2f,0x20,0x4e,0x43,0x48,0x57,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x68,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x63,0x2c,0x20,0x62,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x62,0x68,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x20,0x3d,0x20,0x62,0x68,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x63,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x68,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2b,0x30,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x20,0x3e,0x3d,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x4d,0x61,0x78,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x45,0x78,0x70,0x20,0x53,0x75,0x6d,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x52,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x4d,0x61,0x78,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x45,0x78,0x70,0x20,0x53,0x75,0x6d,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x52,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa, } }, #endif +{ + "convert_int8", + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x67,0x65,0x6c,0x75,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x30,0x2e,0x37,0x39,0x37,0x38,0x38,0x34,0x35,0x38,0x66,0x20,0x2a,0x20,0x28,0x30,0x2e,0x30,0x34,0x34,0x37,0x31,0x35,0x66,0x20,0x2a,0x20,0x69,0x6e,0x20,0x2a,0x20,0x69,0x6e,0x20,0x2a,0x20,0x69,0x6e,0x20,0x2b,0x20,0x69,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x78,0x32,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3e,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x35,0x2e,0x30,0x66,0x20,0x3f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x31,0x2e,0x30,0x66,0x20,0x3a,0x20,0x28,0x76,0x61,0x6c,0x75,0x65,0x20,0x3c,0x3d,0x20,0x2d,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x35,0x2e,0x30,0x66,0x20,0x3f,0x20,0x2d,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x31,0x2e,0x30,0x66,0x20,0x3a,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x76,0x61,0x6c,0x75,0x65,0x20,0x2a,0x20,0x28,0x31,0x33,0x35,0x31,0x33,0x35,0x2e,0x30,0x66,0x20,0x2b,0x20,0x78,0x32,0x20,0x2a,0x20,0x28,0x31,0x37,0x33,0x32,0x35,0x2e,0x30,0x66,0x20,0x2b,0x20,0x78,0x32,0x20,0x2a,0x20,0x28,0x33,0x37,0x38,0x2e,0x30,0x66,0x20,0x2b,0x20,0x78,0x32,0x29,0x29,0x29,0x29,0x20,0x2f,0x20,0x28,0x31,0x33,0x35,0x31,0x33,0x35,0x2e,0x30,0x66,0x20,0x2b,0x20,0x78,0x32,0x20,0x2a,0x20,0x28,0x36,0x32,0x33,0x37,0x30,0x2e,0x30,0x66,0x20,0x2b,0x20,0x78,0x32,0x20,0x2a,0x20,0x28,0x33,0x31,0x35,0x30,0x2e,0x30,0x66,0x20,0x2b,0x20,0x78,0x32,0x20,0x2a,0x20,0x32,0x38,0x2e,0x30,0x66,0x29,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x28,0x31,0x2e,0x30,0x66,0x20,0x2b,0x20,0x64,0x73,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x20,0x2a,0x20,0x30,0x2e,0x35,0x66,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x66,0x6c,0x6f,0x61,0x74,0x5f,0x32,0x5f,0x69,0x6e,0x74,0x38,0x5f,0x73,0x69,0x6e,0x67,0x6c,0x65,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73,0x63,0x61,0x6c,0x65,0x44,0x61,0x74,0x61,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x7a,0x65,0x72,0x6f,0x50,0x6f,0x69,0x6e,0x74,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x63,0x6c,0x61,0x6d,0x70,0x4d,0x61,0x78,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x63,0x6c,0x61,0x6d,0x70,0x4d,0x69,0x6e,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x62,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x77,0x2c,0x20,0x68,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x70,0x6f,0x73,0x2c,0x20,0x68,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x28,0x69,0x6e,0x20,0x2a,0x20,0x73,0x63,0x61,0x6c,0x65,0x44,0x61,0x74,0x61,0x29,0x20,0x2b,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x7a,0x65,0x72,0x6f,0x50,0x6f,0x69,0x6e,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6f,0x75,0x74,0x2c,0x20,0x63,0x6c,0x61,0x6d,0x70,0x4d,0x61,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x63,0x6c,0x61,0x6d,0x70,0x4d,0x69,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x70,0x6f,0x73,0x2c,0x20,0x68,0x62,0x29,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x7d,0xa, } + }, #ifndef MNN_OPENCL_BUFFER_CLOSED #ifdef MNN_SUPPORT_INTEL_SUBGROUP { diff --git a/tools/converter/source/common/writeFb.cpp b/tools/converter/source/common/writeFb.cpp index c34cdf276..c4cc32f14 100644 --- a/tools/converter/source/common/writeFb.cpp +++ b/tools/converter/source/common/writeFb.cpp @@ -20,7 +20,7 @@ #include "cpp/ConfigFile.hpp" #include #include "cli.hpp" -#include "commonKit.hpp"" +#include "commonKit.hpp" #include "MNN_compression.pb.h" using namespace MNN;